前提・実現したいこと
ディレクトリの中身を探索するメソッドで実行した結果をファイルに入力したいのですがうまく作動しませんでした。
この時入力されたファイル(下のコードではoutputFile)の拡張子をファイル名ではなくコードの書き方で指定することは出来るのでしょうか。
下のコードは入力したい結果を表示するコードです。
(追記)
試したことにうまく作動しなかったコードを載せました。
該当のソースコード
java
1import java.io.*; 2import java.util.Scanner; 3 4public class Search{ 5 6 static int max = 0; 7 static int now = -1; 8 static File[] tmp = new File[100]; 9 public static void main(String[] args){ 10 Scanner scan = new Scanner(System.in); 11 System.out.println("一覧を取得するディレクトリ名を入力してください。"); 12 String searchFile = scan.nextLine(); 13 14 /* System.out.println("出力ファイル名を入力してください。"); 15 String outputFile = scan.nextLine(); */ 16 17 dumpFile(new File(searchFile)); 18 } 19 20 //検索し結果を表示 21 private static void dumpFile(File file){ 22 23 // ファイル一覧取得 24 File[] files = file.listFiles(); 25 26 System.out.println("Directory: " + file.getName()); 27 28 //ディレクトリが空か判定 29 if(files.length == 0){ 30 System.out.println("空です"); 31 } 32 33 //ディレクトリだった場合tmpに保存 34 for (File tmpFile : files) { 35 // ディレクトリの場合 36 if(tmpFile.isDirectory()){ 37 tmp[max] = tmpFile; 38 //入手出来てるかの確認 39 System.out.println(tmpFile.getName() + "はディレクトリです。"); 40 max++; 41 42 // ファイルの場合 43 }else{ 44 System.out.println(tmpFile.getName() + "はファイルです。"); 45 } 46 } 47 48 //見やすさのため 49 System.out.println(""); 50 51 //再帰 52 while(now != max-1){ 53 now++; 54 dumpFile(tmp[now]); 55 56 } 57 } 58} 59
###書き込みたい実行した結果
一覧を取得するディレクトリ名を入力してください test Directory: test D1はディレクトリです。 D2はディレクトリです。 F1.txtはファイルです。 Directory: D1 D3はディレクトリです。 Directory: D2 D4はディレクトリです。 F2.txtはファイルです。 Directory: D3 空です Directory: D4 F3.txtはファイルです。
試したこと
filewriterでは ("Directory: " + file.getName()) ような""と変数の組み合わせを出力することがうまく出来なかったのでPrintwriteに書き換え実行した結果下ではなく上に追加されてしまった。
import java.io.*; import java.util.Scanner; import java.io.FileWriter; import java.io.File; import java.io.PrintWriter; import java.io.BufferedWriter; public class Search{ static int max = 0; static int now = -1; static File[] tmp = new File[100]; public static void main(String[] args){ Scanner scan = new Scanner(System.in); System.out.println("一覧を取得するディレクトリ名を入力してください。"); String searchFile = scan.nextLine(); System.out.println("出力ファイル名を入力してください。"); String outputFile = scan.nextLine(); dumpFile(new File(searchFile),outputFile); } //検索し値を表示 private static void dumpFile(File file, String output){ File outFile = new File(output); try{ PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(outFile,true))); // ファイル一覧取得 File[] files = file.listFiles(); pw.println("Directory: " + file.getName()); //ディレクトリが空か判定 if(files.length == 0){ pw.println("空です"); } //ディレクトリだった場合tmpに保存 for (File tmpFile : files) { // ディレクトリの場合 if(tmpFile.isDirectory()){ tmp[max] = tmpFile; //入手出来てるかの確認 pw.println(tmpFile.getName() + "はディレクトリです。"); max++; // ファイルの場合 }else{ pw.println(tmpFile.getName() + "はファイルです。"); } } //見やすさのため pw.println(""); //再帰 while(now != max-1){ now++; dumpFile(tmp[now],output); } pw.close(); }catch(IOException e){ System.out.println(e); } } }
###結果
Directory: D4 F3.txtはファイルです。 Directory: D3 空です Directory: D2 D4はディレクトリです。 F2.txtはファイルです。 Directory: D1 D3はディレクトリです。 Directory: test D1はディレクトリです。 D2はディレクトリです。 F1.txtはファイルです。
「ファイルへの書き込みの検索」は"試した"とは言わないと思います。
検索して、どのような記事を参照されたのでしょうか。
その記事の情報はどこまでご理解され、例えばサンプルのコードがあったなら実際にそれを実行してみたりはしなかったのでしょうか。
ご指摘ありがとうございます。
質問を詳しく書き直しました。
System.out.println()に替えてファイルに出力したい、ということなのでしょうか。System.outはPrintStreamクラスのオブジェクトなので、PrintStreamやFileOutputStreamについて調べてみてください。
https://docs.oracle.com/javase/jp/8/docs/api/java/lang/System.html#out
https://docs.oracle.com/javase/jp/8/docs/api/java/io/PrintStream.html
https://docs.oracle.com/javase/jp/8/docs/api/java/io/FileOutputStream.html
尚、普通(?"一般的"というべきか)のファイルの読み書きに関しては、入門書やチュートリアルの類でほぼ必ず説明されていることだと思います。
[すれ違いで書き込みがあったので一部修正]
ご指摘ありがとうございます。
質問が悪かったです。ファイル出力の拡張子をtxtやcsvに強制して出力させたい(書き方は問わない)のですが、ファイル名で指定しなかった場合それは不可能なのでしょうか。
できると思って拡張子を指定して出力する書き方を質問してしまったのですが・・・
それとファイル出力を試して、上に追加される&拡張子が指定できないと思ったコードも追加しておきます。
> 質問が悪かったです。ファイル出力の拡張子をtxtやcsvに強制して出力させたい(書き方は問わない)のですが、ファイル名で指定しなかった場合それは不可能なのでしょうか。
質問を読んだ方々にはたぶん、いまだ理解しづらい説明だと思います。再帰を利用しつつファイル名を列挙して画面に出力するようなコードなのだと思いますが、そのファイル名に拡張子を指定したい、ということですか? 要は、拡張子 .csvや .txtであるファイルの名前を列挙したいということなのでしょうか。
とりあえず、先の私の指摘からか、
> ファイルへの書き込みの検索を行いfilewriterを調べたのですが""の文字と変数の組み合わせの書き込みが分からず、Printwriteを調べ、実行したのですがこれもうまく作動しなかった。
とあったので、現状、何をされたいのか良く分かりません。ご質問をもう少し整理されると他の方からでも回答をいただけるかもしれません。
出力結果を書き込まれるファイルの拡張子を強制できるのかということです。
上のコードではmain内の変数outputFileのことです。
まず、ファイルの中身が画面に表示した時と順番が異なるのは、ファイルのオープン/クローズが dumpFile 内で行われているからと思われます。
通常、出力はさまざまなレベルでバッファリングされ、実際にファイルに書き込まれるのは書き込み処理(この場合は println )をした時とは限りません。
もしバッファが十分にあり出力しようとした文字列がバッファに入りきる場合は、クローズするまで書き込みが行われないことも考えられます。
ご提示の「試した」コードでは、dumpFile がファイルをオープン・出力した後、"クローズする前に" 次の ディレクトリの dumpFile を呼び出しています。
それが連続する結果、再帰が返るまで呼び出し前のデータの書き込みがなされず、順番が逆になっているのではないでしょうか。
それとファイル名の件ですが、拡張子は単なるファイル名の最後の数文字です。何も特別な機能はもっていません。(拡張子に特別な意味を持たせているのは Windows や各種アプリ等の"利用する側"です。)
ですので、強制という手段が具体的にどうされたいのかは不明ですが、簡単には outputFile に +".txt" や +".csv" とすれば拡張子となるでしょう。
ただし、もしこれによって例えば .csv を付ければ中身が(勝手に) CSV となるとお考えでしたらそうはなりません。
詳しい説明ありがとうございます。
正直、拡張子を付ければ勝手に変化すると思っていました。
また追記のコードへのご指摘もありがとうございます。
回答1件
あなたの回答
tips
プレビュー