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是否存在之前就已经创建了新文件,所以再判断该文件就总是存在的,就不会执行复制操作。所以虽然有重命名后的文件,文件的内容却是空的。
相关文章推荐
- java.sql.SQLException: Your password has expired.
- Myeclipse SVN插件的安装
- 5、struts2 拦截器
- java多线程的同步方法
- 20145229 《Java程序设计》第10周学习总结
- Java基础-第3天
- IT十八掌作业_java基础第六天_接口与适配器模式、多态、内部类
- 从JBoss Seam 2.x迁移到JavaEE 7之三:对象的注入
- 关于java中的锁的理解(通俗易懂)
- 20145314郑凯杰 《Java程序设计》第10周学习总结
- Java 学习日志1.3 运算符
- Java Web实用小知识01
- JAVA语言之三色排序
- Spring AOP源码分析(生成代理对象)
- java获取指定连接上的图片并保存到本地
- Spring MVC 学习 之 - URL参数传递
- [javaSE] 集合框架(ArrayList,LinkedList,Vector)
- 用Java写脚本,常用的一些方法
- eclipse NDK jni配置
- eclipse类、方法添加作者与功能描述注释