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

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

新規登録して質問してみよう
ただいま回答率
85.48%
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Java

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

Q&A

解決済

1回答

2006閲覧

javaでメソッドでの実行結果をファイルに書き込みたい

tamintya

総合スコア34

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Java

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

0グッド

1クリップ

投稿2021/10/22 16:48

編集2021/10/23 03:13

前提・実現したいこと

ディレクトリの中身を探索するメソッドで実行した結果をファイルに入力したいのですがうまく作動しませんでした。
この時入力されたファイル(下のコードでは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はファイルです。

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

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

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

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

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

jimbe

2021/10/22 17:42

「ファイルへの書き込みの検索」は"試した"とは言わないと思います。 検索して、どのような記事を参照されたのでしょうか。 その記事の情報はどこまでご理解され、例えばサンプルのコードがあったなら実際にそれを実行してみたりはしなかったのでしょうか。
tamintya

2021/10/23 01:36

ご指摘ありがとうございます。 質問を詳しく書き直しました。
dodox86

2021/10/23 01:42 編集

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 尚、普通(?"一般的"というべきか)のファイルの読み書きに関しては、入門書やチュートリアルの類でほぼ必ず説明されていることだと思います。 [すれ違いで書き込みがあったので一部修正]
tamintya

2021/10/23 02:41

ご指摘ありがとうございます。 質問が悪かったです。ファイル出力の拡張子をtxtやcsvに強制して出力させたい(書き方は問わない)のですが、ファイル名で指定しなかった場合それは不可能なのでしょうか。 できると思って拡張子を指定して出力する書き方を質問してしまったのですが・・・
tamintya

2021/10/23 02:45

それとファイル出力を試して、上に追加される&拡張子が指定できないと思ったコードも追加しておきます。
dodox86

2021/10/23 02:51 編集

> 質問が悪かったです。ファイル出力の拡張子をtxtやcsvに強制して出力させたい(書き方は問わない)のですが、ファイル名で指定しなかった場合それは不可能なのでしょうか。 質問を読んだ方々にはたぶん、いまだ理解しづらい説明だと思います。再帰を利用しつつファイル名を列挙して画面に出力するようなコードなのだと思いますが、そのファイル名に拡張子を指定したい、ということですか? 要は、拡張子 .csvや .txtであるファイルの名前を列挙したいということなのでしょうか。
dodox86

2021/10/23 03:00

とりあえず、先の私の指摘からか、 > ファイルへの書き込みの検索を行いfilewriterを調べたのですが""の文字と変数の組み合わせの書き込みが分からず、Printwriteを調べ、実行したのですがこれもうまく作動しなかった。 とあったので、現状、何をされたいのか良く分かりません。ご質問をもう少し整理されると他の方からでも回答をいただけるかもしれません。
tamintya

2021/10/23 03:01

出力結果を書き込まれるファイルの拡張子を強制できるのかということです。 上のコードではmain内の変数outputFileのことです。
jimbe

2021/10/23 03:20 編集

まず、ファイルの中身が画面に表示した時と順番が異なるのは、ファイルのオープン/クローズが dumpFile 内で行われているからと思われます。 通常、出力はさまざまなレベルでバッファリングされ、実際にファイルに書き込まれるのは書き込み処理(この場合は println )をした時とは限りません。 もしバッファが十分にあり出力しようとした文字列がバッファに入りきる場合は、クローズするまで書き込みが行われないことも考えられます。 ご提示の「試した」コードでは、dumpFile がファイルをオープン・出力した後、"クローズする前に" 次の ディレクトリの dumpFile を呼び出しています。 それが連続する結果、再帰が返るまで呼び出し前のデータの書き込みがなされず、順番が逆になっているのではないでしょうか。 それとファイル名の件ですが、拡張子は単なるファイル名の最後の数文字です。何も特別な機能はもっていません。(拡張子に特別な意味を持たせているのは Windows や各種アプリ等の"利用する側"です。) ですので、強制という手段が具体的にどうされたいのかは不明ですが、簡単には outputFile に +".txt" や +".csv" とすれば拡張子となるでしょう。 ただし、もしこれによって例えば .csv を付ければ中身が(勝手に) CSV となるとお考えでしたらそうはなりません。
tamintya

2021/10/23 03:27

詳しい説明ありがとうございます。 正直、拡張子を付ければ勝手に変化すると思っていました。 また追記のコードへのご指摘もありがとうございます。
guest

回答1

0

ベストアンサー

現在の構造であれば、再帰は必要ありません。
また、File 配列である tmp の働きは FIFO の Queue ですので、代わりに既存の java.util.ArrayDeque を用い、出力ファイルのオープンクローズは dumpFile メソッドの外に出してみました。try-with-resources 文

java

1package teratail_java.q365774; 2 3import java.io.*; 4import java.util.*; 5 6public class Search{ 7 public static void main(String[] args){ 8 try(Scanner scan = new Scanner(System.in);){ 9 System.out.println("一覧を取得するディレクトリ名を入力してください。"); 10 String searchFile = scan.nextLine(); 11 12 System.out.println("出力ファイル名を入力してください。"); 13 String outputFile = scan.nextLine(); 14 outputFile += ".txt"; 15 16 try(PrintWriter pw = new PrintWriter(new FileWriter(outputFile));){ 17 Queue<File> queue = new ArrayDeque<>(); 18 queue.add(new File(searchFile)); 19 dumpFile(queue, pw); 20 }catch(IOException e){ 21 e.printStackTrace(); 22 } 23 } 24 } 25 26 //検索し値を表示 27 private static void dumpFile(Queue<File> queue, PrintWriter pw){ 28 for(File file=null; (file=queue.poll())!= null; ){ 29 pw.println("Directory: " + file.getName()); 30 31 File[] files = file.listFiles(); // ファイル一覧取得 32 if(files.length == 0){ //ディレクトリが空か判定 33 pw.println("空です"); 34 } 35 for (File tmpFile : files){ 36 if(tmpFile.isDirectory()){ 37 queue.add(tmpFile); //ディレクトリだった場合保存 38 pw.println(tmpFile.getName() + "はディレクトリです。"); 39 }else{ 40 pw.println(tmpFile.getName() + "はファイルです。"); 41 } 42 } 43 44 pw.println(); //見やすさのため 45 } 46 } 47}

実行

plain

1一覧を取得するディレクトリ名を入力してください。 2test 3出力ファイル名を入力してください。 4zzz

zzz.txt

plain

1Directory: test 2D1はディレクトリです。 3D2はディレクトリです。 4F1.txtはファイルです。 5 6Directory: D1 7D3はディレクトリです。 8 9Directory: D2 10D4はディレクトリです。 11F2.txtはファイルです。 12 13Directory: D3 14空です 15 16Directory: D4 17F3.txtはファイルです。

投稿2021/10/23 04:37

編集2021/10/23 07:31
jimbe

総合スコア12632

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問