文档章节

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

困觉的曼巴er
 困觉的曼巴er
发布于 2016/05/09 16:30
字数 807
阅读 15
收藏 0
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是否存在之前就已经创建了新文件,所以再判断该文件就总是存在的,就不会执行复制操作。所以虽然有重命名后的文件,文件的内容却是空的。

© 著作权归作者所有

共有 人打赏支持
困觉的曼巴er
粉丝 1
博文 25
码字总数 12169
作品 0
其它
程序员
深入学习Tesseract-ocr识别中文并训练字库的方法

  上篇文章简单的学习了tesseract-ocr识别图片中的英文(链接地址如下:https://www.cnblogs.com/wj-1314/p/9428909.html),看起来效果还不错,所以这篇文章继续深入学习tesseract-ocr识别...

战争热诚
08/14
0
0
CKEditor和CKFinder整合实现上传下载功能

事先说明:此整合的是java版本的, 用到的有:jsp + ckeditor + ckfinder (没有servlet 及其它框架技术) 一.需要的资源: 用到的网站,文件自己下载: a) ckeditor_3.6.2 (解压) download...

jxlgzwh
2013/03/06
0
0
Guava库学习:学习Guava Files系列(一)

原文地址:Guava库学习:学习Guava Files系列(一) 对程序开发人员来说,文件的读写是很重要的一项技能。但是令人惊讶的是,尽管Java提供了一个丰富而健壮的I/O库,进行一些基本的文件操作却...

Realfighter
2015/04/30
0
0
Ant 中 *Log4j.properties 找不到文件的问题

在用 Ant 进行构建,部署,运行过程中,发现一小问题,就是在运行时总是提示“系统找不到指定的文件”。害得我花了不少时间,最后终于弄清楚了问题的原因。以下的错误代码(贴出来好让后面的...

xiaofer2008
2011/01/14
0
0
BAT等大厂Android面试书单和知识点清单

java是Android开发的基础,在BAT的初面中,会涉及到比较多的java基础知识,所以比较重要,下面我介绍的书籍内容是由浅到深。 1.Thinking in java:这本书被称为Java的三大圣经之一,虽然书比...

android自学
07/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

获取多个集合列表的笛卡尔积

获取多个集合笛卡尔积 电商中典型业务场景:商品搜索 单属性属性值之间为并查询 不同属性的属性值之间查询为与查询 import java.util.ArrayList;import java.util.List;/** * Created w...

键走偏锋
12分钟前
0
0
echarts 迁移地图 控制鼠标缩放大小比例

在网上找了好久没有找到解决方式,还是重新看了一下文档,终于找到的解决方案, zoom:1, //默认显示级别 scaleLimit:{min:1,max:3}, // 缩放级别 echarts 文档-配置项链接 http://echarts.b...

心驰
15分钟前
0
0
Boot2Docker ISO is out-of-date,

Boot2Docker ISO is out-of-date, downloading the latest release. 使用docker-machine时无法更新Boot2Docker ISO导致创建vm machine失败 解决方法:关闭网络,创建好之后再开启...

writeademo
23分钟前
0
0
在 Tomcat 中设置 Tapestry 框架的 html 热加载

如果开发中使用到了 Tapestry 这个框架,如果事先没有设置过的话,开发的时候 html 是不会热加载的,也就是说修改了 html 文件,不能刷新浏览器后立马看到修改完的效果,必须先重新启动应用服...

LeoXu
45分钟前
0
0
【微服务】开启巨石应用到微服务的探索

背景 在过去的一年时间里,我一直在从事一件事情,将现有的单体应用(巨石应用)向微服务改造。 接下来,将持续整理一些在微服务路上的学习与成长。 为什么要做微服务 单体应用,开发、部署简...

艳沐石
55分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部