get文件form多重文件夹

图片抽取程序

最基础的文件读写

最基础的文件读写是通过IO流来实现的,格式比较固定,只能实现文件到文件的程序处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package com.dwx.getImage;

import java.io.*;
//这是一个简单的文件读写 只能实现文件到文件
public class getImage {
//获得文件是一个递归函数
public void getImage(File fileIn,File fileOut) throws IOException {
//对于这个方法需要两个变量 一个是目标文件fileIn 一个是终点文件fileOut
//在java中 文件的存储方式是集合(list)
//通过InputStream来存储源文件 通过OutputStream来表示目标地址
FileInputStream fi = null;
FileOutputStream fo = null;
try {
//为目标文件创建成一个流
fi = new FileInputStream(fileIn);
fo = new FileOutputStream(fileOut);
//创造一个数组来存取这个文件
byte[] buffer = new byte[1024];
int len;
while ((len = fi.read(buffer))!=-1){
fo.write(buffer,0,len);
}

} catch (FileNotFoundException e) {
e.printStackTrace();
}finally {
//对于用完的资源要及时关闭
try {
fi.close();
} catch (IOException e) {
e.printStackTrace();
}
}

}
}

实现对文件的遍历

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package com.dwx.getImage;

import java.io.*;

//这个类我们来测试一下从文件夹中得到文件,并指定输出到我们想到的位置
public class getImageDemo02 {
//这个方法已经实现了对文件的遍历
public void getImage(File fileIn,File fileOut){
//我们要知道 文件类型可能是文件,也可能是文件夹
//这里我们来判断是否是一个文件夹
//通过 fileIn.listFiles就能把一个文件夹转化成list
//通过递归来实现对整个文件夹的遍历
// System.out.println(fileIn.isDirectory());
// for (File f : fileIn.listFiles()){
// System.out.println(f);
// }
//对于文件遍历 若是文件夹 就在进入下一次 如果是文件 return
if (fileIn.isDirectory()){
for(File fi:fileIn.listFiles()){
System.out.println(fi);
getImage(fi,fileOut);
}
}
//如果不是就直接返回
else{
//System.out.println(fileIn.getAbsolutePath());
return;
}

}

public static void main(String[] args) {
getImageDemo02 getImageDemo02 = new getImageDemo02();
File fi = new File("E:/get");
File fo = new File("E:/out");
getImageDemo02.getImage(fi,fo);
}
}

对完整的实现文件遍历并且下载的实现

程序作用

在得到一个多重文件夹时,提取文件夹中的文件会十分麻烦,因此,我编写了一个程序。程序能够遍历整个文件夹中的文件,并且把文件复制到我们的目标文件夹。

程序的基本思想

编写程序时的基础思想为:如果读入的是一个文件夹,就操作文件夹中的元素(文件通过file.listFiles( )将文件转换成list,通过for循环进行遍历)。如果读入的是一个文件,就copy这个文件到目标文件夹

程序的技术支持

  • I/O流 IO流的使用把文件读为一个流 对流的处理会比较简单
  • 递归的使用:程序的基本思想是递归的,因此,使用递归思想写程序更加方便,且易于理解
  • 文件名的获得:file.getName()就能获得文件的文件名 + 目标文件夹名 就能创造出一个新的文件 通过流对其进行操作

copy方法的实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package com.dwx.getImage;

import java.io.*;
//这是一个简单的文件读写 只能实现文件到文件
public class getImage {
//获得文件是一个递归函数
public void getImage(File fileIn,File fileOut) throws IOException {
//对于这个方法需要两个变量 一个是目标文件fileIn 一个是终点文件fileOut
//在java中 文件的存储方式是集合(list)
//通过InputStream来存储源文件 通过OutputStream来表示目标地址
FileInputStream fi = null;
FileOutputStream fo = null;
try {
//为目标文件创建成一个流
fi = new FileInputStream(fileIn);
fo = new FileOutputStream(fileOut);
//创造一个数组来存取这个文件
byte[] buffer = new byte[1024];
int len;
while ((len = fi.read(buffer))!=-1){
fo.write(buffer,0,len);
}

} catch (FileNotFoundException e) {
e.printStackTrace();
}finally {
//对于用完的资源要及时关闭
try {
fi.close();
} catch (IOException e) {
e.printStackTrace();
}
}

}
}

遍历(递归)方法的实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package com.dwx.getImage;

import java.io.*;

//这个类我们来测试一下从文件夹中得到文件,并指定输出到我们想到的位置
public class getImageDemo02 {
//这个方法已经实现了对文件的遍历
public void getImage(File fileIn,File fileOut){
//我们要知道 文件类型可能是文件,也可能是文件夹
//这里我们来判断是否是一个文件夹
//通过 fileIn.listFiles就能把一个文件夹转化成list
//通过递归来实现对整个文件夹的遍历
// System.out.println(fileIn.isDirectory());
// for (File f : fileIn.listFiles()){
// System.out.println(f);
// }
//对于文件遍历 若是文件夹 就在进入下一次 如果是文件 return
if (fileIn.isDirectory()){
for(File fi:fileIn.listFiles()){
getImage(fi,fileOut);
}
}
//如果不是就直接返回
else{
getImage getImage = new getImage();
System.out.println(fileIn);
System.out.println("文件名字为"+fileIn.getName());
File file = new File(fileOut+"\\"+ fileIn.getName());
System.out.println("写到了"+file.getName());
try {
getImage.getImage(fileIn,file);
} catch (IOException e) {
e.printStackTrace();
}
return;
}

}

// public static void main(String[] args) {
// getImageDemo02 getImageDemo02 = new getImageDemo02();
// File fi = new File("E:/get");
// File fo = new File("E:/out");
// getImageDemo02.getImage(fi,fo);
// }
}

主方法(main)方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package com.dwx.test;

import com.dwx.getImage.getImageDemo02;

import java.io.File;
import java.util.Scanner;

public class test {
public static void main(String[] args) {
// getImage getImage = new getImage();
// File fi = new File("E:\\get\\1.jpg");
// File fo = new File("E:\\out\\1.jpg");
// try {
// getImage.getImage(fi,fo);
// } catch (IOException e) {
// e.printStackTrace();
// }
String fileInName;
String fileOutName;
Scanner scanner = new Scanner(System.in);
System.out.print("请输入源文件夹:");
fileInName = scanner.nextLine();
System.out.print("请输入目标文件夹:");
fileOutName = scanner.nextLine();
File fileIn = new File(fileInName);
File fileOut = new File(fileOutName);
getImageDemo02 getImageDemo02 = new getImageDemo02();
getImageDemo02.getImage(fileIn,fileOut);
}
}

未来(已来)

对于这个程序还有很多能够完善的

加上下载时间

已经加上了各个图片的下载时间 时间是以毫秒为单位的

特定文件类型的获取

我给出的解决方案:增加一个过滤器,当查询到文件后,让文件后缀跟过滤器比较,比较成功就进行操作

已经实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package com.dwx.filter;

import java.io.File;

//这是一个过滤器,用来特殊过滤文件
public class Filter {
//对于一个过滤器,他有的属性就是文件后缀名
String FileLastName;
//在类被加载时就对这个属性进行初始化

public Filter(String fileLastName) {
FileLastName = fileLastName;
}
//过滤器的方法
public boolean FileFilter(File fileIn){
//立一个布尔类型的标记 来判断是否是合适的后缀文件
boolean flag = false;
//如果输入的是all 则操作所有的类型
if (FileLastName.equals("all")){
return true;
}
//获取文件的名字
String fileInName = fileIn.getName();
//获取文件名字的后缀
//字符串以.切割 然后存放到String数组中
String[] fileLastName = fileInName.split("\\.");
//通过这种方式 保证了获取到的一定是文件的后缀
int length = fileLastName.length;
if (fileLastName[length-1].equals(FileLastName)){
flag = true;
}
return flag;
}

// public static void main(String[] args) {
// Filter filter = new Filter("jpg");
// filter.FileFilter(new File("E:\\get\\1.jpg"));
//
// }
}

解决程序健壮性问题

目标文件重名问题

在原程序中 目标文件重名后是会被重写的,这不符合实际应用中的情况,因此需要进行判断是否目标文件会重名

我给出的解决方案是:在增加一个filter来过滤是否文件重名

已经较初级得解决了文件重名问题 即判断是否重名,对重名的文件重新命名

加入的过滤器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package com.dwx.filter;

import java.io.File;

public class SameFileFilter {
//在实际的文件书写过程中 可能会存在
//实际是对目标文件进行遍历
//问题在于 这个目标文件是会一直改变的 不知道能否成功
public boolean SameFileFilter(File fileOut,File file) {
boolean flag = false;
for (File f : fileOut.listFiles()){
if (f.equals(file)){
//如果在类表中找到该文件 将flag改为true
flag = true;
}
}
return flag;
}

public static void main(String[] args) {
SameFileFilter fileFilter = new SameFileFilter();
boolean b = fileFilter.SameFileFilter(new File("E:/out"), new File("E:/out/1.jpg"));
System.out.println(b);
}
}

发生改变的程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
package com.dwx.getImage;

import com.dwx.filter.Filter;
import com.dwx.filter.SameFileFilter;

import java.io.*;
import java.util.Objects;

//这个类我们来测试一下从文件夹中得到文件,并指定输出到我们想到的位置
public class getImageDemo02 {
//这个方法已经实现了对文件的遍历
public void getImage(File fileIn, File fileOut,String fileLastName) {
//我们要知道 文件类型可能是文件,也可能是文件夹
//这里我们来判断是否是一个文件夹
//通过 fileIn.listFiles就能把一个文件夹转化成list
//通过递归来实现对整个文件夹的遍历
// System.out.println(fileIn.isDirectory());
// for (File f : fileIn.listFiles()){
// System.out.println(f);
// }
//对于文件遍历 若是文件夹 就在进入下一次 如果是文件 return
if (fileIn.isDirectory()) {
for (File fi : Objects.requireNonNull(fileIn.listFiles())) {
getImage(fi, fileOut,fileLastName);
}
}
//如果不是就直接返回
else {
Filter filter = new Filter(fileLastName);
if (filter.FileFilter(fileIn)) {
getImage getImage = new getImage();


//用目标文件夹+源文件名就组成了目标文件名(全路径)
File file = new File(fileOut + "\\" + fileIn.getName());

//插入一个过滤同名文件的过滤器
SameFileFilter sameFileFilter = new SameFileFilter();
//如果这个if成立 就说明有重名文件 就把文件名在加个(00)
if(sameFileFilter.SameFileFilter(fileOut, file)){
file = new File(fileOut+"\\"+"(same)"+fileIn.getName());
}
//如果条件不成立 文件名就不会发生改变
try {
getImage.MygetImage(fileIn, file);
} catch (IOException e) {
e.printStackTrace();
}
}
}

}
}


Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.

扫一扫,分享到微信

微信分享二维码
  • Copyrights © 2015-2023 dwx
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信