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)
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/11/16 03:25