Java 文件夹大小估计
Java Folder size estimate
我们正在构建一个 java 应用程序,使用户能够从第三方应用程序导入大型数据集。第三方应用程序中的数据位于文件系统上,分布在大量文件夹和小文件中(很多用户都在外部磁盘上)。
为了保护用户,如果没有足够的磁盘 space 可用于执行导入,我们要警告他。但是,为此我们必须计算大量小文件使用的磁盘 space。
我尝试使用 Apache IO 和 java.nio 方法来计算目录大小。但是,对于 FireWire 磁盘上大约 50GB 的数据,这两种方法都需要大约 10 分钟。
这太长了,因为此任务是一项纯粹的安全措施,而且大多数时候,我们得出的解决方案有足够的 space 可用。
是否有某种方法可以快速、智能地对目录消耗的 space 进行原始估算?
我也很想知道是否有一个位来保存磁盘的大小。
同时,这是我的解决方案 - 通过对输出进行一些花哨的文本处理,您可以获得大小 - 70G 大约需要 6 分钟,这可能不是您想要的,但它可能是您的一半时间
long tm=System.currentTimeMillis();
try {
String cmd="cmd /c dir c:\ /s ";
execute(cmd, false);
}
catch (Exception ex) { }
System.out.println((System.currentTimeMillis()-tm));
public String execute(String cmd, boolean getoutput) {
String output=null;
try {
Runtime rt = Runtime.getRuntime();
Process pr=rt.exec(cmd);
StreamGobbler errorGobbler=new StreamGobbler(pr.getErrorStream(), "ERROR", getoutput);
errorGobbler.start();
StreamGobbler inputGobbler=new StreamGobbler(pr.getInputStream(), "INPUT", getoutput);
inputGobbler.start();
int exitVal=pr.waitFor();
System.out.println("ExitValue: " + exitVal);
output=""+errorGobbler.output;
output+=inputGobbler.output;
}
catch(Throwable t) { t.printStackTrace(); }
return output;
}
import java.util.*;
import java.io.*;
public class StreamGobbler extends Thread {
boolean redirect=false;
InputStream is;
OutputStream os;
String type, output="";
StreamGobbler(InputStream is, String type) {
this.is = is;
this.type = type;
}
StreamGobbler(InputStream is, String type, boolean redirect) {
this.is = is;
this.type = type;
this.redirect=redirect;
}
StreamGobbler(OutputStream os, String type) {
this.os = os;
this.type = type;
}
StreamGobbler(OutputStream is, String type, boolean redirect) {
this.os = os;
this.type = type;
this.redirect=redirect;
}
public void run() {
try
{
if(type.equals("OUTPUT")) {
}
else {
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line=null;
int i=0;
while ( (line = br.readLine()) != null) {
if(redirect) output+=line;
else System.out.println("line "+i+" "+type + ">" + line);
i++;
}
}
} catch (IOException ioe)
{
ioe.printStackTrace();
}
}
}
我们正在构建一个 java 应用程序,使用户能够从第三方应用程序导入大型数据集。第三方应用程序中的数据位于文件系统上,分布在大量文件夹和小文件中(很多用户都在外部磁盘上)。 为了保护用户,如果没有足够的磁盘 space 可用于执行导入,我们要警告他。但是,为此我们必须计算大量小文件使用的磁盘 space。
我尝试使用 Apache IO 和 java.nio 方法来计算目录大小。但是,对于 FireWire 磁盘上大约 50GB 的数据,这两种方法都需要大约 10 分钟。
这太长了,因为此任务是一项纯粹的安全措施,而且大多数时候,我们得出的解决方案有足够的 space 可用。
是否有某种方法可以快速、智能地对目录消耗的 space 进行原始估算?
我也很想知道是否有一个位来保存磁盘的大小。
同时,这是我的解决方案 - 通过对输出进行一些花哨的文本处理,您可以获得大小 - 70G 大约需要 6 分钟,这可能不是您想要的,但它可能是您的一半时间
long tm=System.currentTimeMillis();
try {
String cmd="cmd /c dir c:\ /s ";
execute(cmd, false);
}
catch (Exception ex) { }
System.out.println((System.currentTimeMillis()-tm));
public String execute(String cmd, boolean getoutput) {
String output=null;
try {
Runtime rt = Runtime.getRuntime();
Process pr=rt.exec(cmd);
StreamGobbler errorGobbler=new StreamGobbler(pr.getErrorStream(), "ERROR", getoutput);
errorGobbler.start();
StreamGobbler inputGobbler=new StreamGobbler(pr.getInputStream(), "INPUT", getoutput);
inputGobbler.start();
int exitVal=pr.waitFor();
System.out.println("ExitValue: " + exitVal);
output=""+errorGobbler.output;
output+=inputGobbler.output;
}
catch(Throwable t) { t.printStackTrace(); }
return output;
}
import java.util.*;
import java.io.*;
public class StreamGobbler extends Thread {
boolean redirect=false;
InputStream is;
OutputStream os;
String type, output="";
StreamGobbler(InputStream is, String type) {
this.is = is;
this.type = type;
}
StreamGobbler(InputStream is, String type, boolean redirect) {
this.is = is;
this.type = type;
this.redirect=redirect;
}
StreamGobbler(OutputStream os, String type) {
this.os = os;
this.type = type;
}
StreamGobbler(OutputStream is, String type, boolean redirect) {
this.os = os;
this.type = type;
this.redirect=redirect;
}
public void run() {
try
{
if(type.equals("OUTPUT")) {
}
else {
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line=null;
int i=0;
while ( (line = br.readLine()) != null) {
if(redirect) output+=line;
else System.out.println("line "+i+" "+type + ">" + line);
i++;
}
}
} catch (IOException ioe)
{
ioe.printStackTrace();
}
}
}