IO流练习–文本文件及图片复制
1.思路
使用IO流复制文件可以总结为以下步骤
- 1.创建输入流,与要读取的源文件建立关联,
- 2.创建输出流,与要写入目标文件建立关联
- 3.创建中间变量用于临时存储读取的数据
- 4.从源文件中读取数据存入临时变量
- 5.把临时变量存储的数据存入目标文件
- 6.关闭流
按照以上步骤运用字符流与字节流方法即可
2.字符流复制文本
2.1 字符流一次读取一个字符进行复制
代码如下
import java.io.*;
public class BufferedDemo {
public static void main(String[] args) throws IOException {
//字符缓冲流写对象
//1.创建输入流,与要读取的源文件建立关联,
FileReader fr = new FileReader("lib/1.txt");
//2.创建输出流,与要写入目标文件建立关联
FileWriter fw = new FileWriter("lib/2.txt");
//3.创建中间变量用于临时存储读取的数据
//读取数据的返回值
int len;
//4.从源文件中读取数据存入临时变量,此时read()方法返回的是字符在字符集中的编号,只有非负数,返回-1时为结束标志
while((len = fr.read()) != -1){
//5.把临时变量存储的数据存入目标文件
fw.write(len);
}
//6.关闭流
fw.close();
fr.close();
}
}
2.2 字符流使用字符数组进行读取复制
代码如下:
import java.io.*;
public class BufferedDemo {
public static void main(String[] args) throws IOException {
//字符缓冲流写对象
//1.创建输入流,与要读取的源文件建立关联,
FileReader fr = new FileReader("lib/1.txt");
//2.创建输出流,与要写入目标文件建立关联
FileWriter fw = new FileWriter("lib/2.txt");
//3.创建中间变量用于临时存储读取的数据
//读取数据的返回值
int len;
//数组大小建议为1024的整数倍
char[] chs = new char[1024];
//4.从源文件中读取数据存入临时变量,此时read(chs)方法返回的是读取到的有效字符个数,返回-1时为结束标志
while((len = fr.read(chs)) != -1){
//5.把临时变量存储的数据存入目标文件
fw.write(chs,0,len);
}
//6.关闭流
fw.close();
fr.close();
}
}
- 使用字符数组效率更高
2.3 字符流使用字符缓冲流进行读取复制
代码如下
import java.io.*;
public class BufferedDemo {
public static void main(String[] args) throws IOException {
//字符缓冲流写对象
//1.创建输入流,与要读取的源文件建立关联,
FileReader fr = new FileReader("lib/1.txt");
BufferedReader br = new BufferedReader(fr);
//2.创建输出流,与要写入目标文件建立关联
FileWriter fw = new FileWriter("lib/2.txt");
BufferedWriter bw = new BufferedWriter(fw);
//3.创建中间变量用于临时存储读取的数据
//读取数据的返回值
// int len;
// //4.从源文件中读取数据存入临时变量
// while((len = br.read()) != -1){
//5.把临时变量存储的数据存入目标文件
// bw.write(len);
// }
//一次读取一行
String str;
while((str = br.readLine())!= null){
bw.write(str);
//读取一行写入一行,若没有这一行,可能存在流没有关闭,就不往目标文件中写入数据的情况。
bw.flush();
//手动换行
// bw.write("\r\n");
//或新起一行
bw.newLine();
}
//6.关闭流
bw.close();
fw.close();
br.close();
fr.close();
}
}
- 进行数据的读写时,使用缓冲流对象,读写效率更高,安全性更好
3.字节流复制图片
2.1 字节流一次读取一个字节进行复制
代码如下:
import java.io.*;
public class PutStreamDemo {
public static void main(String[] args) throws IOException {
//1.创建输入流,与要读取的源文件建立关联,
InputStream is = new FileInputStream("lib/a.jpg");
//2.创建输出流,与要写入目标文件建立关联
OutputStream os = new FileOutputStream("lib/b.jpg");
//3.创建中间变量
int len;
//4.从源文件中读取数据存入临时变量
while((len = is.read())!=-1){
//5.把临时变量存储的数据存入目标文件
os.write(len);
}
//6.关闭流
os.close();
is.close();
}
}
2.2 字节流使用字节数组进行读取复制
代码如下:
import java.io.*;
public class PutStreamDemo {
public static void main(String[] args) throws IOException {
//1.创建输入流,与要读取的源文件建立关联,
InputStream is = new FileInputStream("lib/a.jpg");
//2.创建输出流,与要写入目标文件建立关联
OutputStream os = new FileOutputStream("lib/b.jpg");
//3.创建中间变量
int len;
byte [] bys = new byte[1024];
//4.从源文件中读取数据存入临时变量
while((len = is.read(bys))!=-1){
//5.把临时变量存储的数据存入目标文件
os.write(bys,0,len);
}
//6.关闭流
os.close();
is.close();
}
}
2.3 字节流使用字节缓冲流进行读取复制
代码如下:
import java.io.*;
public class PutStreamDemo {
public static void main(String[] args) throws IOException {
//1.创建输入流,与要读取的源文件建立关联,
InputStream is = new FileInputStream("lib/a.jpg");
BufferedInputStream bis = new BufferedInputStream(is);
//2.创建输出流,与要写入目标文件建立关联
OutputStream os = new FileOutputStream("lib/b.jpg");
BufferedOutputStream bos = new BufferedOutputStream(os);
//3.创建中间变量
int len;
//4.循环读取源数据存入中间变量,
while((len = bis.read())!=-1){
//5.循环将中间变量数据写入目标文件直到结束
bos.write(len);
}
//6.关闭流
bos.close();
bis.close();
os.close();
is.close();
}
}
4.其他
- 建议:在进行纯文本复制时使用字符流,在进行视频,音频,图像等文件复制时使用字节流
- 缓冲流中缓冲池默认大小为8Kb的字节数组。
- 单个字符或字节进行复制效率太低,使用自定义数组来复制也会有空间浪费的问题,建议使用缓冲流进行复制