import java.util.zip.ZipOutputStream;导致打印到文件的问题

时间:2012-05-15 08:00:32

标签: java zip

问题回答。感谢大家的帮助和帮助。

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

copy是一个字符串数组。内容正确打印到控制台,但不打印到文件(尽管创建了文件)。当我包含import java.util.zip.ZipOutputStream;时,很多东西抛出异常(例如output.write给出“未处理的异常类型IOEception”),除非我把它们放在try catch中。

2 个答案:

答案 0 :(得分:2)

你有没有关闭作家?

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

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

(注意:Java 7对此模式有更简洁的语法the try-with-resources block。)

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

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

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

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

答案 1 :(得分:0)

您在for循环中使用i < files.length作为条件,但随后访问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);
}