<<<I、O概述及字符流基本操作>>>

来源:互联网 发布:上海绿茶网络vip 编辑:程序博客网 时间:2024/06/06 21:05

一、概述 :               
 
Java中对文件的操作是以流的方式进行的。流是Java内存中的一组有序数据序列。Java将数据从源(文件、内存、键盘、网络)读入到内存中形成流,然后将这些流还可以写到另外的目的地(文件、内存、控制台、网络),之所以称为流,是因为这个数据序列在不同时刻所操作的是源的不同分.

 

二、流的分类 :

              

Java对流的分类比较丰富,刚接触的人看了后会感觉很晕。流分类的方式很多:
 
 
1、 按照输入的方向分, (已内存而言)   从外设将数组输入流和输出流,输入输出的参照对象是Java程序.
2、按照处理数据的单位不同分,字节流和字符流,字节流读取的最小单位是一个字节(1byte=8bit),而字符流一次可以读取一个字符(1char = 16bit).
3、按照功能的不同分,分节点流和处理流,节点流是直接从一个源读写数据的流(这个流没有经过包装和修饰),处理流是在对节点流封装的基础上的一种流,FileInputStream是一个接点流,可以直接从文件读取数据,但是BufferedInputStream可以包装 FileInputStream,使得其有缓冲功能.
4、其实还有一些流 :比如:对象流、缓冲流、压缩流、文件流等等!其实都是节点流和处理流的子分类,当然你也可以创建新的流类型,只要你需要.

 

 

三、I、O流的关系 :
 
 
 
不管流的分类是多么的丰富和复杂,其根源来自于四个基本的类。这个四个类的关系如下:
 
字节流    输入流  InputStream  输出流  OutputStream

字符流    输入流    Reader    输出流    Writer !!!
 
字符流的由来:就是字节流读取文字字节数据后,不直接操作而是先查指定的编码表,获取对应的文字,在对这个文字进行操作.简单说:字节流+编码表!!

I、O流的特点 : 这些体系的子类都以父类名作为后缀,而且子类名的前缀就是该对象的功能!!!

 

 


四、流的细节 : 

 

创建一个可以往文件中写入字符数据的字符输出流对象,既然是在一个文件中写入文字数据,那么在创建对象时,就必须明确该文件.
 FileWriter构造函数中有一个是指定要写入数据的文件,比如FileWriter("Demo.txt"),如果文件不存在,则会自动创建.如果文件存在,则会被覆盖..

如果需要在指定的文件进行续写,可以在构造函数中加入true,可以实现对文件进行续写!FileWriter("Demo.txt",true),
****  其实数据是写入到临时存储缓冲区中,要想使数据写到文件中,需要刷新"flush()该方法是将数据写到目的地中"!!! 
****  我们在操作I、O流时,会自动调用Windows底层资源,所以我们在操作流之后要关闭资源."close();该方法在关闭资源前会先调用flush()"
 
 
创建读取字符数据的流对象,在创建读取流对象时,必须要明确被读取的文件,一定要确定该文件是存在的,用一个读取流关联一个已存在文件. 
比如 : FileReader("demo.txt");  构造函数中可以指定一个文件来读取. 
*****    注意一下: 字符流在读取文件数据时是依据 "-1"的出现来判断读取到结尾..

 

五、代码演示:

创建一个可以往文件中写入字符数据的字符输出流对象

public static void main(String[] args) throws IOException {//创建一个可以往文件中写入字符数据的字符输出流对象。/* * 既然是往一个文件中写入文字数据,那么在创建对象时,就必须明确该文件(用于存储数据的目的地)。 *  * 如果文件不存在,则会自动创建。 * 如果文件存在,则会被覆盖。 *  * 如果构造函数中加入true,可以实现对文件进行续写! */FileWriter fw = new FileWriter("demo.txt",true);/* * 调用Writer对象中的write(string)方法,写入数据。  *  * 其实数据写入到临时存储缓冲区中。 *  */fw.write("abcde"+LINE_SEPARATOR+"hahaha");/* * 进行刷新,将数据直接写到目的地中。 */fw.flush();/* * 关闭流,关闭资源。在关闭前会先调用flush刷新缓冲中的数据到目的地。 */fw.close();}

读取一个文本文件。将读取到的字符打印到控制台.

public static void main(String[] args) throws IOException {FileReader fr = new FileReader("demo.txt");/* * 使用read(char[])读取文本文件数据。 * 先创建字符数组。 */char[] buf = new char[1024];int len = 0;while((len=fr.read(buf))!=-1){System.out.println(new String(buf,0,len));}fr.close();}

读取一个文本文件。将读取到的字符打印到控制台.

public static void main(String[] args) throws IOException {//1,创建读取字符数据的流对象。/* * 在创建读取流对象时,必须要明确被读取的文件。一定要确定该文件是存在的。  * 用一个读取流关联一个已存在文件。  */FileReader fr = new FileReader("demo.txt");int ch = 0;while((ch=fr.read())!=-1){System.out.println((char)ch);}fr.close();}

*****I、O操作都会涉及Windows底层资源,所以会出现异常,标准的处理异常格式是:

                FileWriter fw = null;try{fw = new FileWriter("Test.txt");fw.write("text");}catch (IOException e){System.out.println(e.toString());}finally{If(fw!=null)try{fw.close();}catch (IOException e){System.out.println(e.toString());}}