一个批量重命名照片的程序,,有一点错误!!

wang1990yujin 2011-02-19 03:41:56
在这个程序中我不会提取所有照片的拍摄时间,我应该怎样弄才能批量得到照片的拍摄时间呢??以及用得到的时间批量重命名照片呢?
import com.drew.metadata.*;
import com.drew.metadata.exif.*;
import com.drew.imaging.jpeg.JpegMetadataReader;
import com.drew.imaging.jpeg.JpegProcessingException;
import java.io.*;
import java.util.Iterator;

public class EXIFReader {

public static void main(String args[]) throws FileNotFoundException {
String []form={"JPG","jpg","JEPG","jpg","GIF","gif"};
File f = new File("E://wangyujin");//此处文件夹里有一些照片

if(f.exists()) //如果文件存在
{
File [] files=f.listFiles();//遍历文件
int p=files.length;
if(p>0)//如果文件里有文件
{
for(File fileFrom : files)//读取所有文件
{
String fromFile = fileFrom.getName();//得到原文件名
try {
//得到文件拍摄时间
ExifReader er = new ExifReader(fileForm);
Metadata exif = er.extract();
Iterator itr = exif.getDirectoryIterator();
while (itr.hasNext()) {
Directory directory = (Directory) itr.next();
formFile.renameTo(directory.getString(ExifDirectory.TAG_DATETIME_ORIGINAL));//用得到的拍摄时间重新命名文件
}
}
catch (JpegProcessingException e) {
System.err.println("not photo");
}
}
}
else
System.out.println("there is no photos in this file");
}
else
System.out.println("there is no file in this file");

}
}

...全文
425 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
黑夜愁客 2011-02-20
  • 打赏
  • 举报
回复
挺不错的一个应用啊
wang1990yujin 2011-02-20
  • 打赏
  • 举报
回复
哇!你都给正确的代码发上来了,我要再不对的话,这个东西就不用学了@@@
[Quote=引用 22 楼 magong 的回复:]
引用 20 楼 wang1990yujin 的回复:

不用给了,我已经用你的调试出来了!!!谢谢了!!

你不错啊,
几个贴,就把一个大难题解决了,速度挺快的。思路很清晰哦。
[/Quote]
wang1990yujin 2011-02-20
  • 打赏
  • 举报
回复
谢谢你们了!我不会亏待你们的!!!!!!!!!
chen870201 2011-02-20
  • 打赏
  • 举报
回复
学习了,思路很清晰
wang1990yujin 2011-02-19
  • 打赏
  • 举报
回复
第一次写java程序!!哎!!向你们看齐!!
magong 2011-02-19
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 wang1990yujin 的回复:]

不用给了,我已经用你的调试出来了!!!谢谢了!!
[/Quote]
你不错啊,
几个贴,就把一个大难题解决了,速度挺快的。思路很清晰哦。
wang1990yujin 2011-02-19
  • 打赏
  • 举报
回复
还要继续努力!多实践,,,谢谢大家!!!
wang1990yujin 2011-02-19
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 magong 的回复:]
引用 16 楼 wang1990yujin 的回复:

快有个解答的吧!!!!!!

全码如下

Java code

import com.drew.metadata.*;
import com.drew.metadata.exif.*;
import com.drew.imaging.jpeg.JpegMetadataReader;
import com.drew.ima……
[/Quote]不用给了,我已经用你的调试出来了!!!谢谢了!!
magong 2011-02-19
  • 打赏
  • 举报
回复
OK,好事做到底,使用你程序中指定的目录名,整个程序代码如下:


import com.drew.metadata.*;
import com.drew.metadata.exif.*;
import com.drew.imaging.jpeg.JpegProcessingException;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;

public class RenamePicFileWithDate {

public static void main(String args[]) throws FileNotFoundException {
String[] form = { "JPG", "jpg", "JEPG", "jpg", "GIF", "gif" };
File f = new File("E://wangyujin");// 此处文件夹里有一些照片

if (f.exists()) // 如果文件存在
{
File[] files = f.listFiles();// 遍历文件
int p = files.length;
if (p > 0){// 如果文件里有文件
for (File oldFile : files){// 读取所有文件
String oldName = oldFile.getName();// 得到原文件名
try {
// 得到文件拍摄时间
ExifReader er = new ExifReader(oldFile);
Metadata exif = er.extract();
Iterator itr = exif.getDirectoryIterator();
Date datetime = null;
while (itr.hasNext()&&(datetime==null)) {
Directory directory = (Directory) itr.next();
try {
datetime = directory.getDate(ExifDirectory.TAG_DATETIME_ORIGINAL);
} catch (MetadataException e) {
e.printStackTrace();
}
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd-HH");
String ext = oldName.substring(oldName.lastIndexOf('.'));
File newFile = new File(f + "/" + sdf.format(datetime) + ext);
int i = 0;
while (newFile.exists()){
i++;
newFile = new File(f + "/" + sdf.format(datetime) + "_" + i + ext);
}//保证同一个时间段拍摄的照片的文件名不重复
oldFile.renameTo(newFile);// 用得到的拍摄时间重新命名文件,保持扩展名不变
} catch (JpegProcessingException e) {
System.err.println("此文件不是照片文件");
}
}
} else
System.out.println("目录中没有文件");
} else
System.out.println("目录不存在");
}
}
magong 2011-02-19
  • 打赏
  • 举报
回复
注意我用的目录和你不一样,其他代码已经通过测试,没问题了。
magong 2011-02-19
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 wang1990yujin 的回复:]

快有个解答的吧!!!!!!
[/Quote]
全码如下

import com.drew.metadata.*;
import com.drew.metadata.exif.*;
import com.drew.imaging.jpeg.JpegMetadataReader;
import com.drew.imaging.jpeg.JpegProcessingException;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;

public class RenamePicFileWithDate {

public static void main(String args[]) throws FileNotFoundException {
String[] form = { "JPG", "jpg", "JEPG", "jpg", "GIF", "gif" };
File f = new File(".");// 此处文件夹里有一些照片

if (f.exists()) // 如果文件存在
{
File[] files = f.listFiles();// 遍历文件
int p = files.length;
if (p > 0){// 如果文件里有文件
for (File fileFrom : files){// 读取所有文件
String fromFile = fileFrom.getName();// 得到原文件名
try {
// 得到文件拍摄时间
ExifReader er = new ExifReader(fileFrom);
Metadata exif = er.extract();
Iterator itr = exif.getDirectoryIterator();
Date datetime = null;
while (itr.hasNext()&&(datetime==null)) {
Directory directory = (Directory) itr.next();
try {
datetime = directory.getDate(ExifDirectory.TAG_DATETIME_ORIGINAL);
} catch (MetadataException e) {
e.printStackTrace();
}
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd-HH");
String ext = fileFrom.getName().substring(fileFrom.getName().lastIndexOf('.'));
File newFile = new File(sdf.format(datetime) + ext);
int i = 0;
while (newFile.exists()){
i++;
newFile = new File(sdf.format(datetime) + "_" + i + ext);
}//保证同一个时间段拍摄的照片的文件名不重复
fileFrom.renameTo(newFile);// 用得到的拍摄时间重新命名文件,保持扩展名不变
} catch (JpegProcessingException e) {
System.err.println("not photo");
}
}
} else
System.out.println("there is no photos in this file");
} else
System.out.println("there is no file in this file");

}
}
wang1990yujin 2011-02-19
  • 打赏
  • 举报
回复
快有个解答的吧!!!!!!
wang1990yujin 2011-02-19
  • 打赏
  • 举报
回复
import com.drew.metadata.*;
import com.drew.metadata.exif.*;
import com.drew.imaging.jpeg.JpegMetadataReader;
import com.drew.imaging.jpeg.JpegProcessingException;
import java.io.*;
import java.util.Iterator;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;


public class EXIFReader {

public static void main(String args[]) throws FileNotFoundException {
String []form={"JPG","jpg","JEPG","GIF","gif"};
File f = new File("E://wangyujin");//此处文件夹里有一些照片
if(f.exists()) //如果文件存在
{
File [] files=f.listFiles();//遍历文件
int p=files.length;
if(p>0)//如果文件里有文件
{

for (File fileFrom : files)// 读取所有文件
{
String fromFile = fileFrom.getName();// 得到原文件名
try
{
// 得到文件拍摄时间
ExifReader er = new ExifReader(fileFrom);
Metadata exif = er.extract();
Iterator itr = exif.getDirectoryIterator();
Date datetime = null;
while (itr.hasNext()&&(datetime==null))
{
Directory directory = (Directory) itr.next();
try
{
datetime = directory.getDate(ExifDirectory.TAG_DATETIME_ORIGINAL);
}
catch (MetadataException e)
{
e.printStackTrace();
}
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String ext = fileFrom.getName().substring(fileFrom.getName().lastIndexOf('.'));
fileFrom.renameTo(new File(sdf.format(datetime) + ext));// 用得到的拍摄时间重新命名文件,保持原文件扩展名不变

}
catch (JpegProcessingException e)
{
System.err.println("not photo");

}break;
}


}
else
System.out.println("there is no photos in this file");
}
else
System.out.println("there is no file in this file");

}
}


wang1990yujin 2011-02-19
  • 打赏
  • 举报
回复
还是不行呀!!!没错误,但就是是不能重名名!!!
在把全码贴上来!![Quote=引用 13 楼 adooadoo 的回复:]
引用 12 楼 wang1990yujin 的回复:
在运行这句话时报错了: datetime=directory.getString(ExifDirectory.TAG_DATETIME_ORIGINAL);

Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Type mismatch……
[/Quote]
adooadoo 2011-02-19
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 wang1990yujin 的回复:]
在运行这句话时报错了: datetime=directory.getString(ExifDirectory.TAG_DATETIME_ORIGINAL);

Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Type mismatch: cannot convert from Strin……
[/Quote]
改成 datetime = directory.getDate(ExifDirectory.TAG_DATETIME_ORIGINAL);
wang1990yujin 2011-02-19
  • 打赏
  • 举报
回复
在运行这句话时报错了: datetime=directory.getString(ExifDirectory.TAG_DATETIME_ORIGINAL);

Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Type mismatch: cannot convert from String to Date

at EXIFReader.main(EXIFReader.java:41)
[Quote=引用 8 楼 magong 的回复:]
引用 3 楼 wang1990yujin 的回复:

红色高亮的地方我不会处理了!!!!


for里面的代码我帮你改过了,如下:

Java code

for (File fileFrom : files)// 读取所有文件
{
String fromFile = fi……
[/Quote]
adooadoo 2011-02-19
  • 打赏
  • 举报
回复
LS,没改啊,神奇的很
[code=Jav]String ext = fileFrom.getName().substring(fileFrom.getName().lastIndexOf('.')); File a = new File("aa"+ext);
System.out.println(a.getName());//aa.jpg
fileFrom.renameTo(a);
System.out.println(fileFrom.getName());//01.jpg[/code]
magong 2011-02-19
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 adooadoo 的回复: ]

8楼,我用了你的,但名字没有变啊,
File a = new File("aa"+ext);
System.out.println(a.getName());
fileFrom.renameTo(a);
可以打印出它的名字可就是不改啊···
[/Quote]

要在renameTo之后再getName看新名字。
adooadoo 2011-02-19
  • 打赏
  • 举报
回复
8楼,我用了你的,但名字没有变啊,[code=Jav]File a = new File("aa"+ext);
System.out.println(a.getName());
fileFrom.renameTo(a);[/code]可以打印出它的名字可就是不改啊···
magong 2011-02-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wang1990yujin 的回复:]

红色高亮的地方我不会处理了!!!!
[/Quote]

for里面的代码我帮你改过了,如下:

for (File fileFrom : files)// 读取所有文件
{
String fromFile = fileFrom.getName();// 得到原文件名
try {
// 得到文件拍摄时间
ExifReader er = new ExifReader(fileFrom);
Metadata exif = er.extract();
Iterator itr = exif.getDirectoryIterator();
Date datetime = null;
while (itr.hasNext()&&(datetime==null)) {
Directory directory = (Directory) itr.next();
try {
datetime = directory.getDate(ExifDirectory.TAG_DATETIME_ORIGINAL);
} catch (MetadataException e) {
e.printStackTrace();
}
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String ext = fileFrom.getName().substring(fileFrom.getName().lastIndexOf('.'));
fileFrom.renameTo(new File(sdf.format(datetime) + ext));// 用得到的拍摄时间重新命名文件,保持原文件扩展名不变
} catch (JpegProcessingException e) {
System.err.println("not photo");
}
}
加载更多回复(7)

50,531

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧