使用Linux上的Apache Commons Compression压缩文件时出现编码错误

时间:2011-07-19 18:43:12

标签: java encoding gzip apache-commons tar

我正在使用Apache Commons API Compression压缩文件。 Windows 7工作正常,但在Linux(ubuntu 10.10 - UTF8)中,文件名和文件夹名称中的字符(例如“º”)将替换为“?”。

在压缩时,或者解压缩tar时,是否应该将任何参数传递给API?

我正在使用tar.gz格式,遵循API示例。

我正在尝试压缩的文件是在Windows中创建的......有什么问题吗?

代码:

    public class TarGzTest 
    {

    public static void createTarGzOfDirectory(String directoryPath, String tarGzPath) throws IOException
    {
        System.out.println("Criando tar.gz da pasta " + directoryPath + " em " + tarGzPath);
        FileOutputStream fOut = null;
        BufferedOutputStream bOut = null;
        GzipCompressorOutputStream gzOut = null;
        TarArchiveOutputStream tOut = null;

        try
        {
            fOut = new FileOutputStream(new File(tarGzPath));
            bOut = new BufferedOutputStream(fOut);
            gzOut = new GzipCompressorOutputStream(bOut);
            tOut = new TarArchiveOutputStream(gzOut);

            addFileToTarGz(tOut, directoryPath, "");
        }
        finally
        {
            tOut.finish();
            tOut.close();
            gzOut.close();
            bOut.close();
            fOut.close();
        }
        System.out.println("Processo concluído.");
    }

    private static void addFileToTarGz(TarArchiveOutputStream tOut, String path, String base) throws IOException
    {
        System.out.println("addFileToTarGz()::"+path);
        File f = new File(path);
        String entryName = base + f.getName();
        TarArchiveEntry tarEntry = new TarArchiveEntry(f, entryName);

        tOut.setLongFileMode(TarArchiveOutputStream.LONGFILE_GNU);

        if(f.isFile())
        {
            tOut.putArchiveEntry(tarEntry);

            IOUtils.copy(new FileInputStream(f), tOut);

            tOut.closeArchiveEntry();
        }
        else
        {
            File[] children = f.listFiles();

            if(children != null)
            {
                for(File child : children)
                {
                    addFileToTarGz(tOut, child.getAbsolutePath(), entryName + "/");
                }
            }
        }
    }
}

(我压制主要方法;)

编辑(monkeyjluffy):我所做的更改是在不同平台上始终保持相同的存档。然后计算的哈希是相同的。

2 个答案:

答案 0 :(得分:1)

我找到了解决问题的方法。

出于某种原因,java不尊重我的环境编码,并将其更改为cp1252。

之后我解压缩文件,我只需输入文件夹,然后运行此命令:

convmv --notest -f cp1252 -t utf8 * -r

它将所有递归转换为UTF-8。

问题解决了,伙计们。

有关linux here中编码问题的详细信息。

感谢大家的帮助。

答案 1 :(得分:1)

仅供参考,上面的代码中有一个错误:Tar problem with apache commons compress

基本上,您需要关闭FileInputStream。 IOUtils.copy()不会为你做。