2015-12-24 14 views
5

私はこのファイル(10MB、100MB、500MB)未満で自分のコードをテストし、暗号化が機能しています。しかし、私は1GB以上のファイルに問題があります。 大きなファイル(約2GB)を生成しましたが、JAVAを使用してAESで暗号化したいのですが、このエラーが発生します。JAZAを使用してAESで大きなファイルを暗号化

"スレッド内の例外" main "java.lang.OutOfMemoryError:Javaヒープスペース "

-Xmx8Gを使用して、使用可能なメモリを増やしてみましたが、サイコロは使用しませんでした。

File selectedFile = new File("Z:\\dummy.txt");   
    Path path = Paths.get(selectedFile.getAbsolutePath());  
    byte[] toencrypt = Files.readAllBytes(path);  
    byte[] ciphertext = aesCipherForEncryption.doFinal(toencrypt); 
    FileOutputStream fos = new FileOutputStream(selectedFile.getAbsolutePath()); 
    fos.write(ciphertext); 
    fos.close(); 

私の知る限り、それはこのように動作している理由は、一度にファイル全体を読んで、それを暗号化、およびにそれを保存しようとしているということですが、次のように私のコードの 一部がありますバッファリングとストリーミングの代わりに別のバイト配列を使用してください。

私は初心者ですので、あまり知られていないので、どんな助けにも感謝します。

答えて

10

大きなファイル全体をメモリに読み込もうとしないでください。バッファを一度に暗号化する。適切に初期化されたCipherOutputStreamFileOutputStreamにラップされた標準コピーループを実行してください。これをすべてのファイルに使用できます。特別なケースを作る必要はありません。 8k以上のバッファを使用してください。次のように

EDIT Javaでの標準コピーループが 'です。この場合​​で

byte[] buffer = new byte[8192]; 
int count; 
while ((count = in.read(buffer)) > 0) 
{ 
    out.write(buffer, 0, count); 
} 

+1

「一度にバイトを暗号化」:ブロック暗号の暗号化では、ブロック(16バイトAES)です。 – zaph

+0

EJPの答えを読んだ後も、私は「標準コピーループ」が何を意味するのかはまだ不明です。私は入力を一度に1バイトまたはブロックで読む必要があることを理解しています。私はループをどうするべきか分かりません。誰かが私の検索を開始する方向に私を向けることができますか?それの暗号出力ストリーム部分については 、それは次のようになります。 CipherOutputStream COS =新しいCipherOutputStream(のFileOutputStream(selectedFile.getAbsolutePath()); – halcyondayz

+0

@zaphはおっと、それは「バッファ」のタイプミスでした、しかし、 'Cipher'はあなたの基礎ブロックサイズを扱います。 – EJP

1

またEncryptor4jを使用していても、さらにプロセスを簡素化することができます:https://github.com/martinwithaar/Encryptor4j

File srcFile = new File("original.zip"); 
File destFile = new File("original.zip.encrypted"); 
String password = "mysupersecretpassword"; 
FileEncryptor fe = new FileEncryptor(password); 
fe.encrypt(srcFile, destFile); 

それがさらに大きなファイルをOutOfMemoryErrorを起こさないように、このライブラリは、ストリーミングの暗号化を使用しています。また、パスワードを使用する代わりに、独自のKeyを使用することもできます。

ここGithubのページの例をご覧ください:https://github.com/martinwithaar/Encryptor4j#file-encryption

関連する問題