2011-07-20 6 views
2

この質問にはかなり簡単な答えがあると確信していますのでここで説明します。メソッドへのパラメータとしてFileWriterを渡す

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

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

はコードです:

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); 
    } 
    } 
} 
+0

[ファイルが存在する場合]私は、明らかに入力が存在している必要があります(両方の入力/出力ファイル用(http://www.exampledepot.com/egs/java.io/Exists.html)を決定しようとするだろう出力はユーザー入力に検証を追加するべきではありません)。 –

答えて

4

は、Javaの場合は、値によって渡されたパラメータは、それが参照の値であることを忘れ古典的なエラーを作ります。事はあなたの割り当て

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

は、実際には=ヌルヌル

BufferedWriterのうちのまま)(メインで宣言された変数を変更しないということです。 最後に、if(out == null) によってclose()をスキップし、バッファされていて、何もフラッシュしない場合、何もファイルに書き込まれません。 あなたがしなければならないのはout.close()です。サイドにFileOrConsoleメソッド呼び出し

OR

はアウト=新しいBufferedWriterの(新しいてFileWriter(レスポンス))を行います。 の外にあります。あなたが選んだのは:-)

+0

ボリスありがとう!私は私が望むように動作するように変更したものを表示するために、私の質問のコードを更新しました。 BufferedWriterがメソッド内で閉じられていない場合、なぜ何も書かれていないのですか? – Mark

+0

私はこれが助けてくれることを願っています。注意深くこれを読むことは、リファレンスベースのプログラミング言語である基本的なことです。あなたはこれを理解しなければなりません。 http://www.yoda.arachsys.com/java/passing.html –

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; 
    } 
} 
+0

ボリスはそうです。私は寝るだろうと思う。 :) – brindy

+0

これは間違った答えです。最初:何も出ていないので、outはnullです。 Second:Closeは単独でflush()を行います。私がコメントを見た後、私たちはすべて小さな間違いをします:-) –

関連する問題