私はこのファイル(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();
私の知る限り、それはこのように動作している理由は、一度にファイル全体を読んで、それを暗号化、およびにそれを保存しようとしているということですが、次のように私のコードの 一部がありますバッファリングとストリーミングの代わりに別のバイト配列を使用してください。
私は初心者ですので、あまり知られていないので、どんな助けにも感謝します。
「一度にバイトを暗号化」:ブロック暗号の暗号化では、ブロック(16バイトAES)です。 – zaph
EJPの答えを読んだ後も、私は「標準コピーループ」が何を意味するのかはまだ不明です。私は入力を一度に1バイトまたはブロックで読む必要があることを理解しています。私はループをどうするべきか分かりません。誰かが私の検索を開始する方向に私を向けることができますか?それの暗号出力ストリーム部分については 、それは次のようになります。 CipherOutputStream COS =新しいCipherOutputStream(のFileOutputStream(selectedFile.getAbsolutePath()); – halcyondayz
@zaphはおっと、それは「バッファ」のタイプミスでした、しかし、 'Cipher'はあなたの基礎ブロックサイズを扱います。 – EJP