Java基础笔记—第八篇(I/O流)
**
Java基础笔记—第八篇(I/O流)
**
字符流和字节流区别:
a. 字节流读取时,读到一个字节就返回一个字节,字符流使用了字节流读到一个或多个字节(2个字节的unicode字符)先去查找指定的编码表,将查到的字符返回。
b. 字节流可以处理所有类型的数据。如图片、mp3、avi,而字符流只处理字符数据。
c. 只要处理纯文本数据,就优先考虑使用字符流,除此都用字节流。
Reader中常见方法
- int read(); //读取一个字符,返回读到的字符,如果读到流的末尾,返回-1
- int read(char[] c); //将读到的字符存入指定数组中,返回读到字符个数,如果读到流的末尾,返回-1
- close(); 资源释放
Writer中常见方法
- writer(ch); //将字符写入
- writer(char[] c); //将字符数组写入
- writer(String); //将字符串写入
- flush(); //刷新流,将流中的数据刷新到目的地
- close(); //关闭资源,在关闭前先调用flush()
FileWriter:该类没有特有的方法,只有自己的构造函数
- 用于处理文本文件;
- 有默认的编码表;
- 有临时缓冲。
对于读取、写入流对象的构造函数,以及读写方法,刷新、关闭都会抛出IoException或其子类。
当指定绝对路径时,定义目录分隔符有两种:
- 反斜线,但是一定要两个:new FileWriter(“c:\demo.txt”);
- 斜线,写一个即可:new FileWriter(“c:/demo.txt”);
字符流的缓冲区:缓冲区的出现提高了对流的操作效率(原理:将数组进行封装)
- BufferedWriter——newLine():跨平台的换行符
- BufferedReader——readLine():一次读一行,到行标记时,将行标记之前的字符数据作为字符串返回,当读到末尾时,返回null。
使用缓冲区对象目的:缓冲的存在是为了增强流的功能,所以在建立缓冲区对象时,要先有流对象存在,缓冲内部就是使用流对象的方法,只是加入了数组对数据进行临时存储。
//写入缓冲区对象:
BufferedWriter bufw = new BufferedWriter(new FileWriter("buf.txt"));//将流对象作为参数传递给缓冲区的构造函数
bufw.write("abcw");
bufw.flush();
bufw.close();
//读取缓冲区对象:
BufferedReader bufr = new BufferedReader(new FileReader("buf.txt"));
String line = null;
while((line = bufr.readline())!=null){
System.out.println(line);
}
readline()原理:实质用的还是关联的流对象的read方法,只不过,在每次读到一个字符时,先不进行具体操作,先进行临时存储,当读取到回车标记时,将临时容器中存储的数据一次性返回。
字节流
byte[] bt = new byte[fis.avaiable()]创建一个刚刚好的缓冲区(弊端:文件过大,大小超出jvm内存范围,内存溢出)
转换流
InputStreamReader 字节—>字符 InputStreamReader(InputStream);
OutputStreamWriter 字符—>字节
File类
File(String filename);
//目录分隔符File.separator
File file = new File("c:"+File.separator+"abc"+File.separator+"a.txt");