2016-11-13 5 views
0

У меня есть .xlsx файл (или любой файл), который я хотел бы gzip. Я могу gzip файл, но теперь у меня проблема с попыткой сделать это на месте. Значение для замены исходного файла на gzipped версию файла.Как заменить gzip на место Java

Вот мой код:

public static void main(String[] args) throws IOException { 

    File file = new File("test.xlsx"); 
    File gfile = new File(file.getAbsolutePath()+".gz"); 

    if(!file.exists()) { 
     System.err.println("Input tax file did not exist!"); 
    } 

    FileInputStream fis = new FileInputStream(file); 
    FileOutputStream fos = new FileOutputStream(gfile); 
    GZIPOutputStream gos = new GZIPOutputStream(fos); 
    gzipReplace(fis, gos); 
} 



private static void gzipReplace(InputStream is, OutputStream os) { 
    int oneByte; 
    try { 
     while((oneByte = is.read()) != -1) { 
      os.write(oneByte); 
     } 
     os.close(); 
     is.close(); 
    } catch (Exception e){ 
     System.err.println(e.getStackTrace()); 
    } 
} 

Как я могу сделать замену на месте несжатого файла с сжат GZIP один?

+1

Я должен подумать, что, поскольку вы используете текстовый файл для создания файла gzip, вы просто не можете его переписать сразу, но я уверен, что вы можете сделать это после того, как сжатие «успешно» завершилось просто перемещением или удалить текстовый файл. – DevilsHnd

+0

Я хочу, чтобы он был общим для работы с любым типом файла, txt был всего лишь примером. Я уточню детали на свой вопрос. Я сделаю это примерно для 2 миллионов файлов. Таким образом, пространство будет представлять собой проблему, поскольку процесс выполняется, но замена на месте будет лучшим решением и быстрее, чем добавление процедуры удаления исходного файла –

ответ

1

Просто используйте File.delete() на оригинальном файле после успешно сжатие и запись файла gzip.

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

+0

, поэтому нет простого способа сделать замену на месте? –

+1

Нет, нет простого пути. Так как вы делаете это для миллионов файлов, вы будете занимать только место _one_ дополнительного файла на каждом шаге, так как его сжатые и несжатые формы временно находятся на диске одновременно. Предполагая, что файлы сжимаемы, вы уменьшите объем дискового пространства, используемого на каждом шаге. –

+1

Если, с другой стороны, вы пытались сжать один гигантский файл, который занимает большую часть вашего дискового пространства, _then_ было бы целесообразно перейти к перезаписи несжатого файла со сжатыми данными по мере продвижения и усечению полученного файл в конце. Это нужно сделать очень осторожно, чтобы избежать перезаписи несжатых данных, которые еще не сжаты, когда данные расширяются из-за несжимаемости. Вы можете увидеть [этот ответ] (http://stackoverflow.com/a/12412863/1180620), как это делается в памяти, которое можно переписать, чтобы сделать то же самое в файловой системе. –