java复制文件的一个小例子(实现根据图片上的内容给图片重命名)
java复制文件的一个小例子(实现根据图片上的内容给图片重命名)
困觉的曼巴er 发表于2年前
java复制文件的一个小例子(实现根据图片上的内容给图片重命名)
  • 发表于 2年前
  • 阅读 14
  • 收藏 0
  • 点赞 2
  • 评论 0

新睿云服务器60天免费使用,快来体验!>>>   

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是否存在之前就已经创建了新文件,所以再判断该文件就总是存在的,就不会执行复制操作。所以虽然有重命名后的文件,文件的内容却是空的。

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 1
博文 25
码字总数 12169
×
困觉的曼巴er
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: