Java中使用Paths.get()创建File对象是否受文件大小影响?
关于大日志文件下
Paths.get()及元数据查询的性能说明 核心结论
使用Paths.get()创建路径对象、查询文件大小/修改时间等元数据的操作,完全不受5GB超大日志文件的影响,不会触发全文件读取,也不会产生高额I/O开销。
具体原理说明
Paths.get()本身仅会基于你传入的路径字符串生成Path类实例,这个过程不会和实际文件系统产生任何交互,哪怕目标文件不存在、或者体积达到几十GB,这一步的执行开销都是固定的,没有I/O消耗。- 文件大小、修改时间这类信息属于文件元数据,存储在文件系统的inode(Windows环境下为MFT条目)中,调用
Files.size()、Files.getLastModifiedTime()、Files.readAttributes()这类元数据查询API时,操作系统只会读取对应inode的极少量数据,完全不需要读取文件本身的内容,操作耗时和文件体积没有任何关联。
参考代码示例
你可以用以下方式安全查询WAS日志的元数据:
import java.nio.file.*; import java.nio.file.attribute.BasicFileAttributes; public class LogMetaCheck { public static void main(String[] args) throws Exception { // 仅构造路径对象,无I/O操作 Path wasLogPath = Paths.get("/your/was/log/path/systemOut.log"); // 批量读取元数据,仅访问文件系统inode信息 BasicFileAttributes logAttrs = Files.readAttributes(wasLogPath, BasicFileAttributes.class); // 获取文件大小,单位:字节 long logSize = logAttrs.size(); // 获取最后修改时间戳,单位:毫秒 long modifyTime = logAttrs.lastModifiedTime().toMillis(); } }
注意事项
只有调用Files.readAllBytes()、Files.newInputStream()、Files.lines()这类显式读取文件内容的API时,才会产生和文件体积匹配的I/O开销,日常巡检日志堆积只需要查询元数据的场景下完全不会触发这类开销。
内容的提问来源于stack exchange,提问作者최선필
相关产品推荐
相关产品推荐

