2011-01-22 24 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塊中的文件,這將確保關閉命令總是會被執行。

4

DataInputStream類不適用於讀取文本文件。它只能用於讀取什麼DataOutput寫道。如果你有人類可讀的數字行,你需要使用一個InputStreamReader,然後分析事情所產生的流狀Double.parseDouble

+0

非常真實,但是特定片段是否能夠成功運行並生成一個沒有任何異常的空文件? – BalusC 2011-01-22 16:07:48

+0

我認爲由於未能如其他答案中指出的那樣關閉輸出,因此代碼段「非常規」。 – bmargulies 2011-01-22 16:46:56

0

output.println(result); 

後添加

output.flush(); 
1

DataInputStream類讀取從二進制文件(或其他來源,如套接字)。這意味着它會完全誤解這些輸入文本文件,並且可能會引起有趣(或非常刺激)的結果。要從文本文件中讀取數字,您應該使用BufferedReader包裝InputStreamReader來讀取行,然後使用合適的解析方法將這些行轉換爲數字(例如,如果您想生成浮點數,則使用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你的代碼基本上運行在一個無限循環,永遠不會停止,除非有例外。

如果確實終止但您沒有看到異常,則可能是由於在catch中調用System.exit(1)而引起的。無論如何打印"Error"可能爲時太晚(標準輸出可能已經過早地中斷),並且文件永遠不會被刷新/關閉。刪除那個System.exit(1)行。

另外,關閉應該在finally區塊中發生。最好的是不要在例外情況下打印一些無所謂的消息,而只是讓他們走。既然你已經有一個throws Exception的方法,只需刪除整個catch。只有在可以處理明顯的方式的例外情況時才使用它。

PrintWriter output = new PrintWriter("output2.txt"); 
try { 
    output.println("something"); 
} finally { 
    output.close(); 
}