java中的I/O流操作是一个重点,但是关于流的类非常之多,看的人头晕眼花,在加上什么时候输入,什么时候输出,完了,彻底崩溃了。
其实当遇到比较复杂的问题的时候,最重要的是理清思路,像剥茧抽丝一样,进行归纳总结就会发现事情并不像想象的那么复杂
从整体来看,流无非就是输入与输出
打开API文档
输入有两个类:InputStream
Reader
共同点:任何自InputStream或Reader派生而来的类都含有名为read()的基本方法
区别:InputStream是读取字节流, Reader是读取字符流
InputStream的read()方法是用于读取单个字节或字节数组
Reader的read()方法是用于读取单个字符或字符数组
输出有两个类:OutputStream
Writer
共同点:任何自OutputStream或Writer派生而来的类都含有名为write()的基本方法
区别:OutputStream是写字节流, Writer是写字符流
OutputStream的write()方法是用于读取单个字节或字节数组
Writer的write()方法是用于读取单个字符或字符数组
另一个让人困惑的就是,什么是读?什么是写?
简单的说
读就是从内存中把数据读出来
写就是把数据写进内存中去
这么简单,但为什么“流”类库让你迷惑呢?
因为创建单一的结果流,却需要创建多个对象。
下面举几个常用的I/O流的例子
文本文件的复制
方法一
- FileReader fr = new FileReader("a.txt");//要复制的文本文件
- BufferedReader br = new BufferedReader(fr);//用读字符流缓冲区套住
- FileWriter fw = new FileWriter("b.txt");//副本文件
- BufferedWriter bw = new BufferedWriter(fw);//用写字符流缓冲区套住
- while(true) {
- String temp = br.readLine();
- if(temp == null) {
- break;
- }
- bw.write(temp);
- bw.newLine();
- }
- bw.close();
- fw.close();
- br.close();
- fr.close();
方法二
- BufferedReader br = new BufferedReader(
- new InputStreamReader(new FileInputStream("a.txt")));
- PrintWriter pw = new PrintWriter(new FileOutputStream("b.txt"));
- while(true) {
- String temp = br.readLine();
- if(temp == null) {
- break;
- }
- pw.println(temp);
- }
- pw.close();
- br.close();
方法三
- InputStream in = new FileInputStream("a.txt");
- OutputStream out = new FileOutputStream("b.txt");
- byte[] bytes = new byte[1024];
- while(true) {
- int len = in.read(bytes);
- if(len == -1){
- break;
- }
- out.write(bytes, 0, len);
- }
这种方法不但可以复制文本文件还可以复制分文本的其他文件
因为非文本文件是通过字节流传输的