2011-01-22 8 views
0

私はJavaで読み書きすることを学んでおり、簡単な運動で立ち往生しています。プログラムは2行のtxtファイルから読み込み、それぞれに行番号が入っています。各行の数の乗算結果を出力ファイルに書き込みます。例えば。ファイル1行1:10、ファイル2行1:2、プログラムは20を出力ファイルに書き込む必要があります。私のコードは、どこかで見つからないものがあるようです。出力ファイルは作成されますが、何も書き込まれません。何か案は?入力テキストファイル用のDataInputStream?

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

class ReadWriteData 
{ 
    public static void main(String[] args) throws Exception 
    { 

     //create ouput file 
     PrintWriter output = new PrintWriter("output2.txt"); 

     DataInputStream file1 = new DataInputStream(new FileInputStream(args[0])); 
     DataInputStream file2 = new DataInputStream(new FileInputStream(args[1])); 

     try 
     { 

     // read data from file 
     while (true) 
     { 
      double number1 = file1.readDouble(); 
      double number2 = file2.readDouble(); 
      double result = number1 * number2 ; 
      output.println(result); 

     } 


     } 

     catch (IOException e) 
     { 
      System.err.println("Error"); 
      System.exit(1); 
     } 

     output.close() ; 

    } 
} 

答えて

4

ここでは動作するBufferedReaderを実装しています。

public static void main(String[] args) throws Exception { 
    //create ouput file 
    PrintWriter output = new PrintWriter("output2.txt"); 
    BufferedReader file1 = new BufferedReader(new FileReader("numbers1.txt")); 
    BufferedReader file2 = new BufferedReader(new FileReader("numbers2.txt")); 

    try { 
     // read data from file 
     while (true) { 
      String number1AsString = file1.readLine(); 
      String number2AsString = file2.readLine(); 
      if (number1AsString == null || number2AsString == null) { 
       break; 
      } 
      double number1 = Double.parseDouble(number1AsString); 
      double number2 = Double.parseDouble(number2AsString); 
      double result = number1 * number2; 
      System.out.println("result:" + result); 
      output.println(result); 
     } 
    } catch (IOException e) { 
     System.out.println(e.getMessage()); 
    } finally { 
     output.close(); 
     file1.close(); 
     file2.close(); 
    } 
} 

編集:また、あなたは、重複コードを削減する方法を作成するインスタンスのコードをモジュール化することもできます。任意の数値が適切に書式化されていないか、たとえば文字が含まれている場合は、NumberFormatExceptionを検索することもできます。

private double readDoubleFromFile(BufferedReader file) throws IOException { 
    String numberAsString = file.readLine(); 
    if (numberAsString == null) { 
     throw new IOException(); 
    } 
    double number = Double.parseDouble(numberAsString); 
    return number; 
} 
0

出力を呼び出す必要があります。 flushストリームを閉じる直前。また、finallyブロック内のファイルにストリームを閉じる必要があります。これにより、closeコマンドが常に実行されるようになります。

4

DataInputStreamクラスは、テキストファイルを読み取るクラスではありません。それはDataOutputが何を書き込むのかを読むためにのみ使用できます。あなたは人間が読める数字の列を持っている場合は、InputStreamReaderを使用して、DataInputStreamクラスは読み込み

output.flush(); 
+0

非常に正確ですが、特定のスニペットは正常に実行され、例外なく空のファイルが生成されますか? – BalusC

+0

私は、スニペットが他の回答で指摘されているようにアウトプットを閉じることができなかったため、「例外的ではない」と思っています。 – bmargulies

0

のようなものを有する得られたストリームを解析する必要がありますバイナリファイル(またはソケットなどの他のソース)からこれは、おそらく面白い(または非常に刺激的な)結果で、入力テキストファイルを完全に誤解してしまうことを意味します。テキストファイルから数値を読み取るには、をラップして行を読み取ってから、数値を適切な解析方法(たとえば、浮動小数点数を生成する場合はDouble.parseDouble)に変換する必要があります。

これらのことをテストするときには、ループ内のデバッグ出力を読み込んで各値を出力すると便利です。そういうわけで、物事が予期しない方法で詰まっているかどうかを見ることができます。

+2

例外がスローされない限り、closeは暗黙のうちにflushを呼び出す。 – BalusC

+0

私はちょうどそれをテストした、あなたは正しいです。ありがとう – metter

1

を追加

output.println(result); 

Double.parseDouble

2

多分このためにBufferedReaderを使いたいかもしれません。その後

BufferedReader in = new BufferedReader(
          new FileReader(args[0])); 

String num = null; 
    while((num = in.readLine()) != null){ 
     double d = Double.parseDouble(num); 
     //now you have a double value 
    } 

あなたはファイルの終わりを示すために、例外に依存しないこの方法です。

1

このwhile (true)にはbreakがありません。コードは基本的に無限ループで実行されており、例外がない限り停止しません。

終了したが例外が表示されなかった場合は、キャッチ内でSystem.exit(1)を呼び出したことが原因である可能性があります。とにかく"Error"を印刷するのが遅すぎるかもしれません(stdoutが早すぎて破損している可能性があります)、ファイルは決してフラッシュ/クローズされません。そのSystem.exit(1)行を削除します。

また、finallyブロックで閉鎖されています。例外的に何も言わないメッセージを表示しないでください。このメソッドに既にthrows Exceptionがあるので、catch全体を削除してください。 の意味のあるの方法で例外を処理できるときにのみ使用してください。

PrintWriter output = new PrintWriter("output2.txt"); 
try { 
    output.println("something"); 
} finally { 
    output.close(); 
} 
関連する問題