2016-11-13 15 views
0

私はgzipしたい.xlsxファイル(または任意のファイル)を持っています。私はファイルをgzipすることができましたが、今私はこれを適切に行うことを試みるという問題があります。元のファイルをgzip形式のファイルに置き換えることを意味します。ここで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で圧縮されていないファイルのインプレースの交換を行うことができますか?

+1

私はテキストファイルを使ってgzipファイルを作成しているので、すぐに上書きすることはできないと思うべきですが、圧縮が「正常に」完了したらすぐに移動できますまたはテキストファイルを削除します。 – DevilsHnd

+0

どのファイルタイプでも動作させるためには、txtは単なる例でした。詳細を私の質問に更新します。私は約200万のファイルのためにこれを行うでしょう。したがって、プロセスが実行されるときにスペースが問題になる場合は、元のファイルを削除するプロシージャを追加するよりも、より良い解決策となる可能性があります。 –

答えて

1

が成功した後に元のファイルにFile.delete()を使用してください。 gzipファイルの圧縮と書き込み。

新しい圧縮ファイルが正常に書き込まれて閉じられるまで、元のファイルを削除しないように注意する必要があります。それ以外の場合は、データを失うように自分自身を設定しています。

+0

このように、置き換えを行う簡単な方法はありません。 –

+1

いいえ、簡単な方法はありません。何百万ものファイルに対してこれを実行しているので、圧縮されたフォームと非圧縮のフォームが同時に一時的にディスクに保存されるため、各ステップで追加ファイルのスペースを占有するだけです。ファイルが圧縮可能であると仮定すると、すべてのステップで使用されるディスク容量が減ります。 –

+1

一方、ほとんどのディスク容量を占める1つの巨大なファイルを圧縮しようとしていた場合は、圧縮されたファイルを圧縮して上書きし、その結果を切り捨てる最後にファイル。これは、データが非圧縮性のためにある程度膨張するときにまだ圧縮されていない非圧縮データを上書きしないように、非常に慎重に行わなければならないでしょう。これがメモリ内でどのように行われているかは、[この回答](http://stackoverflow.com/a/12412863/1180620)を参照してください。これは、ファイルシステムで同じことを行うように書き直すことができます。ありがとうございます。 –

関連する問題