常用的IO流类的框架如下,重点是流式,分为字节流和字符流2种。
一、字节流和字符流的区别
- 字节流操作的基本单元是字节;字符流操作的基本单元是字符(2个字节)
- 字节流默认不使用缓冲区;字符流使用缓冲区
- 字节流通常用于处理二进制数据,不支持直接读写字符;字符流通常用于处理文本数据
- 在读写文件需要对文本内容进行处理:按行处理、比较特定字符的时候一般会选择字符流;仅仅读写文件,不处理内容,一般选择字节流
二、基本流类的使用
1. FileOutputStream:相对于内存是输出流,
fos.write()方法1 //文件输出流是用于将数据写入File或FileDescriptor的输出流 2 FileOutputStream fos = new FileOutputStream("F://out.txt"); 3 fos.write(65); 4 fos.write(','); 5 byte[] bytes ={65,66,67,68,69,70}; 6 fos.write(bytes); 7 fos.write(','); 8 fos.write(bytes,0,3); 9 fos.close();
2.FileInputStream:相对于内存是输入流,用于将数据从硬盘中读取到内存,常用的fis.read()方法
1 //从文件中读取信息到内存 2 FileInputStream fis = new FileInputStream("F://0JavaTest/in.txt"); 3 int a = fis.read();//读取单个字符 4 System.out.println((char)a); 5 byte[] bytes = new byte[10]; 6 int len = fis.read(bytes);//读取多个字符,推荐使用 7 System.out.println(new String(bytes,0,len)); 8 len = fis.read(bytes); 9 System.out.println(new String(bytes,0,len)); 10 len = fis.read(bytes); 11 System.out.println(new String(bytes,0,len)); 12 fis.close();//关闭流,释放分配的系统资源
3.FileWriter:相对于内存是字符输出流,将数据写入到硬盘文件中,是以一个字符为操作单位,适合传输文字数据等场合。
1 FileWriter fw = new FileWriter("F://0JavaTest/writer.txt"); 2 fw.write('a'); 3 fw.write(","); 4 fw.write("锄禾日当午,汗滴禾下土"); 5 fw.write(","); 6 fw.write(15);//传入ASCII码:15对应的值 7 fw.close();
4.FileReader:相对于内存是字符输入流,将数据从硬盘文件里读入到内存中,供程序操作,是以一个字符为操作单位,适合传输文字数据等场合。
1 FileReader fr = new FileReader("F://0JavaTest/reader.txt"); 2 /* // 1.每次读取一个字符 3 while(true){ 4 int a = fr.read(); 5 if(a ==-1) break; 6 System.out.println((char)a); 7 }*/ 8 9 // 2.每次读取一个字符数组 10 char[] chars = new char[100];//数组默认值为空格,多余未使用的数组位置需要处理 11 int len = fr.read(chars); 12 System.out.println(new String(chars,0,len)); 13 System.out.println("字符个数为:"+len); 14 fr.close();
三、字节流转换成字符流
1.InputStreamReader:从外部获取到字节流的场景,需要处理文本数据,用字节流直接读,会出现读1个字节,半个字符的情况,不能满足我们的需求,因此需要做字节-字符流的转换。
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
public class Demo5 {
public static void main(String[] args) throws IOException {
// 1.自己创建的或从外部获取的字节流
FileInputStream fis = new FileInputStream("F://0JavaTest/reader.txt");
// 2.将字节流”装饰“成字符流,使之能利用isr的方法操作字符流
InputStreamReader isr = new InputStreamReader(fis);
while(true){
int c = isr.read();
if(c == -1) break;
System.out.println((char)c);
}
isr.close();
}
}
2.OutputStreamWriter:从外部获取到字节流的场景,需要处理文本数据,用字节流直接操作,会出现读1个字节,半个字符的情况,因此需要做字节-字符流的转换
import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; public class Demo6 { public static void main(String[] args) throws IOException { // 1.自己创建的或从外部获取的字节流 FileOutputStream fos = new FileOutputStream("F://0JavaTest/writer.txt"); // 2.将字节流”装饰“成字符流,使之能利用osw的方法操作字符流 OutputStreamWriter osw = new OutputStreamWriter(fos); osw.write("床前明月光,疑是地上霜"); osw.flush();//刷新缓存,将缓存字符写到文件中 osw.close(); } }
四、缓存读取流
BufferedReader:只能读取字符输入流,转换成带缓存的流,提供readLine()方法,一次读取一行数据,比较方便。
1 // 4.缓存读取流,将字符输入流,转换成带有缓存的,可以一次读取一行数据 2 //FileInputStream fis = new FileInputStream("F://0JavaTest/in.txt"); 3 FileInputStream fis = new FileInputStream("E:\00java入门\KAIKEBA\CODE\Demo\com.kaikeba.c1\in2.txt"); 4 InputStreamReader isr = new InputStreamReader(fis); 5 BufferedReader br = new BufferedReader(isr); 6 while (true) { 7 String text = br.readLine(); 8 if (text != null) { 9 System.out.println(text); 10 } else { 11 break; 12 } 13 }
.