2

私は課題に取り組んでいて、いくつかの問題に遭遇しました。

私のプログラムは出力を画面に出力しますが(まだ必要な方法ではありません)、ファイルの最初のエントリのみを出力します。以下はコードの抜粋です。ファイルは入力ファイルからデータを読み込んでいるように見えますが、ループは最初のエントリを超えてファイルに出力されません。

Scanner in = new Scanner(System.in);    //Scanner object to read input from the file
System.out.println("Enter filename to read ");  //file name prompt  
String inputFileName = in.nextLine();                //line input reads next line

/*
 * TODO 2) Use an unbuffered file input stream to open listings.txt file
 * and read in property listings.
 */
Scanner reader = null;
try {
    reader = new Scanner(new File(inputFileName));
} catch (FileNotFoundException e) {

    System.out.println("Try Again");   //error window if name is null
    JOptionPane.showMessageDialog(null, "You must enter a filename", "File input error", JOptionPane.ERROR_MESSAGE);
    return;

}

PrintWriter out = new PrintWriter("agentreport.txt"); //This method prints out the file readfile.txt a word at a time
while (reader.hasNextLine()) {                      //It needs to output to the text file. Currently a file is created, but it is empty?
    Scanner s2 = new Scanner(reader.next());

    @SuppressWarnings("unused")
    boolean b;
    while (b = s2.hasNext()) {
        String output = s2.next();
        String output2 = output.toUpperCase(); //converts output to upper case
        System.out.println(output2);
        out.print(output2);  //only printing the first entry to the agentsreport.txt file. Not stepping thru the file for some reason? 
   }
4

4 に答える 4

3

自動フラッシュを使用している場合でも (この場合はそうではありません)、次の 2 つのいずれかを行わない限り、PrintWriter オブジェクトは内部バッファーに何かを出力します。

1) println()printf()、またはformat()to メソッドを使用する

flush()2)印刷するたびにメソッドを呼び出します。これにより、内部バッファー内のすべてのデータが書き出されます。

注: このprint()メソッドは、PrintWriter オブジェクトをそのバッファーに格納しません。flush()

flush()通話後に通話を追加してみてくださいprint()

split() の例

PrintWriter out = new PrintWriter("agentreport.txt"); 
while (reader.hasNextLine()) {                    
    String words = reader.nextLine().split();

    @SuppressWarnings("unused")
    boolean b;
    for(String word : words) {
        String output = word ;
        String output2 = output.toUpperCase(); //converts output to upper case
        System.out.println(output2);
        out.print(output2);  
   }
于 2012-04-20T16:48:56.857 に答える
0

すぐに思いつくことの 1 つは、リソースを適切に処理していないことです。

リーダー/データベース接続などの IO リソースを使用するときはいつでも、次のようなパターンを使用して、finally ブロックを使用して常に閉じる必要があります。

Reader reader = /* construct it however */
try {
    /* do something with the reader */
}
finally {
    reader.close();
}

これを行わないと、リーダーが実際に閉じられるという保証はなく、アプリケーションはファイル記述子/接続プール接続などをリークし、最終的にそれ以上の情報を取得できなくなります。アプリがクラッシュします。(これは常に致命的な結果をもたらすわけではありませんが、自動化されるまでは毎回使用する必要がある単純なパターンです)。

この場合、ライターをまったく閉じていません。つまり、ライターが実際に出力をファイルにフラッシュすることは保証されていません。Writerすべてを書き込むか、何も書き込まないかは、インターフェイスに完全に従っています。フラッシュがなければ、保証はありません。ライターを閉じると自動的にフラッシュが呼び出されることに注意してください。

したがって、コードの後半部分は次のようになります。

PrintWriter out = new PrintWriter("agentreport.txt");
try {
    // Existing code here
}
finally {
    // This closes the file and frees the descriptor, but also flushes the buffers
    out.close();
}

IOExceptionまた、読み書きによってスローされる可能性のあるsをどのように処理していますか?それらを捕まえてどこかで飲み込んでいますか?もしそうなら、コードが例外をスローして、書き込めない理由を正確に伝えている可能性があり、それを無視して困惑しているように見えます。

細かい点を強調しすぎるのは差し控えますが、エラー処理はおそらく優れたソフトウェア開発の最も重要な部分です。すべてが正常なときに機能するソフトウェアを作成することは、それほど難しくありません。最も困難な部分は、ハード ドライブのスペースがなくなったときや、ネットワークが一時的にダウンしたときなどにうまく処理することです。

この場合、最も実用的なアプローチは、メソッドの先頭から例外をスローすることmainです。この場合、アプリケーションは「クラッシュ」し、コンソールにスタック トレース + エラー メッセージが表示されます。これにより、何か問題が発生したことがすぐに明らかになり、問題が何であったかについての非常に良いアイデアが得られます。

于 2012-04-20T16:56:40.413 に答える
0
try ( 
   Scanner reader = new Scanner(new File(inputFileName));
   PrintWriter writer = new PrintWriter(new FileOutputStream("agentreport.txt"), true);
) {

   while (reader.hasNextLine()) {                     
      String output = reader.nextLine().toUpperCase();
      System.out.println(output);
      writer.println(output); 
   }
} catch (FileNotFoundException e) {

   System.out.println("Try Again");   //error window if name is null
   JOptionPane.showMessageDialog(null, "You must enter a filename", "File input error", JOptionPane.ERROR_MESSAGE);

}
于 2012-04-20T16:57:33.257 に答える
0

試す

out.println(output2);

http://docs.oracle.com/javase/6/docs/api/java/io/PrintWriter.html

また、ショートコード「out.println()」を使用するために system.out がインポートされる場合、「out」以外の var を使用します。これにより、変数の混乱が生じる可能性があります。

編集:良い点@Hunter McMillen、追加はCharSequence用であるためprintlnに変更。

于 2012-04-20T16:49:09.740 に答える