IO流对文件即文件夹操作
- 1.四种复制文件的方法
- 2.递归删除文件夹中的所有文件,以及嵌套的文件夹和其中的文件
- 3.递归多级文件夹操作后缀名
- 4.批量将G:\java文件夹里的后缀名.png文件改为.jpg
- 5.将一个文件复制多份
- 6.递归对多级文件夹的复制操作
- 7.在复制多级文件夹时候,对里面的.jpg格式的文件,重命名(随机字符串)并改后缀名为.png
IO流的继承关系与学习的类
1.四种复制文件的方法
首先找一个稍微大一点的文件(10mb左右)放在G盘下,文件名改为video.avi
如果没有g盘,就相应的改代码中的文件路径
IO操作必须释放IO资源close();
采用多种方式,把G:\video.avi的内容复制到G:\video1.avi中
方式1:基本字节流一次读写一个字节
方式2:基本字节流一次读写一个字节数组
方式3:高效字节流一次读写一个字节
方式4:高效字节流一次读写一个字节数组
package com.jingfei.day20;
import java.io.*;
public class Demo2 {
public static void main(String[] args) throws IOException {
fanc1();
fanc2();
fanc3();
fanc4();
}
private static void fanc4() throws IOException {
//方式4:高效字节流一次读写一个字节数组
BufferedInputStream in = new BufferedInputStream(new FileInputStream("g:\\video.avi"));
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("g:\\video4.avi"));
byte[] bytes = new byte[1024];
int len = 0;
while ((len = in.read(bytes)) != -1) {
out.write(bytes, 0, len);
}
out.close();
in.close();
}
private static void fanc3() throws IOException {
//方式3:高效字节流一次读写一个字节
BufferedInputStream in = new BufferedInputStream(new FileInputStream("g:\\video.avi"));
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("g:\\video3.avi"));
int len = 0;
while ((len = in.read()) != -1) {
out.write(len);
}
out.close();
in.close();
}
private static void fanc2() throws IOException {
//方式2:基本字节流一次读写一个字节数组
FileInputStream in = new FileInputStream("g:\\video.avi");
FileOutputStream out = new FileOutputStream("g:\\video2.avi");
byte[] bytes = new byte[1024];
int len = 0;
while ((len = in.read(bytes)) != -1) {
out.write(bytes, 0, len);
}
out.close();
in.close();
}
private static void fanc1() throws IOException {
//方式1:基本字节流一次读写一个字节
FileInputStream in = new FileInputStream("g:\\video.avi");
FileOutputStream out = new FileOutputStream("g:\\video1.avi");
int len = 0;
while ((len = in.read()) != -1) {
out.write(len);
}
out.close();
in.close();
}
}
2.递归删除文件夹中的所有文件,以及嵌套的文件夹和其中的文件
删除: G盘中的java文件夹及里面的所有文件.
package com.jingfei.day20;
import java.io.File;
public class Demo {
public static void main(String[] args) {
File file = new File("G:\\java");
delFile(file);
}
private static void delFile(File f) {
File[] files = f.listFiles();
if (files != null) {
for (File file1 : files) {
if (file1.isFile()) {
file1.delete();
//System.out.println(file1.getName());
} else {
delFile(file1);
}
}f.delete();
}
}
}
3.递归多级文件夹操作后缀名
得到所有文件名为.Java的文件文件名
package com.jingfei.day20;
import java.io.File;
public class Demo {
public static void main(String[] args) {
File file = new File("G:\\java");
delFile(file);
}
private static void delFile(File f) {
File[] files = f.listFiles();
if (files != null) {
for (File file1 : files) {
if (file1.isFile()) {
System.out.println(file1.getName());
} else {
delFile(file1);
}
}
}
}
}
利用FilenameFilter文件名过滤器得到多级文件夹中的.avi文件的完整路径
package com.jingfei.day19;
import java.io.File;
import java.io.FilenameFilter;
import java.util.Arrays;
public class Demo2 {
public static void main(String[] args) {
//判断指定文件夹中是否有某后缀名的文件,输出完整路径
File file = new File("g:/java");
searchFile(file);
}
private static void searchFile(File file) {
File[] files = file.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
File file1 = new File(dir, name);
if (file1.isFile() && name.endsWith("avi")) {
return true;
} else if(file1.isDirectory()){
searchFile(file1);
return false;
}else return false;
}
});
//System.out.println(Arrays.toString(files));
if (files != null) {
for (File f : files) {
System.out.println(f.getAbsolutePath());
}
}
}
}
4.批量将G:\java文件夹里的后缀名.png文件改为.jpg
package com.jingfei.day20;
import java.io.File;
public class Demo3 {
public static void main(String[] args) {
File file = new File("G:\\java");
//将G:\java文件夹里的后缀名.png改为.jpg
delFile(file);
}
private static void delFile(File f) {
File[] files = f.listFiles();
if (files != null) {
for (File file1 : files) {
if (file1.isFile() && file1.getName().endsWith(".png")) {
String name = file1.getName();
String s = name.substring(0, name.indexOf('.'));//保留原有名称
file1.renameTo(new File(file1.getParent(), s + ".jpg"));//变为你要改的后缀名
} else {
delFile(file1);
}
}
}
}
}
5.将一个文件复制多份
必须放入循环中,如果不放循环中,必须重新new你复制的那个文件,将指针重新置于开头,否则会出现只有第一个有内容,之后的都是空的.
package com.jingfei.day20;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo4 {
public static void main(String[] args) throws IOException {
File file = new File("D:\\test.txt");
byte[] bytes = new byte[1024];//缓冲区1024字节
for (int i = 0; i < 3; i++) {
FileInputStream in = new FileInputStream("d:\\test.txt");
//必须放入循环中,如果不放循环中,必须重新new,将指针重新置于开头
//否则会出现只有第一个有内容,之后的都是空的.
FileOutputStream out = new FileOutputStream("d:\\file"+i+".txt");//区别文件名
int len = 0;//得到读到字节实际长度,可能会为存满
while ((len = in.read(bytes)) != -1) {
out.write(bytes,0,len);//写入从0索引开始,长度为len
}
out.close();
in.close();
}
}
}
6.递归对多级文件夹的复制操作
复制单个文件
复制整个文件:复制多级文件夹
思路:
1.封装整个原文件夹
2.创建目标文件夹
3.遍历源文件夹,将原文件夹下的所有文件,复制到目标文件夹
package com.westos.Demo2;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.UUID;
/**
* @Author: Administrator
* @CreateTime: 2019-01-17 10:02
*/
public class CopyFileDemo2 {
public static void main(String[] args) throws IOException {
//复制单个文件
//复制整个文件:复制多级文件夹
//思路:1.封装整个原文件夹
//2.创建目标文件夹
//3.遍历源文件夹,将原文件夹下的所有文件,复制到目标文件夹
File srcFolder = new File("G:\\java");
//封装目标文件夹
File targetFolder = new File("D:\\java");
//如果目标文件夹不存在,就创建出来
if (!targetFolder.exists()) {
targetFolder.mkdirs();
}
//进行复制操作
copyFolders(srcFolder, targetFolder);
}
private static void copyFolders(File srcFolder, File targetFolder) throws IOException {
//实现复制操作
File[] files = srcFolder.listFiles(); //获取该目录下,所有的文件和文件夹
//遍历复制每个文件
for (File f : files) {
if (f.isFile()) {
copyFile(f, targetFolder);
} else {
//如果是文件夹,
// 1. 封装整个原文件夹
//3.递归调用
File detFile = new File(targetFolder + "\\" + f.getName());
if (!detFile.exists()) {
detFile.mkdirs();
}
copyFolders(f, detFile);
}
}
}
private static void copyFile(File f, File targetFolder) throws IOException {
FileInputStream in = new FileInputStream(f);
FileOutputStream out = new FileOutputStream(new File(targetFolder, f.getName()));
byte[] bytes = new byte[1024 * 8];
int len = 0;
while ((len = in.read(bytes)) != -1) {
out.write(bytes, 0, len);
out.flush();
}
in.close();
out.close();
}
}
7.在复制多级文件夹时候,对里面的.jpg格式的文件,重命名(随机字符串)并改后缀名为.png
对6中的代码加了一个方法重载
package com.westos.Demo2;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.UUID;
/**
* @Author: Administrator
* @CreateTime: 2019-01-17 10:02
*/
public class CopyFileDemo2 {
public static void main(String[] args) throws IOException {
//复制单个文件
//复制整个文件:复制多级文件夹
//思路:1.封装整个原文件夹
//2.创建目标文件夹
//3.遍历源文件夹,将原文件夹下的所有文件,复制到目标文件夹
File srcFolder = new File("G:\\java");
//封装目标文件夹
File targetFolder = new File("D:\\java");
//如果目标文件夹不存在,就创建出来
if (!targetFolder.exists()) {
targetFolder.mkdirs();
}
//进行复制操作
copyFolders(srcFolder, targetFolder);
}
private static void copyFolders(File srcFolder, File targetFolder) throws IOException {
//实现复制操作
File[] files = srcFolder.listFiles(); //获取该目录下,所有的文件和文件夹
//遍历复制每个文件
for (File f : files) {
if (f.isFile()) {
//生成随机的名称
if (f.getName().endsWith(".jpg")) {
//生成随机字符串去前16位
String string = UUID.randomUUID().toString().replace("-", "").substring(0, 16);
String name = string+".png";//这是你要重命名的格式,我用的是随机字符串
copyFile(f, targetFolder,name);//方法重载
//f.renameTo();//不能用这个,这个是剪贴并改名
} else {
copyFile(f, targetFolder);
}
} else {
//如果是文件夹,
// 1. 封装整个原文件夹
//3.递归调用
File detFile = new File(targetFolder + "\\" + f.getName());
if (!detFile.exists()) {
detFile.mkdirs();
}
copyFolders(f, detFile);
}
}
}
private static void copyFile(File f, File targetFolder) throws IOException {
FileInputStream in = new FileInputStream(f);
FileOutputStream out = new FileOutputStream(new File(targetFolder, f.getName()));
byte[] bytes = new byte[1024 * 8];
int len = 0;
while ((len = in.read(bytes)) != -1) {
out.write(bytes, 0, len);
out.flush();
}
in.close();
out.close();
}
private static void copyFile(File f, File targetFolder,String name) throws IOException {
FileInputStream in = new FileInputStream(f);
FileOutputStream out = new FileOutputStream(new File(targetFolder, name));//变化的部分在这里
byte[] bytes = new byte[1024 * 8];
int len = 0;
while ((len = in.read(bytes)) != -1) {
out.write(bytes, 0, len);
out.flush();
}
in.close();
out.close();
}
}
谢谢!