java批量修改照片文件名为拍摄时间(Exif里获取)
手机里的照片一年整理一次。拍摄时间在Exif中获取若获取失败则使用创建时间。package auto; import com.drew.imaging.ImageMetadataReader; import com.drew.imaging.ImageProcessingException; import com.drew.metadata.Metadata; import com.drew.metadata.exif.ExifSubIFDDirectory; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.attribute.BasicFileAttributes; import java.nio.file.attribute.FileTime; import java.text.SimpleDateFormat; import java.util.Date; import java.util.TimeZone; /** * author rll * description: 批量修改照片(jpg)时间 * date 2026/8/7 */ public class PicRename { public static void main(String[] args) { //设置为GMT8小时时间对不上特意改为GMT TimeZone.setDefault(TimeZone.getTimeZone(GMT)); //TODO 修改为你要处理的文件夹路径 String folderPath F:\\test; File folder new File(folderPath); if (!folder.exists() || !folder.isDirectory()) { System.out.println(文件夹不存在或不是一个目录: folderPath); return; } File[] files folder.listFiles((dir, name) - name.toLowerCase().endsWith(.jpg)); if (files null || files.length 0) { System.out.println(文件夹内没有 .jpg 文件); return; } SimpleDateFormat sdf new SimpleDateFormat(yyyy_MM_dd HH_mm_ss); // EXIF 时间通常为本地时间无需时区转换 sdf.setTimeZone(TimeZone.getDefault()); for (File file : files) { try { Date shootingTime getShootingTime(file); String newName sdf.format(shootingTime) .jpg; File newFile new File(folder, newName); // 处理重名若文件已存在且不是同一文件添加序号 if (newFile.exists() !file.getCanonicalPath().equals(newFile.getCanonicalPath())) { newFile makeUniqueFile(folder, sdf.format(shootingTime), .jpg); } if (file.renameTo(newFile)) { System.out.println(重命名成功: file.getName() - newFile.getName()); } else { System.out.println(重命名失败: file.getName()); } } catch (Exception e) { System.err.println(处理文件失败: file.getName() , 原因: e.getMessage()); } } } /** * 优先从 EXIF 获取拍摄时间若获取失败则使用文件修改时间 */ private static Date getShootingTime(File file) throws IOException { try { Metadata metadata ImageMetadataReader.readMetadata(file); ExifSubIFDDirectory exifDir metadata.getFirstDirectoryOfType(ExifSubIFDDirectory.class); if (exifDir ! null) { Date date exifDir.getDateOriginal(); System.out.println(拍摄时间exifDir); if (date ! null) { return date; } } } catch (ImageProcessingException e) { // 无法解析 EXIF使用文件时间 } // Fallback: 使用文件最后修改时间 Path path Paths.get(file.getAbsolutePath()); BasicFileAttributes attrs Files.readAttributes(path, BasicFileAttributes.class); FileTime fileTime attrs.lastModifiedTime(); return new Date(fileTime.toMillis()); } /** * 生成不重名的文件命名格式为 baseName_序号.jpg */ private static File makeUniqueFile(File directory, String baseName, String extension) { int count 1; File candidate; do { candidate new File(directory, baseName _ count extension); count; } while (candidate.exists()); return candidate; } }

相关新闻

SUNO与Codex智能体结合:从零搭建AI音乐生成工作流实战指南

SUNO与Codex智能体结合:从零搭建AI音乐生成工作流实战指南

这类工具最值得先看的不是功能列表,而是能不能在普通环境里稳定跑起来,以及从零开始到做出第一个可用的东西,中间到底要踩多少坑。SUNO V5.5 和 Codex 智能体结合做音乐,听起来很酷,但新手最容易卡在环境配置、提示词理…

2026/10/18 7:25:34 阅读更多 →
大模型提示词工程实战:从CoT到ToT/GoT/PoT,小白也能轻松上手

大模型提示词工程实战:从CoT到ToT/GoT/PoT,小白也能轻松上手

对于刚入门大模型的小白,或是想精进提示词(Prompt)技巧、提升大模型应用效率的程序员而言,一套高效的提示词工程框架,就如同给大模型装上了“精准导航系统”——不仅能让复杂逻辑问题快速破局,更能让模型的…

2026/10/17 8:01:37 阅读更多 →
Reloaded-II终极指南:跨平台游戏模组加载器完全解析

Reloaded-II终极指南:跨平台游戏模组加载器完全解析

Reloaded-II终极指南:跨平台游戏模组加载器完全解析 【免费下载链接】Reloaded-II Universal .NET Core Powered Modding Framework for any Native Game X86, X64. 项目地址: https://gitcode.com/gh_mirrors/re/Reloaded-II 还在为游戏模组安装的复杂流程而…

2026/10/18 7:25:40 阅读更多 →

最新新闻

C#开发Modbus RTU串口调试工具:从协议解析到CRC校验全流程实战

C#开发Modbus RTU串口调试工具:从协议解析到CRC校验全流程实战

最近在调试一台现场仪表,厂家给的调试软件只能读不能写,而且界面汉化得乱七八糟,参数表里的寄存器地址还得对着文档一项项换算,烦得不行。干脆用C#在Visual Studio里自己写了个Modbus RTU主站调试工具,从串口收发到报文…

2026/10/18 19:05:12 阅读更多 →
C#/.NET/.NET Core技术前沿周刊 | 第 37 期(2025年5.1-5.11):TaoToken 统一 Key 接入 AI 编码工具链

C#/.NET/.NET Core技术前沿周刊 | 第 37 期(2025年5.1-5.11):TaoToken 统一 Key 接入 AI 编码工具链

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 19:05:12 阅读更多 →
IDEA 断点调试:点击 Run to Cursor 后不进入断点的排查思路与 TaoToken 配置验证

IDEA 断点调试:点击 Run to Cursor 后不进入断点的排查思路与 TaoToken 配置验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 19:05:12 阅读更多 →
Function Calling 与 MCP 的区别:从工具调用到上下文协议,TaoToken 统一 Key 通道怎么选

Function Calling 与 MCP 的区别:从工具调用到上下文协议,TaoToken 统一 Key 通道怎么选

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 19:05:12 阅读更多 →
Cesium动态水体仿真:基于CustomShader的高精度淹没分析

Cesium动态水体仿真:基于CustomShader的高精度淹没分析

简介:本资源是一个基于CesiumJS的WebGL三维地理可视化项目,面向GIS开发人员、数字孪生系统工程师及Web3D学习者,聚焦河流仿真与动态水体淹没分析这一典型空间模拟需求。项目通过自研着色器生成具备海洋参数、噪声扰动与反射特性的动态水纹理&…

2026/10/18 19:05:12 阅读更多 →
基于Java和RuoYi的进销存二次开发:库存事务与数据一致性实践

基于Java和RuoYi的进销存二次开发:库存事务与数据一致性实践

简介:一套基于Java与RuoYi框架二次开发的KS进销存系统设计源码,面向需要从手工账目转向信息化管理的小型经销商,也适合Java学习者作为企业级项目参考。系统以采购、销售、库存三大核心模块为主线,流程设计贴近小公司日常操作&…

2026/10/18 19:04:12 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →