Java 7 Deflation文件

时间:2016-10-22 08:38:07

标签: java java-7 deflate

我有一段代码使用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;
}

然而,后一种方法无法正常工作,压缩文件混乱,只复制了几个字节。怎么样?

1 个答案:

答案 0 :(得分:1)

我主要看到两个问题。

  1. 您从目标而不是源复制。我认为复制必须更改为Files.copy(rawFile.toPath(), compressedWriter);
  2. copy的Javadoc说:“请注意,如果给定的输出流是Flushable,则在此方法完成后可能需要调用其flush方法,以便刷新任何缓冲的输出。”因此,您必须在flush之后调用OutputStream的{​​{1}}方法。
  3. 另外还有一点。副本的Javadoc说:

      

    强烈建议在发生I / O错误时立即关闭输出流。

    您可以关闭copy - 块中的OutputStream,以确保在出现错误时发生。另一种可能性是使用Java 7中引入的try with resources