文档章节

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
第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
Guava库学习:学习Guava Files系列(一)

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

Realfighter
2015/04/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

MySQL SQL 常见用法

某字段重复记录 select a.fieldA from tableA a group by a.fieldA having count(a.fieldA)>1;==select * from (select a.fieldA, count(1) as faCount from tableA a group......

园领T
58分钟前
1
0
如何使用 iptables 和 firewalld 工具来管理 Linux 防火墙规则

以下是如何使用 iptables 和 firewalld 工具来管理 Linux 防火墙规则。 防火墙 防火墙是一组规则。当数据包进出受保护的网络区域时,进出内容(特别是关于其来源、目标和使用的协议等信息)会...

linuxprobe16
今天
1
0
发生系统错误 5 拒绝访问

1、使用命令net start *开启一个服务的时候,出现发生系统错误5,拒绝访问。 解决:切换到管理员模式执行此命令即可。

fang_faye
今天
1
0
devops 成长路线

https://36kr.com/p/5157249.html

swingcoder
今天
1
0
Java内存区域的划分和异常

行时数据区域 JVM在运行Java程序时候会将内存划分为若干个不同的数据区域。 程序计数器 线程私有。可看作是当前线程所执行的字节码的行号指示器,字节码解释器的工作是通过改变这个计数值来读...

架构师springboot
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部