Ошибка OutOfMemory при шифровании - PullRequest
2 голосов
/ 31 мая 2011

Во-первых, это ошибка, которую я получаю

   java.lang.OutOfMemoryError
at coderaustin.com.FileEncryptor.encryptFile(FileEncryptor.java:56)
at coderaustin.com.Main.onCreate(Main.java:41)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1069)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2751)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2803)
at android.app.ActivityThread.access$2300(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2136)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:144)
at android.app.ActivityThread.main(ActivityThread.java:4937)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
at dalvik.system.NativeStart.main(Native Method)

Очевидно, я знаю, что это за ошибка, я просто не знаю, как ее избежать.Это то, что делает мое приложение,

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

try {
    FileInputStream inFile = new FileInputStream(f.getAbsolutePath());
    FileOutputStream outFile = new FileOutputStream(f.getAbsoluteFile() + ".des");

    PBEKeySpec keySpec = new PBEKeySpec(text.toCharArray());
    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
    SecretKey passwordKey = keyFactory.generateSecret(keySpec);
    byte[] salt = new byte[8];
    Random rnd = new Random();
    rnd.nextBytes(salt);
    int iterations = 100;

    PBEParameterSpec paramaterSpec = new PBEParameterSpec(salt, iterations);

    Cipher cipher = Cipher.getInstance("PBEWithMD5AndDES");
    cipher.init(Cipher.ENCRYPT_MODE, passwordKey, paramaterSpec);

    outFile.write(salt);



    byte[] input = new byte[inFile.available()];

    int bytesRead;
     while ((bytesRead = inFile.read(input)) != -1)
                {
                  byte[] output = cipher.update(input, 0, bytesRead);
                   if (output != null) outFile.write(output);
               }

               byte[] output = cipher.doFinal();
               if (output != null) outFile.write(output);
               f.delete();
              inFile.close();
               outFile.flush();
               outFile.close();

Да, я знаю, что код довольно уродливый, но он работает.Есть предложения?

Спасибо всем:)

Редактировать: Это строка 56

byte[] input = new byte[inFile.available()];

1 Ответ

5 голосов
/ 31 мая 2011

Странно: если файл очень большой, я вижу, как это может быть проблемой.Почему вы читаете весь файл сразу, а не читаете его небольшими порциями и обрабатываете?

РЕДАКТИРОВАТЬ: попробуйте это.

byte[] input = new byte[4096];

    int bytesRead;
     while ((bytesRead = inFile.read(input, 0, 4096)) != -1)
                {
                  byte[] output = cipher.update(input, 0, bytesRead);
                   if (output != null) outFile.write(output);
               }
...