java.io.file对象中获取文件长度时 调用length方法 返回的是文件占用空间大小.如何获取文件自身的大小呢?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java.io.file对象中获取文件长度时 调用length方法 返回的是文件占用空间大小.如何获取文件自身的大小呢?相关的知识,希望对你有一定的参考价值。

java.io.file对象中获取文件长度时 调用length方法 返回的是文件占用空间大小.如何获取文件自身的大小呢?

文件夹的大小:
import java.io.File;
class DirDemo05
public static void main(String[] args)
File src=new File("D:/Desktop/test/Stream");
printCount(src);
System.out.println(count);

public static int count=0;
public static void printCount(File src)
//获取大小
if(null!=src && src.exists())//递归头
if(src.isFile())
count+=src.length();
else
for(File s:src.listFiles())
printCount(s);




参考技术A File f = new File(filePath);
FileInputStream fis = new FileInputStream(f);
System.out.println(fis.available()); //结果即是文件自身占用空间大小追问

我需要的是文件自身的大小而不是文件占用空间的大小

参考技术B 返回的是文件中含有的字节数。追问

是图片类型的文件你可以测试下的

追答

图片类型的占用空间大小是按照像素来算的,但是length方法会把他当做一个普通文件来算,然后计算它的字节数吧。

追问

如果我是想获取这个文件自身的大小 而不是获取这个文件的占用空间大小该如何获取呢?

追答

按照我的理解,一般是图片显示的都是占用空间的大小,但是使用length得出的就是文件自身的大小,如果图片比较小的话,会不容易比较的出来,如果图片像素特别高,那么应该是有明显的不同的,你可以试一下~

追问

我需要从两个不同的地方获取文件大小比对,一个是post提交过来的一个直接读取服务器上的,post提交过来的file获得的大小为文件自身大小.而读取服务器上文件的大小为占用空间大小 所以会有这么个问题

追答

如果是这种状况的话,会不会按照文本文件来处理是不是会好一点呢,不要当做图片来处理

追问

?????

追答

因为感觉是我的知识极限了,我实在不知道为啥用length得出来的不是文件大小,因为length是会按照文本文件来处理的方法,你改下后缀名试一下(纯属猜的),或者实在不行你可以使用文件流,把里边的文件一个字节一个字节的读出来,顺便计算一下字节数,看能不能满足要求。然后上传的时候,你用同样的方法处理一下。图片通过大小来判断是否一样还是不太靠谱的,从特征上来看会好一点~

追问

如果在处理一个稍微大点的文件,这样的话效率会降低很多吧

追答

确实是的,但是从目前我掌握的技术来看,我解释不了这种现象,所以只能依靠这种方法了。

本回答被提问者采纳
参考技术C File ff = new File(path);
FileInputStream fis = new FileInputStream(f);
long s= fis.available();追问

如上代码执行后获取的s值为占用空间大小 不是文件自身的大小

从 java.io.File 获取 java.nio.file.Path 对象

【中文标题】从 java.io.File 获取 java.nio.file.Path 对象【英文标题】:Get java.nio.file.Path object from java.io.File 【发布时间】:2013-03-08 21:03:48 【问题描述】:

是否可以从java.io.File 获取 Path 对象?

我知道您可以使用toFile() 方法将路径转换为文件,但我找不到相反的转换。有没有办法在 Java 6 或更低版本中做到这一点?

【问题讨论】:

你看过 API 文档了吗? 是的,我看到了 resolve 和 resolveSibling 方法,但这并没有完全从文件(或字符串)转换为路径,而是以某种方式连接它。 这里是documentation @VivinPaliath 也在暗指。 最愚蠢的问题(我的意思是,拜托,它在文档中,简短的谷歌搜索会回答它)让我在网站上获得最多分数,这让我感到惊讶。 :D @Karlovsky120 如果您自己尝试用谷歌搜索它,您应该不会感到惊讶;) 【参考方案1】:

是的,您可以使用File.toPath()File 对象中获取它。请记住,这仅适用于 Java 7+。 Java 6 及以下版本没有。

【讨论】:

有没有办法在 Java 6 或更低版本中实现这一点? Path 是在 Java 7 中引入的,所以很遗憾在 Java 6 及更低版本中无法做到这一点。【参考方案2】:

你可能想要File.toPath()

【讨论】:

【参考方案3】:

来自the documentation:

与默认 provider 关联的路径通常是可互操作的 与java.io.File 类。其他提供者创建的路径是 不太可能与所代表的抽象路径名称互操作 通过java.io.FiletoPath 方法可用于从 由 java.io.File 对象表示的抽象路径名。 生成的 Path 可用于操作与 java.io.File 对象。 此外,toFile 方法对于 从PathString 表示构造File

(强调我的)

所以,对于toFile

返回代表此路径的File 对象。

还有toPath:

返回从 t​​his 抽象路径构造的 java.nio.file.Path 对象。

【讨论】:

我不反对 :)。我只是提到了 OP 想要什么。【参考方案4】:

正如许多人所建议的,JRE v1.7 及更高版本具有 File.toPath();

File yourFile = ...;
Path yourPath = yourFile.toPath();

在Oracle的jdk 1.7 documentation上面其他帖子也提到过,在toPath()方法的描述中描述了以下等效代码,它可能适用于JRE v1.6;

File yourFile = ...;
Path yourPath = FileSystems.getDefault().getPath(yourFile.getPath());

【讨论】:

以上是关于java.io.file对象中获取文件长度时 调用length方法 返回的是文件占用空间大小.如何获取文件自身的大小呢?的主要内容,如果未能解决你的问题,请参考以下文章

File以及I/O流

File以及I/O流

Java IO流File类的使用

Java-文件File简单实用

Java IO -- File类

File类