2

この質問にはかなり簡単な答えがあると確信しているので、ここに行きます。

FileWriter を使用してテキストをファイルに書き込もうとしています。私のプログラムは、ユーザーが指定した既存のファイルからテキストを読み取り、テキストをコンソールに出力するか、ユーザーが名前を付けて新しいファイルに出力するかを尋ねます。

私の問題は、FileWriter を「FileOrConsole」メソッドに渡すことにあると思います。「FileOrConsole」メソッドで FileWriter を正しく渡したり宣言したりしていませんか? ファイルは常に作成されますが、何も書き込まれません。

コードは次のとおりです。

import java.io.*;
import java.util.*;

public class Reader {

public static void main(String[] args) throws IOException {
    Scanner s = null, input = new Scanner(System.in);
    BufferedWriter out = null;

    try {
        System.out.println("Would you like to read from a file?");
        String answer = input.nextLine();

        while (answer.startsWith("y")) {
            System.out.println("What file would you like to read from?");
            String file = input.nextLine();
            s = new Scanner(new BufferedReader(new FileReader(file)));

            System.out
                    .println("Would you like to print file output to console or file?");
            FileOrConsole(input.nextLine(), s, input, out);
            System.out
                    .println("\nWould you like to read from the file again?");
            answer = input.nextLine();
        }
        if (!answer.equalsIgnoreCase("yes")) {
            System.out.println("Goodbye!");
        }

    } catch (IOException e) {
        System.out.println("ERROR! File not found!");
        // e.printStackTrace();
    } finally {
        if (s != null) {
            s.close();
        }
        if (out != null) {
            out.close();
        }
    }
}

public static void FileOrConsole(String response, Scanner s, Scanner input,
        BufferedWriter out) {
    if (response.equalsIgnoreCase("console")) {
        while (s.hasNext()) {
            System.out.println(s.nextLine());
        }
    } else if (response.equalsIgnoreCase("file")) {
        System.out.println("Name of output file?");
        response = input.nextLine();
        try {
            out = new BufferedWriter(new FileWriter(response));
        } catch (IOException e) {
            e.printStackTrace();
        }
        while (s.hasNext()) {
            try {
                out.write(s.nextLine());
                out.newLine();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        try {
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    } else {
        System.out.println("Sorry, invalid response. File or console?");
        response = input.nextLine();
        FileOrConsole(response, s, input, out);
    }
  }
}
4

2 に答える 2

4

Javaの場合、値で渡されたパラメーターが参照の値であることを忘れて、古典的なエラーを作成します。問題は、あなたの課題です

out = new BufferedWriter(new FileWriter(response));

main() で宣言された変数は実際には変更されず、null のままです

BufferedWriter アウト = null; 最後に、if(out==null) によって close() をスキップし、バッファリングされているため、フラッシュしないため、ファイルには何も書き込まれません。あなたがしなければならないのは out.close(); です。FileOrConsole メソッド呼び出しの中で

また

out = new BufferedWriter(new FileWriter(response)); を実行します。その外側。選んで :-)

于 2011-07-20T23:29:28.097 に答える
0

ストリームをフラッシュしてみてください。ただし、もっと重要なのは、ストリームを閉じることを忘れないことです。

ストリームを処理するための推奨プラクティスのコード例を次に示します。入力ストリームにも同じアプローチを使用できます。また、期待される結果を得るために常に自分でクリーンアップすることが重要なデータベース コードなどにも使用できます。

BufferedWriter out = null;
try {
    out = // ... create your writer

    // ... use your writer
} catch(IOException ex) {

    // maybe there was a problem creating or using the writer

} finally {
   if (null != out) {
       out.flush();
       out.close();
       out = null;
   }
}
于 2011-07-20T23:29:30.337 に答える