2016-10-22 4 views
-1

У меня есть кусок кода, который использует алгоритм deflate для сжатия файла:Java 7 сдувания Файлы

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

Нет ничего «устаревшего» о вашей первой части кода. Он по-прежнему работает. Здесь нет ничего плохого. Неясно, что вы спрашиваете, и почему. – EJP

ответ

1

В основном я вижу две проблемы.

  1. Вы копируете цель, а не источник. Я думаю, что копирование должно быть изменено на Files.copy(rawFile.toPath(), compressedWriter);.
  2. Javadoc copy говорит: «Обратите внимание, что если данный выходной поток Flushable, то его метод очистки может понадобиться после завершения этого метода, чтобы сбросить любой буферный вывод». Итак, вы должны позвонить flush -метод OutputStream после copy.

Дополнительно есть еще один пункт. В Javadoc копии указано:

Настоятельно рекомендуется, чтобы выходной поток был быстро закрыт, если возникла ошибка ввода-вывода.

Вы можете закрыть OutputStream в finally -блоком, чтобы убедиться, что это происходит в случае ошибки. Другая возможность - использовать try with resources, который был введен в Java 7.

Смежные вопросы