**近期学习过程中,需要对图片分类结果进行可视化展示,代码结果有图片的名称对应的类别,现需要将属于同一个类别的图片复制或移动到相同的文件夹中。
检索发现没有好用的代码,于是自己改改删删有了以下版本,新手上路,请多指教,感谢!
**
**案列介绍:
下图有六张图片,需要按照1.txt中的分类结果将图片进行分类,通过以下代码,可以实现将图片复制或移动到对应类别文件夹下的功能,如图3所示。
两个代码的区别在于:
1.复制代码完成后,原文件夹图片复制后依然存在;
2.移动代码完成后,原文件夹图片移动后不存在。**
1.复制目标图片至指定文件夹
package movepicture;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/*
* 这个是图片,对应movepic
*/
public class copy_move {
//方法importCsv的作用是读取txt,在这里用于读取需要移动的图片ID
public static List<String> importCsv(File file){
List<String> dataList=new ArrayList<String>();
BufferedReader br=null;
try {
br = new BufferedReader(new FileReader(file));
String line = "";
while ((line = br.readLine()) != null) {
dataList.add(line);
}
}catch (Exception e) {
}finally{
if(br!=null){
try {
br.close();
br=null;
} catch (IOException e) {
e.printStackTrace();
}
}
}
return dataList;
}
private static void copyFile(File srcFile,File destFile) throws IOException {
//该方法为复制文件,srcFile是原文件所在地址,destFile是目标文件所在地址
File[] fileArray1 = srcFile.listFiles();
File[] fileArray2 = destFile.listFiles();
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFile));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile));
byte[] bys = new byte[1024];
int len = 0;
while ((len = bis.read(bys)) != -1)
{
bos.write(bys, 0, len);
}
bos.close();
bis.close();
}
public static void main(String[] args) throws IOException {
/*
* sourceFile 是所有的图片初始存放的集合
* dataList 是图片分类的txt 格式:class p1 p2 (class为类别,p1 p2为图片名称,中间用空格分开),后附图
* 用importCsv方法读取datalist中每一个图片id用于分类
* targetFile 是图片类别的文件夹,设置该对象的目的是用于判断类别所在文件夹是否为空,为空的话用mkdir创建一个
* as[0]为类别的文件夹名称,如上例中的1、2 ,as[m]为图片的名称
* */
File sourceFile = new File("******\\testcopy\\all");
List<String> dataList=importCsv(new File("******\\testcopy\\1.txt"));
if(dataList!=null && !dataList.isEmpty()){
for(int i=0; i<dataList.size();i++ ){
String s=dataList.get(i);
String as[] = s.split("\\s+");
for(int m=1;m<as.length;m++) {
File targetFile = new File("******\\testcopy\\tesy\\"+as[0]+"\\");
File srcFile = new File(sourceFile+"\\"+as[m]+".jpg");
File destFile = new File(targetFile+"\\"+as[m]+".jpg");
// 下面两行用于输出需要复制的图片地址用于检查
// System.out.println(sourceFile+"\\"+as[m]+".jpg");//为srcFile
// System.out.println(targetFile+"\\"+as[m]+".jpg");// 为destFile
if (!targetFile.exists()) {
targetFile.mkdir();
}
// 调用copyFile方法,依次复制目标图片到指定位置
copyFile(srcFile,destFile);
}
}
}
}
}
2.移动目标图片至指定文件夹
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class movepic {
//importCsv读取txt中图片的ID
public static List<String> importCsv(File file){
List<String> dataList=new ArrayList<String>();
BufferedReader br=null;
try {
br = new BufferedReader(new FileReader(file));
String line = "";
while ((line = br.readLine()) != null) {
dataList.add(line);
}
}catch (Exception e) {
}finally{
if(br!=null){
try {
br.close();
br=null;
} catch (IOException e) {
e.printStackTrace();
}
}
}
return dataList;
}
private static void moveFile2(File sourceFile,File targetFile) {
//该方法为复制文件,sourceFile源文件夹路径(存放图片路径), targetFile是目标文件夹路径(没有会自动创建)
File[] fileArray1 = sourceFile.listFiles();
File[] fileArray2 = targetFile.listFiles();
for (File file : fileArray1) {
// SUFFIX用于判断指定图片是否存在,如果存在就不移动并且输出“文件已存在”
if (file.getName().contentEquals(SUFFIX)) {
targetFile = new File( targetFile + "\\"+file.getName());
if (targetFile.exists()) {
System.out.println("文件已存在");
} else {
file.renameTo(targetFile);
System.out.println("移动文件成功");
}
}
}
}
public static String SUFFIX = null;
public static void main(String[] args) {
// 源文件夹路径(存放图片路径)
File sourceFile = new File("******\\testcopy\\all");
//目标文件夹路径(没有会自动创建)
//图片id的地址
List<String> dataList=importCsv(new File("******\\testcopy\\1.txt"));
if(dataList!=null && !dataList.isEmpty()){
for(int i=0; i<dataList.size();i++ ){
String s=dataList.get(i);
String as[] = s.split("\\s+");
for(int m=1;m<as.length;m++) {
File targetFile = new File("******\\testcopy\\tesy\\"+as[0]+"\\");
SUFFIX = as[m] + ".jpg";
if (!targetFile.exists()) {
targetFile.mkdir();
}
// 调用moveFile2方法,依次移动目标图片到指定位置
moveFile2(sourceFile,targetFile);
}
}
}
}
}