1.IO流复制文件方法汇总
①字节流复制文件(FileInputStream/FileOutputStream和BufferedInputSream/BufferedOutputStream)
②字符流复制文件(InputStreamReader/OutputStreamWriter、FileReader/FileWriter、BufferedReader/BufferedWriter)
BufferedReader/BufferedWriter字符缓冲区流有三种方法,多了一种可以直接读取一行,一次写入一个字符串。其它都是两种方法。
2.代码体现
package cn.jason04;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
//InputStreamReader是FileReader的父亲,FileReader是InputStreamReader的简化版
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
//复制文件11种方法
public class Test01 {
public static void main(String[] args) throws IOException {
// 字节流
FileInputStream fis = new FileInputStream("a.txt");
FileOutputStream fos = new FileOutputStream("f.txt");
// 字节缓冲区流
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("a.txt"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("f.txt"));
// 字符流
InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"));
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("f.txt"));
FileReader fr = new FileReader("a.txt");
FileWriter fw = new FileWriter("f.txt");
// 字符缓冲区流
BufferedReader br = new BufferedReader(new FileReader("a.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("f.txt"));
// 字节流方法
copyFiles1(fis, fos);
copyFiles2(fis, fos);
copyFiles3(bis, bos);
copyFiles4(bis, bos);
// 字符流读取方法
copyFiles5(isr, osw);
copyFiles6(isr, osw);
copyFiles7(fr, fw);
copyFiles8(fr, fw);
// 高效方法
copyFiles9(br, bw);
copyFiles10(br, bw);
// 特效方法
copyFiles11(br, bw);
}
// 字节读取方法
private static void copyFiles1(FileInputStream fis, FileOutputStream fos) throws IOException {
// 一次读取一个字节
int bys = 0;
while ((bys = fis.read()) != -1) {
fos.write(bys);
}
// 关闭流
fos.close();
fis.close();
}
private static void copyFiles2(FileInputStream fis, FileOutputStream fos) throws IOException {
// 一次读取一个字节数组
byte[] bys = new byte[1024];
int len = 0;
// 读一个字节数组
while ((len = fis.read(bys)) != -1) {
fos.write(bys, 0, len);
}
// 关闭流
fos.close();
fis.close();
}
private static void copyFiles3(BufferedInputStream bis, BufferedOutputStream bos) throws IOException {
// 一次读取一个字节
int bys = 0;
while ((bys = bis.read()) != -1) {
bos.write(bys);
}
}
private static void copyFiles4(BufferedInputStream bis, BufferedOutputStream bos) throws IOException {
// 一次读取一个字节数组
byte[] bys = new byte[1024];
int len = 0;
while ((len = bis.read(bys)) != -1) {
bos.write(bys, 0, len);
bos.flush();
}
// 关闭流
bos.close();
bis.close();
}
// 字符读取方法
// 普通方法
// 方式1
public static void copyFiles5(InputStreamReader isr, OutputStreamWriter osw) throws IOException {
// 一次读取一个字符
// InputStreamReader是FileReader的父类
int ch = 0;
while ((ch = isr.read()) != -1) {
osw.write(ch);
osw.flush();
}
isr.close();
osw.close();
}
// 方式2
public static void copyFiles6(InputStreamReader isr, OutputStreamWriter osw) throws IOException {
// 一次读取一个字符数组
char[] ch = new char[1024];
int len = 0;
while ((len = isr.read(ch)) != -1) {
osw.write(ch, 0, len);
osw.flush();
}
isr.close();
osw.close();
}
// 方法3
public static void copyFiles7(FileReader fr, FileWriter fw) throws IOException {
// 普通方法一次读写一个字符
int ch = 0;
while ((ch = fr.read()) != -1) {
fw.write(ch);
fw.flush();
}
fw.close();
fr.close();
}
// 方法4
public static void copyFiles8(FileReader fr, FileWriter fw) throws IOException {
// 普通方法一次读取一个字符数组
char[] chs = new char[1024];
int len = 0;
while ((len = fr.read(chs)) != -1) {
fw.write(chs, 0, len);
fw.flush();
}
fw.close();
fr.close();
}
// 高效方法
// 方法5
public static void copyFiles9(BufferedReader br, BufferedWriter bw) throws IOException {
// 高效一次读取一个字符
int ch = 0;
while ((ch = br.read()) != -1) {
bw.write(ch);
bw.flush();
}
br.close();
bw.close();
}
// 方法6
public static void copyFiles10(BufferedReader br, BufferedWriter bw) throws IOException {
// 高效一次读取一个字符数组
char[] chs = new char[1024];
int len = 0;
while ((len = br.read(chs)) != -1) {
bw.write(chs, 0, len);
bw.flush();
}
br.close();
bw.close();
}
// 特效方法
// 方法7
public static void copyFiles11(BufferedReader br, BufferedWriter bw) throws IOException {
// 特效方式
String string = null;
// 一次读写一行
while ((string = br.readLine()) != null) {
bw.write(string);
bw.newLine();
bw.flush();
}
// 关闭输入输出流
br.close();
bw.close();
}
}
3.归纳总结
1.IO流之间关系要明确,那些流有特殊用法要明确,基本流一定要掌握。
2.读文件的时候,文件目录一定要存在,否则会抛出异常,文件目录不存在。
3.写文件的时候,会自动创建文件。