我有一段代码使用deflate
算法来压缩文件:
public static File compressOld(File rawFile) throws IOException
{
File compressed = new File(rawFile.getCanonicalPath().split("\\.")[0]
+ "_compressed." + rawFile.getName().split("\\.")[1]);
InputStream inputStream = new FileInputStream(rawFile);
OutputStream compressedWriter = new DeflaterOutputStream(new FileOutputStream(compressed));
byte[] buffer = new byte[1000];
int length;
while ((length = inputStream.read(buffer)) > 0)
{
compressedWriter.write(buffer, 0, length);
}
inputStream.close();
compressedWriter.close();
return compressed;
}
但是,我对OutputStream
复制循环不满意,因为它是写入流的“过时”方式。相反,我想使用Java 7
API方法,例如Files.copy
:
public static File compressNew(File rawFile) throws IOException
{
File compressed = new File(rawFile.getCanonicalPath().split("\\.")[0]
+ "_compressed." + rawFile.getName().split("\\.")[1]);
OutputStream compressedWriter = new DeflaterOutputStream(new FileOutputStream(compressed));
Files.copy(compressed.toPath(), compressedWriter);
compressedWriter.close();
return compressed;
}
然而,后一种方法无法正常工作,压缩文件混乱,只复制了几个字节。怎么样?
答案 0 :(得分:1)
我主要看到两个问题。
Files.copy(rawFile.toPath(), compressedWriter);
。copy
的Javadoc说:“请注意,如果给定的输出流是Flushable,则在此方法完成后可能需要调用其flush方法,以便刷新任何缓冲的输出。”因此,您必须在flush
之后调用OutputStream
的{{1}}方法。另外还有一点。副本的Javadoc说:
强烈建议在发生I / O错误时立即关闭输出流。
您可以关闭copy
- 块中的OutputStream
,以确保在出现错误时发生。另一种可能性是使用Java 7中引入的try with resources。