Java--IO流之用字节流将原文件拷贝到目标文件中
程序员文章站
2022-06-16 13:50:00
...
已经在上一篇中详细讲了字节流的概念和分类:
http://blog.csdn.net/asheandwine/article/details/78170637
在应用程序中,IO流通常都是成对出现的,输入流和输出流一起使用。
例如文件的拷贝就需要通过输入流来读取文件中的数据,通过输出流将数据写入文件。
下面例子中用 字节流InputStream和OutputStream 来操作文件 。
首先在F 盘根目录下新建一个文本文件吗 “123.txt” .里边内容随意。
再新建一个名为 “copy” 的空文件夹 。
我们的目的是将F盘根目录下的“123.txt” 拷贝到 copy 文件夹内
接下来通过一个案例来演示如何进行文件的拷贝。
void write(int b) | 向输出流中写入一个字节 |
public class FileFunction {
public static void main(String[] args) throws FileNotFoundException {
String fromFileName = "F:\\123.txt"; //原目标文件路径
String toFileName = "F:\\copy\\123.txt";//拷贝后的地址
FileFunction.copyFile(fromFileName,toFileName); // 拷贝
}
// 将原文件拷贝到目标文件中,如果原文件不存在,抛出 FileException 异常。
public static void copyFile(String fromFileName, String toFileName) throws FileNotFoundException {
//创建一个字节输入流,用于 读取 目标文件
InputStream in = new FileInputStream(fromFileName);
//创建一个字节输出流,用于将读取的数据 写入
OutputStream out = new FileOutputStream(toFileName);
int len; // 记住每次读取的字节
//开始进行读取和写入操作
try {
while ((len = in.read()) != -1) { // 是否读到文件末尾
out.write(len); // 将读到的字节写入文件
}
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("文件拷贝成功");
try {
in.close(); //关闭流
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
程序运行结束后,打开copy文件夹,发现F盘根目录下的 "123.txt" 文件被成功拷贝到了copy文件夹下。
在拷贝过程中,通过while循环将字节逐个进行拷贝,每循环一次就通过read( )的方法读取一个字节。
并通过write( )方法将该字节写入指定文件,循环往复,直到 len 的长度为-1,表示读取到了文件的末尾,
结束循环,完成文件的拷贝。
以上虽然完成了文件的拷贝。但一个字节一个字节的读写,需要频繁的操作文件,效率很低。
当通过流的方式拷贝数据时,为了提高效率可以定义一个字节数组作为缓冲区。
在拷贝文件时,可以一次性的读取多个字节,并保存在字节数组中,
然后将字节数组里的数据一次性写入文件。
如下,只需要定义一个字节数组并且通过带参数的 read()和write()方法读写即可:
void write(byte[ ] b,int off,int len) | 将指定的byte数组中从偏移量off开始的len个字节写入输出流 |
public class FileFunction {
public static void main(String[] args) throws FileNotFoundException {
String fromFileName = "F:\\123.txt"; //原目标文件路径
String toFileName = "F:\\copy\\123.txt";//拷贝后的地址
FileFunction.copyFile(fromFileName,toFileName); // 拷贝
}
// 将原文件拷贝到目标文件中,如果原文件不存在,抛出 FileException 异常。
public static void copyFile(String fromFileName, String toFileName) throws FileNotFoundException {
//创建一个字节输入流,用于 读取 目标文件
InputStream in = new FileInputStream(fromFileName);
//创建一个字节输出流,用于将读取的数据 写入
OutputStream out = new FileOutputStream(toFileName);
byte[] buff = new byte[1024];// 1 定义一个字节数组作为缓冲区
int len; // 记住每次读取的字节
//开始进行读取和写入操作
//read(buff) 实现将读到的字节一次性写入文件
try {
while ((len = in.read(buff)) != -1) { // 2 是否读到文件末尾
out.write(buff,0,len); // 3 从第一个字节开始,向文件中写入 len 个字节
}
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("文件拷贝成功");
try {
in.close(); //关闭流
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
对比上一个代码方法。只在 1 2 3 处做了更改
运行结果图:
上一篇: Java 选择一个目录 A,将 A 中的文件拷贝到目录 B 中。
下一篇: python 中的元类