请告诉我为什么下面的代码不起作用?

时间:2014-01-17 17:57:40

标签: java

当我运行代码时,一切正常,但内容不会写入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???
            }
        }
    }

3 个答案:

答案 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(...);
}