文档章节

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识别...

战争热诚
2018/08/14
0
0
Notification小例子

一:你可学到 手机内依据Uri查看联系人 权限的添加 获取手机内任意一款应用的应用图标 对图形的处理,如复制,为图片加上覆盖层--数字。 使用RemoteView自定义Notification 二:开始行动 新建...

迷途d书童
2012/03/30
711
1
第9章 文件IO操作、正则表达式与多线程

第9章 文件IO操作、正则表达式与多线程 我们在《第6章 扩展函数与属性》中已经介绍过Kotlin中的类扩展的特性。使用Kotlin的扩展函数功能,我们可以直接为 String 类实现一个 inc() 函数,这个...

程序员诗人
2017/10/18
0
0
《Kotin 极简教程》第15章 Kotlin 文件IO操作、正则表达式与多线程

第15章 Kotlin 文件IO操作与多线程 《Kotlin极简教程》正式上架: 点击这里 > 去京东商城购买阅读 点击这里 > 去天猫商城购买阅读 非常感谢您亲爱的读者,大家请多支持!!!有任何问题,欢迎...

程序员诗人
2017/07/24
0
0
CKEditor和CKFinder整合实现上传下载功能

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

jxlgzwh
2013/03/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

大数据教程(11.9)hive操作基础知识

上一篇博客分享了hive的简介和初体验,本节博主将继续分享一些hive的操作的基础知识。 DDL操作 (1)创建表 #建表语法CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name ...

em_aaron
56分钟前
0
0
OSChina 周四乱弹 —— 我家猫真会后空翻

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @我没有抓狂 :#今天听这个# 我艇牛逼,百听不厌,太好听辣 分享 Led Zeppelin 的歌曲《Stairway To Heaven》 《Stairway To Heaven》- Led Z...

小小编辑
今天
1
0
node调用dll

先安装python2.7 安装node-gyp cnpm install node-gyp -g 新建一个Electron-vue项目(案例用Electron-vue) vue init simulatedgreg/electron-vue my-project 安装electron-rebuild cnpm ins......

Chason-洪
今天
3
0
scala学习(一)

学习Spark之前需要学习Scala。 参考学习的书籍:快学Scala

柠檬果过
今天
3
0
通俗易懂解释网络工程中的技术,如STP,HSRP等

导读 在面试时,比如被问到HSRP的主备切换时间时多久,STP几个状态的停留时间,自己知道有这些东西,但在工作中不会经常用到,就老是记不住,觉得可能还是自己基础不够牢固,知识掌握不够全面...

问题终结者
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部