概念:
流是一个很抽象的概念,可以用手机流量这个概念来帮助理解,就是在两个设备之间来回传输的数据,就可以统称为流。
流的分类:
手机流量的流只是手机和基站之间来回传输,比较简单。但是Java里的流相对就复杂。 根据流向,分为输入流(基站)和输出流(手机),比如:可以是硬盘文件流向硬盘文件,硬盘文件流向内存,还可以是用户输入流向硬盘文件,还可以是网络上的某个地方等等。
根据流的类型,可以分为,字符流和字节流,比如文字和图片。
操作流主要的类:
Read类:字符流的主要输入流类
Writer类:字符流的主要输出流类
InputStream类:字节流的主要输入流类
OutPutStream类:字节流的主要输出流类
借助其他朋友的一张图,可以很好地理解:
该使用哪一个类更合适:
1.明确源和目的。
要明确流的来源是来自硬盘,还是内存,或者是用户输入;流的目的地是硬盘,内存还是其他地方?
2.明确操作的数据是否是寸文本的。
是:字节流操作
否:字符流操作
当明确以上2个需求以后,就可以确定使用哪一个类的对象来操作了。
比如:
将一个文件中的数据,存储到另一个文件中:复制文件。
源:硬盘文件
目的:硬盘文件
是否是纯文本:是,可以使用Reader和Writer
这样就明确地知道需要上图中的哪一个类了
因为是硬盘上的一个文件,所以需要用到文件操作的FileReader和FileWriter类
import java.io.*;
public classCopyTest2 {
public static void main(String args[]) throws IOException{
FileReaderfr = new FileReader("a.txt");
FileWriterfw = new FileWriter("a_copy1.txt");
char[] a = new char[1024];
int ch = 0;
while( (ch = fr.read()) != -1){
fw.write(ch);
}
fr.close();
fw.close();
}
}
上边的代码只是简单地读取,每次读到一个字符串就进行写操作。所以如果需要提高效率,就需要用到跟高级一点的缓冲区的类:BufferReader 和BufferWriter,这两个类提供了一整行的读取方式,可以很方便地提高效率。
package com.nightten;
import java.io.*;
public classCopyText {
public static void main(String args[]) throws IOException{
FileReaderfr = new FileReader("a.txt");
BufferedReaderbr = new BufferedReader(fr);
FileWriterfw = new FileWriter("a_copy.txt");
BufferedWriterbw = new BufferedWriter(fw);
Stringline= null;
//读取每一行
while((line = br.readLine()) != null){
bw.write(line); //整行写
bw.newLine(); // 自带的换行方法
}
br.close();
bw.close();
}
}
上边我们使用字符流来复制文件,下边我们使用字符流来复制一下图片,原理都一样。
将一个图片文件中数据存储到另一个文件中。要按照以上格式自己完成二个明确。
1,源:硬盘;目的:硬盘。
2,是否是字符: 否
import java.io.*;
public classCopyPng1 {
public static void main(String ags[]) throws IOException{
FileInputStreamfis= newFileInputStream("a.png");
FileOutputStreamfos= newFileOutputStream(newFile("a_copy.png"));
int len = 0;
while((len = fis.read()) != -1){
fos.write(len);
}
fis.close();
fos.close();
}
}
还可以把用户键盘录入的数据保存到一个文件中。
分析: 1,源:键盘;目的:硬盘
2,是否是字符:是
虽然这里键盘输入的只能是字符,单查看了一下上图和api文档,决定使用InputStreamReader类把字符流转换成字节流再进行存储比较方便。
下边是api文档的一句话:为了达到最高效率,可要考虑在 BufferedReader 内包装InputStreamReader。例如:
BufferedReader in
= newBufferedReader(new InputStreamReader(System.in));
下边是实现代码:
import java.io.*;
public classInputbykeyboard1 {
public static void main(String args[]) throws IOException{
BufferedReaderin
= new BufferedReader(new InputStreamReader(System.in));
FileOutputStream out = new FileOutputStream("bykeyboard.txt");
while(true){
int line = in.read();
out.write(line);
}
}
}
字符流和字节流可以转换:
字节流转成字符流:InputStreamReader
字符流转成字节流:OutputStreaWriter