当我运行代码时,一切正常,但内容不会写入target.txt。
public class SrtExtractor {
public static void main(String[] args) throws IOException {
Path source = Paths.get("files/loremipsum.txt");
Path target = Paths.get("files/target.txt");
Charset charSet = Charset.forName("US-ASCII");
BufferedReader reader = Files.newBufferedReader(source, charSet);
BufferedWriter writer = Files.newBufferedWriter(target, charSet);
String temp;
ArrayList<String> list = new ArrayList<>();
while((temp = reader.readLine())!=null){
list.add(temp);
System.out.println(temp);
}
for(int i = 0; i<list.size(); i++)
{
writer.append(list.get(i));//why this line is not working???
}
}
}
答案 0 :(得分:3)
您正在使用BufferedWriter
类 - 在这种情况下,您写入的内容仍在缓冲区中。需要调用writer.flush();
来清除Buffer的内容并将它们写入底层流。
flush()
时也会自动调用 close()
。当您的程序使用它的资源时,应该调用close()
,以避免内存泄漏。正确关闭资源可能很难正确完成,但Java 7添加了一个新的try-with-resources construct来帮助程序员正确关闭其资源。
这里重写了使用try-with-resources构造的示例。这将确保即使在处理文件时发生异常,也会正确关闭两个流。它与在您的读者和作者上调用close()
基本相同,但它更安全,使用的代码更少。
public class SRTExtractor {
public static void main(String[] args) throws IOException {
Path source = Paths.get("files/loremipsum.txt");
Path target = Paths.get("files/target.txt");
Charset charSet = Charset.forName("US-ASCII");
try (
BufferedReader reader = Files.newBufferedReader(source, charSet);
BufferedWriter writer = Files.newBufferedWriter(target, charSet);
) {
String temp;
ArrayList<String> list = new ArrayList<>();
while ((temp = reader.readLine()) != null) {
list.add(temp);
System.out.println(temp);
}
for (int i = 0; i < list.size(); i++) {
writer.append(list.get(i));
}
}
}
}
答案 1 :(得分:1)
for(int i = 0; i<list.size(); i++) {
writer.append(list.get(i));
}
writer.close(); //Add this
reader.close(); //Add this
您尚未表明您已写完该文件。在您说close()
文件实际上没有被写入之前,文本只是位于BufferedWriter
。
答案 2 :(得分:0)
正如大家所说,你应该添加writer.close()
。
另一方面,我认为在文本文件上写的最好的方法是这个(它总是为我运行):
File file = new File(path);
FileOutputStream fout = new FileOutputStream(file);
OutputStreamWriter osw = new OutputStreamWriter(fout);
Writer w = new BufferedWriter(osw);
for(...){
w.write(...);
}