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文件中,以便其他客户端可以将其分析为文件系统树。
答案 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();
关于块中的行数,这取决于您的系统资源。更好的方法是计算字符数而不是行数。