質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

1067閲覧

csvファイルに書き込めません

K.M.PEANUTS

総合スコア40

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2021/11/16 02:54

編集2021/11/16 03:16

java

1import java.io.*; 2import java.util.*; 3import java.util.regex.*; 4 5public class Jfile { 6 //javaファイルを保存する 7 private File jfile; 8 9 //getStringメソッドに使用 10 //条件に合う文を格納するリスト 11 public ArrayList<String> list = new ArrayList<>(); 12 13 Jfile(File f) { 14 this.jfile = f; 15 } 16 17 //ファイル名を返す関数 18 public String getName() { 19 return this.jfile.getName(); 20 } 21 22 //パスを返す関数 23 public String getPath() { 24 return this.jfile.getAbsolutePath(); 25 } 26 27 //ファイルの行数を返す関数 28 public int getLineCount() { 29 int count = 0; //行数を数えるための変数 30 try { 31 //ファイルの中身を読み込む 32 FileReader fr = new FileReader(this.jfile); 33 BufferedReader br = new BufferedReader(fr); 34 35 while(br.readLine() != null) { 36 count++; 37 } 38 39 br.close(); 40 fr.close(); 41 } catch(IOException e) { 42 System.out.println(e); 43 } 44 return count; 45 } 46 47 //ファイルのクラス、パッケージ、importを返す関数 48 public String getString(String search_str) { 49 try { 50 //ファイルの中身を読み込む 51 FileReader fr = new FileReader(this.jfile); 52 BufferedReader br = new BufferedReader(fr); 53 54 //条件に合う行をリストに格納 55 String line; 56 while((line = br.readLine()) != null) { 57 Pattern p = Pattern.compile(search_str); 58 Matcher m = p.matcher(line); 59 60 if(m.find()) { 61 list.add(line); 62 } 63 } 64 65 br.close(); 66 fr.close(); 67 } catch(IOException ex) { 68 ex.printStackTrace(); 69 } 70 71 //リストの中身を一つの文にする。 72 String rt_line = ""; 73 74 while(list.size() != 0) { 75 rt_line += list.get(0) + " 、"; 76 list.remove(0); 77 } 78 79 return rt_line; 80 } 81}

java

1import java.io.*; 2import java.util.*; 3public class Main { 4 private static final String FILENAME = "file2.csv"; 5 6 public static void main(String[] args) { 7 8 //Javaファイルを保存するクラス 9 ArrayList<Jfile> javalist = new ArrayList<Jfile>(); 10 //中を探索するためのディレクトリを保存するリスト 11 ArrayList<File> ser_dir = new ArrayList<File>(); 12 13 //最初のディレクトリをinputに代入 14 Scanner s = new Scanner(System.in); 15 System.out.print("ディレクトリ名 → "); 16 String input = s.nextLine(); 17 18 s.close(); 19 20 File dir = new File(input); 21 ser_dir.add(dir); 22 23 while(ser_dir != null) { 24 File[] dirFilelist = ser_dir.get(0).listFiles(); 25 for(int i=0; i<dirFilelist.length; i++) { 26 String extension = ""; 27 String fileName = dirFilelist[i].getName(); 28 29 //ファイルがディレクトリなら中身を探索 30 if(dirFilelist[i].isDirectory()) { 31 ser_dir.add(new File(dirFilelist[i].getPath())); 32 33 } else if (fileName.endsWith(".java")) { //ファイル拡張子が.javaならjavalistに追加 34 javalist.add(new Jfile(dirFilelist[i])); 35 } 36 } 37 ser_dir.remove(0); 38 } 39 40 41 //csvファイルに書き込む 42 int listsize = javalist.size(); //javalist.の要素数を格納する変数 43 44 System.out.println(listsize); //リストのサイズを確認するため画面表示 45 46 try(PrintWriter w = new PrintWriter(new BufferedWriter(new FileWriter(FILENAME)))){ 47 for(int i=0 ; i < listsize; i++){ 48 w.println(javalist.get(i).getPath() + "," + 49 javalist.get(i).getName() + "," + 50 javalist.get(i).getLineCount() + "," + 51 javalist.get(i).getString("class") + "," + 52 javalist.get(i).getString("package") + "," + 53 javalist.get(i).getString("import") 54 ); 55 } 56 }catch(IOException e){ 57 System.out.println(e); 58 } 59 } 60}

解決したい問題

上記のコードをコンパイル・実行してもエラーは何も表示されません。しかし、Mainクラスの最後でcsvファイルに書き込みを行っているはずなのに、何も書き込まれません。改善点を教えてください。
*ディレクトリ名にはディレクトリ1を入れており、ディレクトリ1は実行を行っている階にあります。中にはjavaファイルやtxtファイル、ディレクトリが入っています。

試したこと

csvファイルに何も書かれていないことから、javalist要素が追加されていないことを疑い、javalistに追加するコードが書かれている付近で細かい変更を行ったが、うまくいかなかった。
また、csvファイルへの書き込みをする直前にSystem.out.println(listsize);の一文を追加してjavalistの要素数を確認しようとしたところ以下のエラーが出ました。

txt

1Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 0 out of bounds for length 0 2 at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64) 3 at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70) 4 at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248) 5 at java.base/java.util.Objects.checkIndex(Objects.java:359) 6 at java.base/java.util.ArrayList.get(ArrayList.java:427) 7 at Main.main(Main.java:24)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

java

1id = fileName.lastIndexOf("."); 2if(id != -1) { 3 extension = fileName.substring(id + 1); 4}

この処理ですが、たとえばfileNameMain.javaだった場合、変数extensionには"java"という文字列が代入されます。

したがってextension".java"という文字列という一致するかという比較はfalseとなり、このブロックに入ることはありません。

java

1} else if (extension == ".java") { //ファイル拡張子が.javaならjavalistに追加 2 javalist.add(new Jfile(dirFilelist[i])); 3}

よってwhile節が終わってもjavalistが空のままであり、csvに書き出されないのかと思います。

なおJavaにおいて同じ文字列であるかを比較する場合は==ではなくequalsを利用する必要があります。

参考: 文字列と文字列を比較する

投稿2021/11/16 03:15

neko_the_shadow

総合スコア2225

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

K.M.PEANUTS

2021/11/16 03:25

substring、equalsのご説明ありがとうございます。 ご指摘通り以下のように変更を行ってみたのですが、同じ内容のエラーが出てしまいました。 さらに間違いがある場合はお手数ながら再度ご指摘もらえると嬉しいです。 id = fileName.lastIndexOf("."); if(id != -1) { extension = fileName.substring(id + 1); } //ファイルがディレクトリなら中身を探索 if(dirFilelist[i].isDirectory()) { ser_dir.add(new File(dirFilelist[i].getPath())); } else if (extension.equals("java")) { //ファイル拡張子が.javaならjavalistに追加 javalist.add(new Jfile(dirFilelist[i])); }
guest

0

ベストアンサー

java

1 id = fileName.lastIndexOf("."); 2 if(id != -1) { 3 extension = fileName.substring(id + 1);

fileName"Foo.java" だとすると、id + 1. の次なので extension"java" になります。

java

1 } else if (extension == ".java") { //ファイル拡張子が.javaならjavalistに追加

. がいらないのと、Javaの文字列比較は == ではダメ(詳しくは検索してみてください)なので、javalist.add() が実行されることはありません。

java

1} else if (fileName.endsWith(".java")) {

でよいのではないでしょうか。


追記:

java

1 while(ser_dir != null) {

ser_dirnull を代入するコードはないので、この条件は常に真です。条件は「ser_dir が空ではないなら」のはずで、while (!ser_dir.isEmpty()) { でしょう。

投稿2021/11/16 03:05

編集2021/11/16 03:47
int32_t

総合スコア20659

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

K.M.PEANUTS

2021/11/16 03:27

endsWithというメソッドがあることを初めて知りました。丁寧なご指摘ありがとうございます。 こちらのメソッドを使って質問文に修正した通り書き直したのですが、同じエラーが出てしまいました。 理由がわかりましたら再度ご指摘いただけると幸いです。
int32_t

2021/11/16 03:47

IndexOutOfBoundsException の方に関して追記しました。
K.M.PEANUTS

2021/11/16 04:55

removeして空になってもnullにならないのですね! 全て解決しましたありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問