流的分类
- 操作数据单位:字节流,字符流
- 数据的流向:输入流,输出流
- 流的角色:节点流,处理流
流的体系结构
抽象基类
- InputStream
- OutputStream
- Reader
- Writer
节点流(或文件流)
- FileInputStream
- FileOutputStream
- FileReader
- FileWriter
缓冲流(处理流的一种)
- BufferedInputStream
- BufferedOutputStream
- BufferedReader
- BufferedWriter
字符流
FileReader读入文件
为了保证流资源一定可以执行关闭操作,需要使用try-catch-finally处理
//实例化file类对象
File file = new File("hello.txt");
//提供具体的流
FileReader fr = new FileReader(file);
//数据读入
//read():返回读入的一个字符,如果达到文件末尾,返回-1
int data = fr.read();
while(data!=-1){
System.out.println((char) data);
data = fr.read();
}
//关闭流
fr.close();
使用read的重载方法读入
//实例化file类对象
File file = new File("hello.txt");
//提供具体的流
FileReader fr = new FileReader(file);
//数据读入
char[] cbuf = new char[5];
int len;
//read(char[] cbuf) 返回每次读入cbuf数组中的字符的个数,如果达到文件末尾,返回-1
while ((len = fr.read(cbuf))!=-1){
// for(int i=0;i<len;i++){
// System.out.println(cbuf[i]);
// }
String str = new String(cbuf,0,len);
System.out.println(str);
}
FileWriter写出数据
- 对应的file可以不存在,不会报异常
- File对应的硬盘中的文件如果不存在,在输出的过程中,会自动创建此文件。
- 如果流的构造器为:FileWriter(file,false)/FileWriter(file),会覆盖原有文件,FileWriter(file,true)不会覆盖原有文件,而是追加。
字节流
FileInputStream和FileOutputStream
- 对于文本文件(.txt .doc .java .cpp),使用字符流处理
- 对于非文本文件,使用字节流处理
缓冲流
作用:提高读写速度,因为内部提供了一个缓冲区。
//实例化file类对象
File file = new File("hello.jpg");
File file1 = new File("hello1.jpg");
//造节点流
FileInputStream fis = new FileInputStream(file);
FileOutputStream fos = new FileOutputStream(file1);
//造缓冲流
BufferedInputStream bis = new BufferedInputStream(fis);
BufferedOutputStream bos = new BufferedOutputStream(fos);
//读取 写入
byte[] buffer = new byte[10];
int len;
while ((len = bis.read(buffer))!=-1){
bos.write(buffer,0,len);
}
//先关外层流 再关内层流
bos.close();
bis.close();
//关闭外层流时,内存流也会自动进行关闭。所以内存流的关闭,可以省略
// fos.close();
// fis.close();
转换流
作用:提供字节流和字符流之间的转换
InputStreamReader:将一个字节的输入流转换为字符的输入流
和OutputStreamWriter:将一个字符的输出流转换为字节的输出流
FileInputStream fis = new FileInputStream("dpcp.txt");
//参数2具体使用哪个编码 取决于文件保存时使用的编码
InputStreamReader isr = new InputStreamReader(fis,"UTF-8");
//转换后才能用char[]接收
char[] buffer = new char[10];
int len;
while ((len = isr.read(buffer))!=-1){
System.out.println(new String(buffer,0,len));
}
isr.close();