コードimport java.io.File; import java.io.IOException; import java.io.BufferedWriter; import java.io.PrintWriter; import java.io.FileWriter; import java.io.FileReader; import java.io.BufferedReader; import java.util.Scanner; import java.io.FileNotFoundException; public class Show{ public void act(File[] findList){ //インスタンスメソッド try{ FileWriter fw = inPutName(); // FileWriter fw = new FileWriter(fileOut, true);//true追記 false前のを消して上書き PrintWriter pw = new PrintWriter(new BufferedWriter(fw)); for(int i=0;i<findList.length;i++){ //ファイルの絶対パスの取得 pw.println("絶対パス:" + findList[i].getAbsolutePath()); //ファイル名の取得 pw.println("ファイル名:" + findList[i].getName()); //ファイルの行数の取得 BufferedReader br = new BufferedReader(new FileReader(findList[i])); int nLine =0; while(br.ready()){ String line = br.readLine(); nLine++; } pw.println("行数:"+nLine); // ファイルに含まれるクラス名 String getClassName = findList[i].getClass().getSimpleName(); // pw.println(getClassName); //ファイルに含まれるパッケージ宣言を取得 // pw.println(クラス名.class.getPackageName()); //ファイルに含まれる import クラス名 } pw.close(); }catch(FileNotFoundException e){ System.out.println(e); }catch(IOException e){ System.out.println(e); } } public static FileWriter inPutName(){ //クラスメソッド try{ System.out.print("出力ファイル名を入力:"); Scanner input = new Scanner(System.in); String output = input.nextLine(); File fileOut= new File(output+".txt"); if(fileOut.exists()){ System.out.println(output+".txtはすでに存在しています.以下から操作を選んでください"); System.out.println("1:追記する 2:名前を変える 3:前のデータを消去して上書きする"); int judge = new Scanner(System.in).nextInt(); switch (judge) { case 1: return new FileWriter(fileOut, true);//true追記 false前のを消して上書き case 2: inPutName(); //break; case 3: return new FileWriter(fileOut, false);//true追記 false前のを消して上書き } }else{ System.out.println("ファイルが存在しないので新しく作成しました."); fileOut.createNewFile(); return new FileWriter(fileOut, true);//true追記 false前のを消して上書き } }catch(IOException e){ System.out.println(e); } } } import java.io.File; import java.util.Scanner; class FileSearch{ public static void main(String[] args){ System.out.println("一覧を生成するディレクトリ名:"); Scanner scan = new Scanner(System.in); String str = scan.next(); //探すディレクトリ File file = new File("/home"); if(!file.exists()){ System.out.println("ディレクトリが存在しません."); System.exit(1); } SearchAlgorithm sa = new SearchAlgorithm(); sa.Search(file,str); } } import java.util.LinkedList; import java.io.File; import java.io.FilenameFilter; public class SearchAlgorithm{ public void Search(File file,String str){ LinkedList<File> que = new LinkedList<File>(); que.offer(file); while(que.size() != 0){//Queのサイズが0出ない(空っぽでない)ならープ File dir = que.poll(); File[] dirList = dir.listFiles(); for(int i=0;i<dirList.length;i++){ if(dirList[i].isDirectory()){//ディレクトリか String dirName = dirList[i].getName(); if(!dirName.equals(str)){//名前が一致しない que.offer(dirList[i]); }else{ //名前が一致 //取り出すディレクトリの処理 que.clear();//Que を空っぽにする que.offerFirst(dirList[i]);//見つけたディレクトリをQueに入れる File finding = que.poll();//Queから取り出し,sizeが0になる(空っぽになる)->while文を抜けられる File[] findList = finding.listFiles(new FileFilter()); Show s = new Show(); s.act(findList); } } } } } } import java.io.File; import java.io.FilenameFilter; class FileFilter implements FilenameFilter{ public boolean accept(File dir, String name) { if(name.endsWith("java")){ return true; }else{ return false; } } } ```指定したディレクトリに存在するjavaファイルをlistFiles(new Filefilter())で抜き出し,引っかかった全てのファイルのクラス名を取得したいです。調べてみると実行中のクラス名の取得方法は分かったのですが実行中でないファイルのクラス名の取得方法がわかりません。
で、そこまでやったソースはどこですか?
正確な把握にはまずコンパイルが必要になります。
こちらをどうぞ↓
https://commons.apache.org/proper/commons-bcel/index.html
コードが長いのでとりあえずという形で4つに分けました.
指定したディレクトリを幅探索で探していき一致したら
そのディレクトリ内にあるjavaファイルの情報を一覧にして取り出します
またshowクラスをコンパイルするとreturn 文が指定されていません。と出力されます
どこが条件を網羅していないのかがわかりません
特別どうしても分からないところがないのであれば、バグ取りは自分でしましょう。
上のURLはクラスファイルを解析するライブラリなので、上のようなコードで足りる要件には必要ないです。
私はこの辺で失礼します。
質問者さんが指定されたテキストの*.javaファイルを読んで、そのファイルのクラス名は何かと考えるとき、どこを見ますか?それをそのままプログラムに書けば良いです。
↑そのとおり。<クラス>.javaなので、クラス名は<クラス>です(パッケージ名は抜き)。
ただし、publicでないクラス、インナークラス、ローカルクラスなどが含まれるかもしれない。要件は?
実行中のクラス名のところは、classファイルがクラスパスに含まれていてロードできるからだけど、... 変でしょ。
回答2件
あなたの回答
tips
プレビュー