Traverse Android文件系统时内存不足

时间:2017-08-01 06:19:11

标签: java android

public class SDCardFileManager {
public long i = 0;

public void onDirList(){
    try {
        File rootFile = new File("/");
        Log.d("test", "traverse start");
        String json = GsonUtil.list2Json(new SDCardFile(rootFile).list);
        Log.d("test", "traverse finished");
        File file = new File("/sdcard/file.json");
        if (file.exists()) {
            file.delete();
        }
        file.createNewFile();
        Log.d("test", "ready to store ");
        OutputStreamWriter oStreamWriter = new OutputStreamWriter(new FileOutputStream(file), "utf-8");
        oStreamWriter.append(json);
        oStreamWriter.close();
        Log.d("test", "json file was stored at "+file.getAbsolutePath());
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

class SDCardFile{
    private String filename;
    private boolean isDirectory;
    private String size = "";
    private String date = "";
    public List<SDCardFile> list = new ArrayList<SDCardFileManager.SDCardFile>();

    public SDCardFile(File file) {
        i++;
        this.filename = file.getName();
        this.isDirectory = file.isDirectory();
        if (!isDirectory) {
            size = formatSize(file.length());
            date = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(file.lastModified());
        }else{
            File[] DirFiles = file.listFiles();
            if (DirFiles != null) {
                for (final File dirFile : DirFiles) {
                    list.add(new SDCardFile(dirFile));
                }
            }
        }
    }

    private String formatSize(long length){
        String size = "";
        if (length<1024) {
            size = String.valueOf(length)+"B";
        }else if (length>=1024&&length<1024*1024) {
            size = String.valueOf(length/1024)+"KB";
        }else if (length>=1024*1024&&length<1024*1024*1024) {
            size = String.valueOf(length/(1024*1024))+"MB";
        }else if (length>=1024*1024*1024) {
            size = String.valueOf(length/(1024*1024*1024))+"GB";
        }
        return size;
    }
}

我需要遍历整个文件系统并将其存储为json。我使用上面的代码来解决需求但是当它遍历一个大目录时,它会让我内存崩溃。任何人都告诉我如何解决这个问题问题?或者还有其他方式来满足要求吗?

也许对这个问题存在一些误解。 我不需要获取文件的内容。我只需要它的名称,创建时间,大小和目录结构。然后将其存储到json文件中,以便其他客户端可以将其分析为文件系统树。

1 个答案:

答案 0 :(得分:0)

您正在将整个文件读取到内存中。

遇到大文件时,将其存储在内存中并不是一个好主意。

使用BufferedWriter以块的形式写入文件,并在每个块中刷新写入的内容。

BufferedWriter用法示例,如下所示:

int chunkSize = someNumber;
int lineCount = 0;
BufferedReader br = new BufferedReader(new FileReader(sourceFileName));
BufferedWriter bw = new BufferedWriter(new FileWriter(targetFileName));
while((line = br.readLine()) != null) {
    bw.(writeline);
    lineCount++;
    if(lineCount % chunkSize == 0) {
        bw.flush();
    }
}
bw.close();
br.close();

关于块中的行数,这取决于您的系统资源。更好的方法是计算字符数而不是行数。