You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Java读取Windows系统中的自定义文件属性

如何用Java获取Windows文件属性窗口中的详细属性

你提到的这些属性(如名称、值、类型)大多是文件的元数据,比如文档的作者、标题,图片的分辨率等。Java标准库的BasicFileAttributes只能获取创建时间、大小这类基础文件系统属性,UserDefinedFileAttributeView仅支持NTFS的自定义扩展属性,无法直接读取这些嵌入文件内容的元数据。以下是几种可行方案:

方案1:使用Apache Tika(通用方案,支持多数文件类型)

Apache Tika是专门用于提取各种文件元数据和内容的库,能识别Office文档、图片、PDF等几乎所有常见格式的元数据,用法简单:

  1. 先引入依赖(Maven为例):
<dependency>
    <groupId>org.apache.tika</groupId>
    <artifactId>tika-core</artifactId>
    <version>2.9.1</version>
</dependency>
<dependency>
    <groupId>org.apache.tika</groupId>
    <artifactId>tika-parsers-standard-package</artifactId>
    <version>2.9.1</version>
</dependency>
  1. 编写提取代码:
import org.apache.tika.Tika;
import org.apache.tika.metadata.Metadata;
import java.io.File;
import java.io.FileInputStream;

public class FileMetadataExtractor {
    public static void main(String[] args) {
        try {
            File file = new File("你的文件路径");
            Tika tika = new Tika();
            Metadata metadata = new Metadata();
            
            // 提取元数据
            tika.parse(new FileInputStream(file), metadata);
            
            // 遍历所有属性
            for (String name : metadata.names()) {
                String value = metadata.get(name);
                // Tika会自动识别属性对应类型,可按需处理
                System.out.println("名称: " + name + ", 值: " + value);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

方案2:针对特定文件类型使用专用库

  • 如果你只需要处理Office文档(如docx、xlsx),可以用Apache POI:
    示例读取docx的作者、标题信息:
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import java.io.FileInputStream;

public class DocxMetadataExtractor {
    public static void main(String[] args) {
        try (XWPFDocument doc = new XWPFDocument(new FileInputStream("test.docx"))) {
            String author = doc.getProperties().getCoreProperties().getCreator();
            String title = doc.getProperties().getCoreProperties().getTitle();
            System.out.println("作者: " + author);
            System.out.println("标题: " + title);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
  • 处理图片文件(如JPG)可以用TwelveMonkeys ImageIO扩展库读取EXIF元数据:
import com.twelvemonkeys.imageio.metadata.EXIF;
import com.twelvemonkeys.imageio.metadata.metadata.IImageMetadata;
import javax.imageio.ImageIO;
import java.io.File;
import java.io.IOException;

public class ImageMetadataExtractor {
    public static void main(String[] args) throws IOException {
        File file = new File("test.jpg");
        IImageMetadata metadata = ImageIO.read(file).getMetadata();
        EXIF exif = EXIF.createFromMetadata(metadata);
        
        // 提取EXIF属性
        System.out.println("拍摄时间: " + exif.getDateTimeOriginal());
        System.out.println("相机型号: " + exif.getModel());
    }
}

方案3:调用Windows API(通过JNA)

如果需要获取Windows Shell显示的系统级属性(如文件“备注”),可以用JNA调用Windows的Shell32.dll,这种方法仅适用于Windows系统,实现相对复杂:

  1. 引入JNA依赖:
<dependency>
    <groupId>net.java.dev.jna</groupId>
    <artifactId>jna</artifactId>
    <version>5.13.0</version>
</dependency>
<dependency>
    <groupId>net.java.dev.jna</groupId>
    <artifactId>jna-platform</artifactId>
    <version>5.13.0</version>
</dependency>
  1. 示例调用(获取文件备注):
import com.sun.jna.platform.win32.Shell32;
import com.sun.jna.platform.win32.ShlObj;
import com.sun.jna.platform.win32.WinNT;
import com.sun.jna.ptr.PointerByReference;

public class WindowsFileAttributes {
    public static void main(String[] args) {
        String filePath = "你的文件路径";
        ShlObj.SHFILEINFO shfi = new ShlObj.SHFILEINFO();
        Shell32.INSTANCE.SHGetFileInfo(filePath, WinNT.FILE_ATTRIBUTE_NORMAL, shfi, ShlObj.SHFILEINFO.SIZE, 
                Shell32.SHGFI_ATTRIBUTES | Shell32.SHGFI_COMMENTS);
        
        System.out.println("文件备注: " + shfi.szComments);
    }
}

内容的提问来源于stack exchange,提问作者MaVRoSCy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 17:43:09