【问题标题】:Byte[] and java.lang.OutOfMemoryError read/write file by bitsByte[] 和 java.lang.OutOfMemoryError 逐位读/写文件
【发布时间】:2015-12-17 14:39:05
【问题描述】:

我正在清理 android 中的一些可用空间。这是我的代码:

private void creatingFileDelete(int size, int passMode) 
    {
        File lastFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath(),"/.tmpToDelete/last.txt");
        if (lastFile.exists() == false) 
        {
        try 
        {
            lastFile.createNewFile();
        }//End of try block
        catch (IOException e) 
        {
            e.printStackTrace();
        }//End of catch block
    }//End of if condition

    try 
    {
        RandomAccessFile rwFile = new RandomAccessFile(lastFile, "rw");
        rwFile.setLength(1024*1024*size);
        FileChannel rwChannel = rwFile.getChannel();
        int numBytes = (int) rwChannel.size();
        MappedByteBuffer buffer = rwChannel.map(FileChannel.MapMode.READ_WRITE, 0, numBytes);
        buffer.clear();
        byte[] randomBytes = new byte[numBytes];

        new Random().nextBytes(randomBytes);
        Arrays.fill(randomBytes, 0, randomBytes.length, (byte) passMode);
        buffer.put(randomBytes);

        buffer.force();
        rwFile.close();
    }//End of try block
    catch (Exception e) 
    {
        Log.e("Clean free space---","message :" +e.getMessage());
    }//End of catch block
}//End of creatingFileDelete 

在擦除过程中,我遇到了以下崩溃。

java.lang.RuntimeException: An error occured while executing doInBackground()
          at android.os.AsyncTask$3.done(AsyncTask.java:299)
          at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
          at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
          at java.util.concurrent.FutureTask.run(FutureTask.java:239)
          at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
          at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
          at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
          at java.lang.Thread.run(Thread.java:856)
    Caused by: java.lang.OutOfMemoryError
          at xxx.creatingFileDelete(CleanFreespace.java:2634)
          at xxx.CleanFreespace.access$71(CleanFreespace.java:2610)
          at xxx.CleanFreespace$15.doInBackground(CleanFreespace.java:2100)
          at xxx.CleanFreespace$15.doInBackground(CleanFreespace.java:1)
          at android.os.AsyncTask$2.call(AsyncTask.java:287)
          at java.util.concurrent.FutureTask.run(FutureTask.java:234)
          ... 4 more

朋友,我该如何解决这个问题。

【问题讨论】:

    标签: java android file


    【解决方案1】:
    OutOfMemoryError 
    

    当使用可用平台资源无法满足内存请求时引发。这样的请求可以由正在运行的应用程序或VM(虚拟机)的内部函数发出

    当您收到OutOfMemory 之类的错误时,这意味着您的应用程序内存不足,因为您的应用程序消耗了更多空间,然后由系统分配给它。

    android:largeHeap="true"这个属性放在<application/>manifest.xml文件中

    例如

     <application
        android:name="support.classes.StartUp"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:largeHeap="true" // you are increasing the heap space for the app 
        android:theme="@style/AppThemeTest">
    

    如果你只是想释放一些空间,最好让Android系统处理它,它最了解它

    System.gc()
    

    在您执行任何消耗内存的任务之前调用垃圾收集器,因为这将为您释放一些空间。如果您尝试在完成任务后调用它,那么它没有任何意义

    【讨论】:

    • Pankaj,我再次遇到以下崩溃:原因是:java.lang.OutOfMemoryError:无法分配 447741964 字节分配,其中 5077506 个可用字节和 120MB 直到 OOM
    • @Gowtham,你不必编写所有处理字节的低级代码,common-io-2.4 可以为你工作,让事情变得非常简单
    • 为什么不呢,你能告诉我你到底想做什么,我会提供我能提供的
    • 如何擦除android中的空闲空间,任何软件都不能恢复。
    • 当您说擦除时,您是在尝试释放已经空闲的空间。或者您是否正在尝试写入其他应用程序和用户无法访问的数据?
    猜你喜欢
    • 2012-03-19
    • 1970-01-01
    • 1970-01-01
    • 2015-02-01
    • 1970-01-01
    • 2012-07-25
    • 2019-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多