Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java可以有效地获取文件大小_Java_Filesize - Fatal编程技术网

java可以有效地获取文件大小

java可以有效地获取文件大小,java,filesize,Java,Filesize,在谷歌搜索的时候,我发现使用会很慢。 也有一个可用的方法 java中有没有一种有效的方法来获取文件大小?好吧,我试着用下面的代码来测量它: 对于runs=1和iterations=1,URL方法最快,其次是channel。我用一些新鲜的停顿运行了大约10次。因此,对于一次性访问,使用URL是我能想到的最快的方式: LENGTH sum: 10626, per Iteration: 10626.0 CHANNEL sum: 5535, per Iteration: 5535.0 URL sum

在谷歌搜索的时候,我发现使用会很慢。 也有一个可用的方法


java中有没有一种有效的方法来获取文件大小?

好吧,我试着用下面的代码来测量它:

对于runs=1和iterations=1,URL方法最快,其次是channel。我用一些新鲜的停顿运行了大约10次。因此,对于一次性访问,使用URL是我能想到的最快的方式:

LENGTH sum: 10626, per Iteration: 10626.0

CHANNEL sum: 5535, per Iteration: 5535.0

URL sum: 660, per Iteration: 660.0
对于运行次数=5和迭代次数=50,图片绘制不同

LENGTH sum: 39496, per Iteration: 157.984

CHANNEL sum: 74261, per Iteration: 297.044

URL sum: 95534, per Iteration: 382.136
文件必须缓存对文件系统的调用,而通道和URL有一些开销

代码:

import java.io.*;
导入java.net。*;
导入java.util.*;
公共枚举文件大小基准{
长度{
@凌驾
public long getResult()引发异常{
File me=新文件(FileSizeBench.class.getResource(
“FileSizeBench.class”).getFile();
返回我。length();
}
},
渠道{
@凌驾
public long getResult()引发异常{
FileInputStream fis=null;
试一试{
File me=新文件(FileSizeBench.class.getResource(
“FileSizeBench.class”).getFile();
fis=新文件输入流(me);
返回fis.getChannel().size();
}最后{
fis.close();
}
}
},
网址{
@凌驾
public long getResult()引发异常{
InputStream=null;
试一试{
URL=FileSizeBench.class
.getResource(“FileSizeBench.class”);
stream=url.openStream();
返回流.available();
}最后{
stream.close();
}
}
};
公共抽象long getResult()引发异常;
公共静态void main(字符串[]args)引发异常{
int运行=5;
int迭代次数=50;
EnumMap durations=新的EnumMap(FileSizeBench.class);
for(int i=0;i
当我修改您的代码以使用由绝对路径而不是资源访问的文件时,我会得到不同的结果(对于一次运行、一次迭代和一个100000字节的文件,10字节文件的次数与100000字节相同)

长度总和:33,每次迭代:33.0

通道总数:3626,每次迭代:3626.0


URL sum:294,每次迭代:294.0

GHad给出的基准除了测量长度外,还测量了许多其他内容(如反射、实例化对象等)。如果我们试图摆脱这些东西,那么对于一个电话,我得到以下时间(以微秒为单位):

file sum___19.0, per Iteration___19.0 raf sum___16.0, per Iteration___16.0 channel sum__273.0, per Iteration__273.0 每次迭代的文件总和为19.0 raf总和为16.0,每次迭代为16.0 每个迭代的通道总和为273.0 对于100次运行和10000次迭代,我得到:

file sum__1767629.0, per Iteration__1.7676290000000001 raf sum___881284.0, per Iteration__0.8812840000000001 channel sum___414286.0, per Iteration__0.414286 每个迭代的文件总和为1767629.0,1.7676290000000001 raf总和为881284.0,每次迭代为0.8812840000000001 信道和\uuuuu 414286.0,每次迭代\uuuu 0.414286 我确实运行了以下修改过的代码,将100MB文件的名称作为参数

import java.io.*;
import java.nio.channels.*;
import java.net.*;
import java.util.*;

public class FileSizeBench {

  private static File file;
  private static FileChannel channel;
  private static RandomAccessFile raf;

  public static void main(String[] args) throws Exception {
    int runs = 1;
    int iterations = 1;

    file = new File(args[0]);
    channel = new FileInputStream(args[0]).getChannel();
    raf = new RandomAccessFile(args[0], "r");

    HashMap<String, Double> times = new HashMap<String, Double>();
    times.put("file", 0.0);
    times.put("channel", 0.0);
    times.put("raf", 0.0);

    long start;
    for (int i = 0; i < runs; ++i) {
      long l = file.length();

      start = System.nanoTime();
      for (int j = 0; j < iterations; ++j)
        if (l != file.length()) throw new Exception();
      times.put("file", times.get("file") + System.nanoTime() - start);

      start = System.nanoTime();
      for (int j = 0; j < iterations; ++j)
        if (l != channel.size()) throw new Exception();
      times.put("channel", times.get("channel") + System.nanoTime() - start);

      start = System.nanoTime();
      for (int j = 0; j < iterations; ++j)
        if (l != raf.length()) throw new Exception();
      times.put("raf", times.get("raf") + System.nanoTime() - start);
    }
    for (Map.Entry<String, Double> entry : times.entrySet()) {
        System.out.println(
            entry.getKey() + " sum: " + 1e-3 * entry.getValue() +
            ", per Iteration: " + (1e-3 * entry.getValue() / runs / iterations));
    }
  }
}
import java.io.*;
导入java.nio.channels.*;
导入java.net。*;
导入java.util.*;
公共类FileSizeBench{
私有静态文件;
专用静态文件通道;
私有静态随机存取文件raf;
公共静态void main(字符串[]args)引发异常{
int运行=1;
int迭代次数=1;
文件=新文件(参数[0]);
channel=newfileinputstream(args[0]).getChannel();
raf=新的随机访问文件(args[0],“r”);
HashMap时间=新建HashMap();
times.put(“文件”,0.0);
次。投入(“通道”,0.0);
次。投入(“raf”,0.0);
长起点;
对于(int i=0;i
为响应rgrig的基准测试,操作所需的时间
import java.io.*;
import java.nio.channels.*;
import java.net.*;
import java.util.*;

public class FileSizeBench {

  private static File file;
  private static FileChannel channel;
  private static RandomAccessFile raf;

  public static void main(String[] args) throws Exception {
    int runs = 1;
    int iterations = 1;

    file = new File(args[0]);
    channel = new FileInputStream(args[0]).getChannel();
    raf = new RandomAccessFile(args[0], "r");

    HashMap<String, Double> times = new HashMap<String, Double>();
    times.put("file", 0.0);
    times.put("channel", 0.0);
    times.put("raf", 0.0);

    long start;
    for (int i = 0; i < runs; ++i) {
      long l = file.length();

      start = System.nanoTime();
      for (int j = 0; j < iterations; ++j)
        if (l != file.length()) throw new Exception();
      times.put("file", times.get("file") + System.nanoTime() - start);

      start = System.nanoTime();
      for (int j = 0; j < iterations; ++j)
        if (l != channel.size()) throw new Exception();
      times.put("channel", times.get("channel") + System.nanoTime() - start);

      start = System.nanoTime();
      for (int j = 0; j < iterations; ++j)
        if (l != raf.length()) throw new Exception();
      times.put("raf", times.get("raf") + System.nanoTime() - start);
    }
    for (Map.Entry<String, Double> entry : times.entrySet()) {
        System.out.println(
            entry.getKey() + " sum: " + 1e-3 * entry.getValue() +
            ", per Iteration: " + (1e-3 * entry.getValue() / runs / iterations));
    }
  }
}
file totalTime: 48000 (48 us)
raf totalTime: 261000 (261 us)
channel totalTime: 7020000 (7 ms)
file totalTime: 80074000 (80 ms)
raf totalTime: 295417000 (295 ms)
channel totalTime: 368239000 (368 ms)
import java.io.File;
import java.io.FileInputStream;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.util.HashMap;
import java.util.Map;

public class FileSizeBench
{    
    public static void main(String[] args) throws Exception
    {
        int iterations = 1;
        String fileEntry = args[0];

        Map<String, Long> times = new HashMap<String, Long>();
        times.put("file", 0L);
        times.put("channel", 0L);
        times.put("raf", 0L);

        long fileSize;
        long start;
        long end;
        File f1;
        FileChannel channel;
        RandomAccessFile raf;

        for (int i = 0; i < iterations; i++)
        {
            // file.length()
            start = System.nanoTime();
            f1 = new File(fileEntry);
            fileSize = f1.length();
            end = System.nanoTime();
            times.put("file", times.get("file") + end - start);

            // channel.size()
            start = System.nanoTime();
            channel = new FileInputStream(fileEntry).getChannel();
            fileSize = channel.size();
            channel.close();
            end = System.nanoTime();
            times.put("channel", times.get("channel") + end - start);

            // raf.length()
            start = System.nanoTime();
            raf = new RandomAccessFile(fileEntry, "r");
            fileSize = raf.length();
            raf.close();
            end = System.nanoTime();
            times.put("raf", times.get("raf") + end - start);
        }

        for (Map.Entry<String, Long> entry : times.entrySet()) {
            System.out.println(entry.getKey() + " totalTime: " + entry.getValue() + " (" + getTime(entry.getValue()) + ")");
        }
    }

    public static String getTime(Long timeTaken)
    {
        if (timeTaken < 1000) {
            return timeTaken + " ns";
        } else if (timeTaken < (1000*1000)) {
            return timeTaken/1000 + " us"; 
        } else {
            return timeTaken/(1000*1000) + " ms";
        } 
    }
}
---
LENGTH sum: 1163351, per Iteration: 4653.404
CHANNEL sum: 1094598, per Iteration: 4378.392
URL sum: 739691, per Iteration: 2958.764

---
CHANNEL sum: 845804, per Iteration: 3383.216
URL sum: 531334, per Iteration: 2125.336
LENGTH sum: 318413, per Iteration: 1273.652

--- 
URL sum: 137368, per Iteration: 549.472
LENGTH sum: 18677, per Iteration: 74.708
CHANNEL sum: 142125, per Iteration: 568.5
CHANNEL sum: 59691, per Iteration: 238.764
LENGTH sum: 48268, per Iteration: 193.072
@Override
public long getResult() throws Exception {
    File me = new File(FileSizeBench.class.getResource(
            "FileSizeBench.class").getFile());
    return me.length();
}