使用FileReader&时忘记用户.close();的BufferedReader

时间:2013-12-18 11:14:20

标签: java bufferedreader filereader

我正在使用以下代码片段逐行读取文件并在另一个文件中写入相同的文件。我的输入文件包含大约13000行但只生成仅12000行的输出文件

public class FileReadWrite {

public static void main(String args[]) {

    FileReader input = null;
    BufferedReader br = null;
    BufferedWriter printer = null;
try {
    input = new FileReader("input.txt");
    File output = new File("output.txt");
    br = new BufferedReader(input);
    printer = new BufferedWriter(new FileWriter(output));
    String s;
    while((s = br.readLine()) != null){
            printer.write(s);
            printer.newLine();
    }
}
catch(FileNotFoundException e) {
    System.err.println("File not found. Please scan in new file.");
}
catch(Exception e)
{
    System.err.println("Exception occured"+e);
}
}

添加此代码段后,它可以正常工作

finally{

            try
            {
                    input.close();
                    br.close();
                    printer.close();
            }
            catch(Exception e)
            {
            }
    }

有什么原因吗?

3 个答案:

答案 0 :(得分:1)

我建议进行二元转移,这有很多优点

  • 您不会对文本进行解码/编码,因此您不必担心编码损坏文本
  • 您不必担心匹配新的行分隔符,可能是\r\n\r\n
  • 您无需复制到缓冲区或从缓冲区复制。所有复制都在本机代码/内存中完成。
  • 代码更短更快

try-with-resource块为您关闭资源/

try (FileChannel from = new FileInputStream(fromFile).getChannel();
     FileChannel to = new FileOutputStream(toFile).getChannel()) {
    from.transferTo(0, from.size(), to);
} catch (IOException ioe) {
    ioe.printStackTrace();
}

答案 1 :(得分:0)

关闭缓冲(实际上是全部)流非常重要。

关闭流时,缓冲的内容将刷新到磁盘 - 导致所有13k记录写入文件。

答案 2 :(得分:0)

每当我们在java中使用文件输入/输出时。该代码使用系统的重要资源进行读写。 由于这个原因,我们必须关闭所有流,在将数据写入任何文件后,我们必须使用方法flush和close,否则可能无法写入所有数据。