java中IO流巩固学习1
1.java流中的整体分类图
其他常用与流相关的对象:
2.IO流
IO流:主要用于处理设备上的数据
如:硬盘,内存,键盘的录入
IO有具体的分类:1.根据处理数据类型的不同:字节流和字符流。2.根据流向不同:输入流和输出流
字符流的由来:因为文件的编码不同,而有了对字符进行高效操作的字符流对象。
原理:其实就是基于字节流读取字节时,去查了指定的编码表。
字节流和字符流的区别:
1.字节流读取的时候,读到一个字节就返回一个字节。字符流使用了字节流读到一个或者多个字节时(中文对应的字节市两个,在UTF-8编码表中是3个字节),先去查指定的编码表,将查到的字符返回。
2.字节流可以处理所有的数据类型,如MP3,AVI等。字符流只能处理字符数据。
结论:只要是纯文本优先考虑字符流,其他一律用字节流。
IO体系所具备的基本功能:读和写
1.字节流:InputStream(读),OutputStream(写)
2.字符流:Reader(读),Writer(写)
基本的读写操作方式:
因为数据通常是以文件形式存在,所以就要找到IO体系中可以用于操作文件的流对象。通过名称可以更容易获得改对象,因为IO体系中的子类名后缀绝大部分是父类的名称,而前缀都是体现子类功能的名字。
Reader《-----------InputStreamReader《-------------FileReader:专门用于处理文件的字符流读取对象
Writer《---------OutputStream《-------------FileWriter:专门用于处理文件的字符流写入对象
Reader中常见的方法:
1. int read():读取一个字符,返回的是读到的哪个字符,如果读到流的末尾,则返回-1.
2.int read(char[]):将读到的字符存入到指定的数组中,返回的是读到的字符个数,也就是往数组里装的元素的个数,如果读到流的末尾,则返回-1.
3.close():读取字符其实用的是windows的系统功能,就是希望使用过后,进行资源释放。
Writer中常见的方法:
1.writer(ch):将一个字符写入到流中。
2.writer(char[]):将一个字符数组写入到流中。
3.writer(string):将一个字符串写入到流中。
4.flush():刷新流,将流中的数据刷新到目的地中,流还存在。
5.close():关闭资源,在关闭前先会调用flush(),刷新流中的数据到目的地,然后关闭流。
FileWriter:该类没有特定的方法,只有自己的构造函数。
该类的特点在于:
1.用于处理文本文件
2.该类中有默认的编码表
3.该类中有临时缓冲
构造函数:在写入流对象初始化时,必须要有一个存储数据的目的地,FileWriter(String filename)
构造函数又做了什么事情呢?
1.调用系统资源
2.在指定的位置创建文件(如果该文件已经存在,则覆盖该文件)
FileWriter(String filename,boolean append):该构造函数:当传入的boolean参数为true时,会在指定文件末尾处进行数据的续写。
FileReader:
1.用于读取文本文件的流对象
2.用于关联文本文件
构造函数:在读取流对象初始化的时候,必须要指定一个被读取的文件。如果该文件不存在,会发生FileNotFoundException.
FileReader(String filename)
demo1:
import java.io.IOException;
* 完整的异常处理机制
* @author jt
*
*/
public class Demo2 {
public static void main(String[] args) {
FileWriter fw = null;
try {
fw = new FileWriter("d:\\demo2.txt");
fw.write("abcda");
fw.flush();
fw.write("kkkk");
} catch (IOException e) {
System.out.println(e.toString());
}finally{
if(fw!=null){
try {
fw.close();
} catch (IOException e) {
System.out.println("close:"+e.toString());
}
}
}
}
}
对于读取或写入流对象的构造函数,以及读写方法,还有刷新关闭方法都会抛出IOException或其子类,所以要进行处理throws或者try,catch处理
完整的处理异常方式:
import java.io.IOException;
* 完整的异常处理机制
* @author jt
*
*/
public class Demo2 {
public static void main(String[] args) {
FileWriter fw = null;
try {
fw = new FileWriter("d:\\demo2.txt");
fw.write("abcda");
fw.flush();
fw.write("kkkk");
} catch (IOException e) {
System.out.println(e.toString());
}finally{
if(fw!=null){
try {
fw.close();
} catch (IOException e) {
System.out.println("close:"+e.toString());
}
}
}
}
}
另外一个细节:
当指定绝对路径时,定义目录分隔符有两种方式,1.反斜杠:\\一定要写两个 new FileWriter("d:\\demo1.txt") 2.斜杠 / 只写一个就可以了 new FileWriter("d:/demo2.txt")
读取一个已有的文本文件,将文本文件打印出来,一次读一个字符就打印出来,效率不高。
package learn1;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
/**
* 读取一个已有的文本文件
* 一次读一个字符就打印出来
* @author jt
*
*/
public class Demo3 {
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("d:/demo.txt");
int ch=0;
//一次读一个字符
while((ch = fr.read())!=-1){
System.out.println((char)ch);
}
fr.close();
}
}
读一个字符就存入一个字符数组,读完1KB在打印出来
import java.io.FileReader;
import java.io.IOException;
* 读一个字符就存入字符数组,读完1KB在打印
* @author jt
*
*/
public class Demo4 {
public static void main(String[] args) {
FileReader fr = null;
try {
fr = new FileReader("d:/demo.txt");
char[] buf = new char[1024];//该长度通常是1024的整数倍
int len=0;
while((len=fr.read(buf))!=-1){
System.out.println(new String(buf,0,len));
}
} catch (IOException e) {
System.out.println(e.toString());
}finally{
if(fr !=null){
try {
fr.close();
} catch (IOException e) {
System.out.println("close:"+e.toString());
}
}
}
}
}
字符流的缓冲区:缓冲区的出现提高了对流的操作效率,原理就是将数组进行封装。
对应的对象:
BufferedWriter:特有方法:newLine():跨平台的换行符
BufferedReader:特有方法:readLine():一次读一行,到行标记时,将行标记之前的字符数据作为字符串返回,当读到末尾时,返回null.
在使用缓冲区对象时,要明确,缓冲的存在是为了增强流的功能而存在,所以建立缓冲区对象时,要先有流对象存在。其实缓冲内部就是在使用流对象的方法,只不过加入了数组对数据进行了临时缓存。为了提高操作数据的效率。