2017-08-01 55 views
-1
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.I使用上面的代码,解决了要求,但同时它遍历一个大目录,它给我一个出来的内存crash.Can任何人都可以告诉我如何解决这个问题?或者还有其他方法可以满足要求吗?内存不足而导线Android的文件系统


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

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

至于在块的行数,这取决于你的系统资源。更好的方法是计算字符数量而不是行数。