2011-05-31 55 views
2

首先,这是我得到内存不足错误,而加密

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()];

+0

该文件有多大? – 2011-05-31 03:20:53

回答

5

奇:如果该文件是非常大的,我可以看到,可能是一个问题。你为什么一次读取整个文件,而不是以小块和处理方式读取它?

编辑:试试这个。

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); 
       } 
+0

哇,我觉得很愚蠢,这是一个非常好的点(我应该看到一个很明显的点)。那么这里我最好的选择是什么?感谢您的帮助。 – Austin 2011-05-31 03:20:57

+0

请记住,Android应用程序的堆大小(通常为16或24MB)是有限的,因此即使您拥有数百MB的内存,任何大于此值的文件都会成为问题。 – sargas 2011-05-31 03:31:35

+0

非常感谢,@sargas这应该修复,即使他们只有16或24mb的堆大小的权利?由于您只加载4096字节。 – Austin 2011-05-31 03:53:22