明天刚刚看完 java 的 io 流操作,把次要的脉络看了一遍,不能保障当前应用时都能得心应手,然而最起码用到时晓得有这么一个性能能够实现,上面对学习进行一下简略的总结:
IO 流次要用于硬板、内存、键盘等解决设施上得数据操作,依据解决数据的数据类型的不同能够分为:字节流(形象基类为 InPutStream 和 OutPutStream)和字符流(形象基类为 Reader 和 Writer)。依据流向不同,能够分为:输出流和输入流。其中次要构造能够用下图来示意:
字符流和字节流的次要区别:
1. 字节流读取的时候,读到一个字节就返回一个字节;字符流应用了字节流读到一个或多个字节(中文对应的字节数是两个,在 UTF- 8 码表中是 3 个字节)时。先去查指定的编码表,将查到的字符返回。
2. 字节流能够解决所有类型数据,如:图片,MP3,AVI 视频文件,而字符流只能解决字符数据。只有是解决纯文本数据,就要优先思考应用字符流,除此之外都用字节流。
IO 流次要能够分为节点流和解决流两大类。
一、节点流类型
该类型能够从或者向一个特定的地点或者节点读写数据。次要类型如下:
二、解决流类型
该类型是对一个已存在的流的连贯和封装,通过所封装的流的性能调用实现数据读写,解决流的构造方法总是要带一个其余流对象作为参数,一个流对象进过其余流的屡次包装,叫做流的链接。次要能够分为以下几种:
1、缓冲流(BufferedInPutStream/BufferedOutPutStream 和 BufferedWriter/BufferedReader)他能够进步对流的操作效率。
1、缓冲流(BufferedInPutStream/BufferedOutPutStream 和 BufferedWriter/BufferedReader)他能够进步对流的操作效率。
写入缓冲区对象:
BufferedWriter bufw=new BufferedWriter(new FileWriter("buf.txt"));
读取缓冲区对象:
BufferedReader bufr=new BufferedReader(new FileReader("buf.txt"));
该类型的流有一个特有的办法:readLine();一次读一行,到行标记时,将行标记之前的字符数据作为字符串返回,当读到开端时,返回 null,其原理还是与缓冲区关联的流对象的 read 办法,只不过每一次读取到一个字符,先不进行具体操作,先进行长期贮存,当读取到回车标记时,将长期容器中贮存的数据一次性返回。
2、转换流(InputStreamReader/OutputStreamWriter)
该类型时字节流和字符流之间的桥梁,该流对象中能够对读取到的字节数据进行指定编码的编码转换。
构造函数次要有:
InputStreamReader(InputStream); // 通过构造函数初始化,应用的是本零碎默认的编码表 GBK。InputStreamWriter(InputStream,String charSet); // 通过该构造函数初始化,能够指定编码表。OutputStreamWriter(OutputStream); // 通过该构造函数初始化,应用的是本零碎默认的编码表 GBK。OutputStreamwriter(OutputStream,String charSet); // 通过该构造函数初始化,能够指定编码表。
留神:在应用 FileReader 操作文本数据时,该对象应用的时默认的编码表,即
FileReader fr=new FileReader(“a.txt”);
与 InputStreamReader isr=new InputStreamReader(new FileInputStream(“a.txt”)); 的意义雷同。如果要应用指定表编码表时,必须应用转换流,即如果 a.txt 中的文件中的字符数据是通过 utf- 8 的模式编码,那么在读取时,就必须指定编码表,那么转换流时必须的。即:
InputStreamReader isr=new InputStreamReader(new FileInputStream("a.txt"),utf-8);
3、数据流(DataInputStream/DataOutputStream)
该数据流能够不便地对一些根本类型数据进行间接的存储和读取,不须要再进一步进行转换,通常只有操作根本数据类型的数据,就须要通过 DataStream 进行包装。
构造方法:
DataInputStreamReader(InputStream);DataInputStreamWriter(OutputStream);
办法举例:
int readInt();// 一次读取四个字节,并将其转成 int 值
writeInt(int);// 一次写入四个字节,留神和 write(int)不同,write(int)只将该整数的最低一个 8 位写入,残余三个 8 为失落
hort readShort();
writeShort(short);
String readUTF();// 依照 utf- 8 修改版读取字符,留神,它只能读 writeUTF()写入的字符数据。writeUTF(String);// 依照 utf- 8 修改版将字符数据进行存储,只能通过 readUTF 读取。
留神:在应用数据流读 / 存数据的时候,须要有肯定的程序,即某个类型的数据先写入就必须先读出,遵从先进先出的准则。
四、打印流(PrintStream/PrintWriter)
PrintStream 是一个字节打印流,System.out 对应的类型就是 PrintStream,它的构造函数能够承受三种数据类型的值:1. 字符串门路。2.File 对象 3.OutputStream
PrintStream 是一个字符打印流,它的构造函数能够承受四种类型的值:1. 字符串门路。2.File 对象 3.OutputStream 4.Writer 对于 1、2 类型的数据,能够指定编码表,也就是字符集,对于 3、4 类型的数据,能够指定主动刷新,当该主动刷新为 True 时,只有 3 个办法能够用:println,printf,format。
五、对象流(ObjectInputStream/ObjectOutputStream)
该类型的流能够把类作为一个整体进行存取,次要办法有:
Object readObject(); 该办法抛出异样:ClassNotFountException。
void writeObject(Object):被写入的对象必须实现一个接口:Serializable,否则就会抛出:NotSerializableException