您的位置:首页 > 编程语言 > Java开发

java复制文件的一个小例子(实现根据图片上的内容给图片重命名)

2016-05-09 00:00 716 查看
package cn.java.test;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Set;
import java.util.TreeMap;
/*
* 实现按照验证码图片上的字母数字组合给图片重命名
* */
public class Rename {

public static void main(String[] args) throws IOException {
//要得到一个有序的结果集用TreeMap(默认按照key的升序排列)
TreeMap<String, File> map = new TreeMap<String, File>();

//源文件夹中的文件放入一个文件数组中(要重命名得图片放在路径D:/Rename/source下)
File[] file = new File("D:/Rename/source").listFiles();

//依照的txt(其中要按照图片名称的升序来记录图片中的验证码,确保图片和要重命名的名称对应)
File rename = new File("D:/Rename/rename.txt");

//用于存放从txt文件中读取的内容得数组
ArrayList<String> as = new ArrayList<String>();

//封装文件流
BufferedReader bf = new BufferedReader(new InputStreamReader(new FileInputStream(rename)));

//把txt中的文件名放入到List中
String line ;
while((line =bf.readLine()) != null)
{
as.add(line);
}

//将原图片文件放入map
for (File f : file) {
map.put(f.getName(), f);
}

//以下这段代码的作用是为了按照map的顺序重排file数组的顺序
Set<String> set = map.keySet();

int k = 0 ;
for (String s : set) {
file[k++] = map.get(s);
//System.out.println(s);
}

for (int i = 0; i < file.length; i++) {
//得到图片
File f = file[i];
//得到名称字符串
String s = as.get(i);
//给相应的图片重命名
rename(f, s);
f.delete();
}
bf.close();
}

//实际是将原图片复制到包含新名称的路径下
private static void rename(File f,String name) throws IOException
{
FileInputStream fin = null;
String s=new String("D:/Rename/target/"+name +".jpg");
FileOutputStream fou = null;
byte [] b;
int len;

File newfile=new File(s);
if(newfile.exists()){
System.out.println(name+"文件已存在");
}else{
b= new byte[1024];
fin = new FileInputStream(f);
fou = new FileOutputStream(s);
while((len=fin.read(b)) != -1)
{
fou.write(b,0,len);
fou.flush();
}
fin.close();
fou.close();
}
}

}


1、fin.read!=-1表示还没有读到文件结尾,每从f文件读len长度的字节就放到b缓冲区中,write再从b写入到s文件中。

2、flush的作用是用于在数据缓存中数据满了之后刷新该缓存,然后对剩下的数据继续进行缓存。如果要写入的数据量很小,或者你自己定义的缓存足够大到可以保存所有数据的话,不用flush也不会丢失数据,但是如果要写入的数据大小超过缓存大小,则需要循环多步才能处理完,这时不用flush就会导致只有最前面的一些数据能够写入,而剩下的数据会丢失。

之前犯了一个小错误,运行后复制得到的目标文件下的图片内容都为空,其中rename()方法是这样写的:

private static void rename(File f,String name) throws IOException
{
FileInputStream fin = new FileInputStream(f);
String s=new String("D:/Rename/target/"+name +".jpg");
FileOutputStream fou = new FileOutputStream(s);
byte [] b;
int len;

File newfile=new File(s);
if(newfile.exists()){
System.out.println(name+"文件已存在");
}else{
b= new byte[1024];
while((len=fin.read(b)) != -1)
{
fou.write(b,0,len);
fou.flush();
}
fin.close();
fou.close();
}
}


其中FileOutputStream fou=new FileOutputStream(s);在判断newfile是否存在之前就已经创建了新文件,所以再判断该文件就总是存在的,就不会执行复制操作。所以虽然有重命名后的文件,文件的内容却是空的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: