1

问题已回答。感谢大家愿意提供帮助和帮助。

Writer output = null;
    File pdfFile = new File("MANIFEST.txt");//create text file
    try {
        output = new BufferedWriter(new FileWriter(pdfFile));
    } catch (IOException e) {
         //TODO Auto-generated catch block
        e.printStackTrace();
    }

    for(int i=0; i<files.length; i++){//create manifesto of pdfs in directory
        try {

            System.out.println(copy[i]);
            output.write(copy[i]);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }           

副本是一个字符串数组。内容正确打印到控制台,但不打印到文件(虽然文件已创建)。当我包含导入 java.util.zip.ZipOutputStream; 时,很多事情都会抛出异常(例如 output.write 给出“未处理的异常类型 IOEception”),除非我将它们放在 try catch 中。

4

2 回答 2

2

你曾经关闭过作家吗?

通常,每当您创建 I/O 资源(例如读取器/写入器/数据库连接/等)时,您应该使用finally 块来确保它已关闭,如下所示:

Writer writer = new BufferedWriter(...);
try {
    // do something with the writer; may be many lines of code
}
finally {
    writer.close();
}

(注意:Java 7 对该模式有更简洁的语法,try-with-resources 块。)

这对于资源管理很重要(例如,如果您不关闭连接/文件,那么最终您的进程将用完文件句柄并且无法再打开)。

但是,还有一个更相关的问题。许多写入器被缓冲,以避免一次写入一个字符到底层操作系统的性能损失。当您调用write它们时,它们会将数据存储在缓冲区中,并且只会定期将其实际写入文件(当它“足够大”值得使用时) - 这称为flushing

如果写入器在刷新数据之前被简单地丢弃,则不会更新文件。

您可以flush()手动调用,但很少需要 - 调用close()writer 不仅会释放其所有资源,还会刷新缓冲区。因此,使用try / finally上面列出的模式,可以保证try当您的进程终止时,您在块中写入的任何内容都将写入文件。使用您当前的代码,没有任何保证,它取决于编写器的实现。

于 2012-05-15T08:15:14.490 回答
0

您在 for 循环中使用i < files.lengthas 条件,然后访问copy[i]. 你可能想使用这样的东西:

for(int i = 0; i < copy.length; i++) {
    System.out.println(copy[i]);
    output.write(copy[i]);
}

或者更好的是,使用 foreach 循环:

for(final String element : copy) {
    System.out.println(element);
    output.write(element);
}
于 2012-05-15T08:13:17.207 回答