一、概述 :
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());
}
}