jTextArea使用BufferedReader仅在文本文件中保存第一行文本?

时间:2016-05-30 10:35:57

标签: java bufferedreader jtextarea dataoutputstream

我正在尝试将文本文件中的多行输出从我的jTextArea(在代码中命名为" outputarea")保存到我想要的路径,一切正常,但保存的文件不包含整个输出,但只有文本的第一行。我正在使用" \ n"在提供多行输出的同时打破jtextarea中的行,这会在此代码中产生任何差异或任何其他问题,此代码只是saveAs按钮上的代码,输出来自我创建的其他方法。在此先感谢!

private void saveAs() {

 FileDialog fd = new FileDialog(home.this, "Save", FileDialog.SAVE);
 fd.show();
 if(fd.getFile()!=null)
 {
 fn=fd.getFile();
 dir=fd.getDirectory();
 filename = dir + fn +".txt";
 setTitle(filename);
 try
 {

 DataOutputStream d=new DataOutputStream(new FileOutputStream(filename));
 holdText = outputarea.getText();
 BufferedReader br = new BufferedReader(new StringReader(holdText));
 while((holdText = br.readLine())!=null)
 {
 d.writeBytes(holdText+"\r\n");
 d.close();
 }
 }
     catch (Exception e)
     {
     System.out.println("File not found");
     }
outputarea.requestFocus();
save(filename);
 }

}

1 个答案:

答案 0 :(得分:3)

你应该在完成while循环之后放置d.close();,因为在使用DataOutputStream在文件中写第一行之后,你正在关闭它并且你不能让它完成整个工作。

您甚至可以在控制台中看到错误:

  

找不到文件

这不是因为它找不到你的文件,因为在第一次之后的迭代中,它试图写入一个封闭的流。所以只写了第一行。所以改变你的代码:

while ((holdText = br.readLine()) != null) {
    d.writeBytes(holdText + "\r\n");
}
d.close();

另外,我建议您使用PrintWriter代替DataOutputStream。然后,您可以轻松地将writeBytes更改为println方法。这样,您就不需要手动将\r\n附加到您撰写的每一行。

另一个好的提示是使用try-with-resource(如果你使用java 7或更高版本)或至少finally块来关闭你的流:

String holdText = outputarea.getText();
try (PrintWriter w = new PrintWriter(new File(filename));
     BufferedReader br = new BufferedReader(new StringReader(holdText))) {
    while ((holdText = br.readLine()) != null) {
        w.println(holdText);
    }

} catch (Exception e) {
        System.out.println("File not found");
}

祝你好运。