如何使用Java读取Windows系统中的自定义文件属性
如何用Java获取Windows文件属性窗口中的详细属性
你提到的这些属性(如名称、值、类型)大多是文件的元数据,比如文档的作者、标题,图片的分辨率等。Java标准库的BasicFileAttributes只能获取创建时间、大小这类基础文件系统属性,UserDefinedFileAttributeView仅支持NTFS的自定义扩展属性,无法直接读取这些嵌入文件内容的元数据。以下是几种可行方案:
方案1:使用Apache Tika(通用方案,支持多数文件类型)
Apache Tika是专门用于提取各种文件元数据和内容的库,能识别Office文档、图片、PDF等几乎所有常见格式的元数据,用法简单:
- 先引入依赖(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>
- 编写提取代码:
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系统,实现相对复杂:
- 引入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>
- 示例调用(获取文件备注):
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
相关产品推荐
相关产品推荐

