问题回答。感谢大家的帮助和帮助。
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中。
答案 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);
}