Ошибки кодирования при сжатии файлов с помощью Apache Commons Compression в Linux - PullRequest
3 голосов
/ 19 июля 2011

Я сжимаю файлы с помощью API-сжатия Apache Commons. Windows 7 работает нормально, но в Linux (Ubuntu 10.10 - UTF8) символы в именах файлов и имен папок, например, например, «º», заменяются на «?».

Есть ли какой-либо параметр, который я должен передать API, когда он компактен или распаковывает tar?

Я использую формат 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 + "/");
                }
            }
        }
    }
}

(подавляю основной метод;)

EDIT (monkeyjluffy): изменения, которые я сделал, должны всегда иметь один и тот же архив на разных платформах. Тогда вычисляемый на нем хеш остается тем же.

Ответы [ 2 ]

1 голос
/ 21 июля 2011

К вашему сведению, в приведенном выше коде есть ошибка, объясненная здесь: Проблема с tar при сжатии общих Apache

По сути, вам нужно закрыть FileInputStream. IOUtils.copy () не сделает это за вас.

1 голос
/ 20 июля 2011

Я нашел обходной путь для моей проблемы.

По какой-то причине java не учитывает кодировку моей среды и меняет ее на cp1252.

После этого я распаковываю файл, просто ввожу в него папку и запускаю команду:

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

И она рекурсивно конвертирует все в UTF-8.

Проблема решена, ребята.

Подробнее о проблемах кодирования в Linux здесь .

Спасибо всем за помощь.

...