2011-01-22 58 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(); 
}