明确几个基本概念:
1.字符流和字节流,自己以前根本没这个概念,对什么都是InputStream、OutputStream,今天重学IO,才发现还有Reader、Writer。基础不牢靠啊。
InputStream、OutputStream是针对字节(byte)流进行操作,Reader、Writer是针对字符(char)流进行操作。而且都是抽象类。针对字节流,常用的
有 FileInputSteam、FileOutputStream。针对字符流,有FileReader、FileWriter。
2.节点流和包装流:节点流是直接和文件打交道的,其他的都是包装流。上面提到的都是节点流。
3.常见包装流:
InputStreamReader 从字节到字符
OutputStreamWriter 从字符到字节
BufferedReader
BufferedWriter
4.千万不要忘记关闭流,千万。。
5.代码如下:
package com.study.io;
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.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;
public class CopyFileTest {
/**
* FileReader、FileWriter只能用来读写文本文件,
* FileInputStream、FileOutputStream读写文本文件。
* 而读取二进制文件,只能使用FileInputStream、FileOutputStream。
*/
public static void main(String[] args) throws Exception {
InputStream is = new FileInputStream("menu.txt"); //文件在根目录下,不是src
InputStreamReader isr = new InputStreamReader(is);//字节转字符
BufferedReader br = new BufferedReader(isr);
OutputStream os = new FileOutputStream("menu2.txt");
OutputStreamWriter osw = new OutputStreamWriter(os);//字符转字节
BufferedWriter bw = new BufferedWriter(osw);
int length = 0;
char[] buffer = new char[1024];
while((length = br.read(buffer)) != -1){
bw.write(buffer, 0, length);
}
br.close();
isr.close();
is.close();
bw.close();
osw.close();
os.close();
Reader reader = new FileReader("menu.txt");//只能读取文本文件
br = new BufferedReader(reader);
Writer writer = new FileWriter("munu3.txt");//只能写文本文件
bw = new BufferedWriter(writer);
length = 0;
buffer = new char[1024];
while((length = br.read(buffer)) != -1){
bw.write(buffer, 0, length);
}
br.close();
bw.close();
}
}