目录
前言
文件复制底层逻辑
代码实现
编辑 重点!!!
完整代码
改善思考
前言
Windows文件复制时我们是使用Ctrl C复制Ctrl V粘贴,上一篇文章Java基础入门·对存储文件的相关操作
我们学习了Java IO流对文件的读写操作,那我们可以思考一下,IO流字节的读取和写入,怎样运用到文件复制的操作中?
文件复制底层逻辑
IO流的输入流InputStream是读取文件到内存里,outputStream是把字节输出到文件里保存
文件中每个字节依次向新文件中移动,当字节全部移动完成,新文件也就copy复制成功了
代码实现
首先在Java代码中 IO流的使用,需要输入和输出,所以我们需要
绑定数据源文件 绑定要复制的目标文件(没有此文件时,输出时会自动生成)
先看一下我们要复制的文件,新建了一个1.txt文件,字符为:Hello World ,我们获取一下它的路径,写入代码中绑定,然后让其生成并保存在2.txt文件中
//字节输入流,绑定数据源文件
FileInputStream fileInputStream = new FileInputStream("F:\\Text\\1.txt");
//字节输出流,绑定复制的目标文件
FileOutputStream fileOutputStream = new FileOutputStream("F:\\Text\\2.txt");
设置字节数组缓冲,提高效率
原有的输出为1个字节1个字节地复制,设置字节数组为1024,则每次输出的大小为1KB(不一定为1024,也可以为1024的整数倍)
//字节数组缓冲
byte[] bytes = new byte[1024];
循环读取文件字节,直到read读取到末尾返回-1
这里的write后面两个参数指得是从头开始,然后读取到r个字节,就写入r个字节
最后不要忘记close关闭两个IO流(记得是两个,一个也不能少)
最后不要忘记close关闭两个IO流(记得是两个,一个也不能少)
最后不要忘记close关闭两个IO流(记得是两个,一个也不能少)
while ((r = fileInputStream.read(bytes))!=-1){
//字节输出流,写入字节数组
fileOutputStream.write(bytes,0,r);
}
fileInputStream.close();
fileOutputStream.close();
最后我们运行一下代码,可以发现是可行的,成功新建了一个文件,并把1.txt的内容复制到了2.txt里。这种方法不局限于复制文本文件,还可以进行图片,视频的复制等
重点!!!
文件名一定要注意中英文!!!
若使用的编码不对,出现中文乱码,文件就无法复制,出现报错!!!
完整代码
public class copyText {
public static void main(String[] args) throws IOException {
copy01();
}
public static void copy01() throws IOException {
//字节输入流,绑定数据源文件
FileInputStream fileInputStream = new FileInputStream("F:\\Text\\1.txt");
//字节输出流,绑定复制的目标文件
FileOutputStream fileOutputStream = new FileOutputStream("F:\\Text\\2.txt");
//字节数组缓冲
byte[] bytes = new byte[1024];
int r = 0;
//循环读取数据源文件
while ((r = fileInputStream.read(bytes))!=-1){
//字节输出流,写入字节数组
fileOutputStream.write(bytes,0,r);
}
fileInputStream.close();
fileOutputStream.close();
}
}
文件夹复制
在Java中要复制文件夹,可以通过递归来实现。
首先需要判断当前处理的文件是文件夹还是文件,如果是文件夹,就遍历文件夹下的所有文件和子目录
递归操作;如果是文件,则使用IO流来拷贝文件。
这个示例代码会将指定的源文件夹路径中的所有内容复制到指定的目标文件夹路径中,包括子文件夹和文件。需要注意的是,如果目标文件夹不存在,程序会自动创建一个。
import java.io.*;
public class CopyFolderExample {
public static void main(String[] args) {
String sourceFolder = "C:\\input"; // 源文件夹路径
String destinationFolder = "C:\\output"; // 目标文件夹路径
File sourceFile = new File(sourceFolder);
File destinationFile = new File(destinationFolder);
try {
if (sourceFile.isDirectory()) {
if (!destinationFile.exists()) {
destinationFile.mkdir();
}
String[] files = sourceFile.list();
for (String file : files) {
File srcFile = new File(sourceFile, file);
File destFile = new File(destinationFile, file);
copyFolder(srcFile, destFile);
}
} else {
InputStream inputStream = new FileInputStream(sourceFile);
OutputStream outputStream = new FileOutputStream(destinationFile);
byte[] buffer = new byte[1024];
int length;
while ((length = inputStream.read(buffer)) > 0) {
outputStream.write(buffer, 0, length);
}
inputStream.close();
outputStream.close();
}
System.out.println("Folder copied successfully.");
} catch (IOException e) {
e.printStackTrace();
System.err.println("Unable to copy folder.");
}
}
private static void copyFolder(File source, File destination) throws IOException {
if (source.isDirectory()) {
if (!destination.exists()) {
destination.mkdir();
}
String[] files = source.list();
for (String file : files) {
File srcFile = new File(source, file);
File destFile = new File(destination, file);
copyFolder(srcFile, destFile);
}
} else {
InputStream inputStream = new FileInputStream(source);
OutputStream outputStream = new FileOutputStream(destination);
byte[] buffer = new byte[1024];
int length;
while ((length = inputStream.read(buffer)) > 0) {
outputStream.write(buffer, 0, length);
}
inputStream.close();
outputStream.close();
}
}
}
改善思考
文件复制粘贴会了,那剪切是否可以尝试一下,哈哈其实就是在原有的基础上,先通过复制文件,把字节都移动后,再把原文件删除即可,这对于你们来说,应该是小意思,那就当课后作业吧!
今天的Java文章分享就到此结束了, 喜欢的小伙伴记得一键三连,点赞收藏评论,如果想了解更多内容,可以用未来百万富豪的手指,点点小小的关注!你们的支持就是我最大的动力!