IO

来源:互联网 发布:数据验证 excel 编辑:程序博客网 时间:2024/06/09 14:21
字符流的由来.
其实就是:字节流读取文字字节数据后,不直接操作而是先查指定的编码法,获取对应的文字,
在对这个文字进行操作.简单说:字节流+编码表


字节流的两个顶层父类:
1.InputStream 2.OutputStream

字符流的两个顶层父类:
1.Reader 2.Writer


这些体系的子类都以父类名作为后缀
而且子类名的前缀就是该对象的功能.





文字开始学字符流:
*重点:如果要操作文字数据.建议优先考虑字符流
而且要将数据从内存写到硬功夫盘上.要使用字符流:Writer

硬盘的数据基本体现是文件.:FileWriter.






转换流:


InputStreamReader:字节---->字符.解码
OutPutStreamWriter:字符----->字节.编码






流的操作规律:
因为流对象太多,通过四个明确即可.
1.明确源和目的(汇)
源:InputStream Reader
目的:OutputStream Writer
2.明确数据是否是纯文本数据
源:是纯文本:Reader
否: InputStream
目的:是纯文本:Writer
否:OutputStream
------------------------------------
可明确使用哪个体系..

3.明确具体的设备:
源设备: 
硬盘:File
键盘:System.in
内存:数组
网络:Socket流
目的设备:
硬盘:File
显示器/控制台:System.out
内存:数组
网络:Socket流
4.是否需要其他额外功能:
1)是否需要高效(缓冲区)
是,就加上buffer.
2)转换

需求1:复制一个文本文件
1,明确源和目的
源:InputStream Reader
目的:OutputStream Writer
2,是否是纯文本:
是:
源:Reader
目的:Writer
3,明确具体设备.
源: 硬盘:File
目的:硬盘:File
FileReader fr=new FileReader("a.txt");
FileWriter fw=new FIleWriter("b.txt");
4,需要额外功能吗?
需要,需要高效:
BufferedReader bufr=new BufferedReader(new FileReader("a.txt"));
BufferedWriter bufw=new BufferedWriter(new FIleWriter("b.txt"));


需求2:将键盘中录入 的数据,写入到一个文件中.
1,明确源和目的:
源:InputStream Reader
目的:OutputStream Writer
2,明确是否纯文本:
是:
源:Reader
目的:Writer
3,明确设备:
源:键盘,System.in
目的:File
InputStream is=System.in;
FileWriter fw=new FileWriter("b.txt");
4.需要额外功能:
需要:转换
InputStreamReader isr=new InputStreamReader(System.in);
FileWriter fw=new FileWriter("b.txt");
还需要吗?
需要:高效:
BufferedReader=bufr=new BufferedReader(new InputStreamReader(System.in));
FileWriter fw=new FileWriter("b.txt");





需求3:将一个文本文件数据显示在控制台:
1,明确源和目的:
源:InputStream Reader
目的:OutputStream Writer
2,明确是否纯文本;
是:
源:Reader 
目的:Writer
3,明确设备:
源:硬盘:File
目的:控制台:System.out
FileReader fr=new FileReader("a.txt");
OutputStream out=System.out;


4,需要其它功能:
1,需要,转换
FileReader fr=new FileReader("a.txt");
OutputStreamWriter osw=new=OutputStreamWriter(System.out);
2,需要,高效
BufferedReader bufr=new BufferedReader(new FileReader("a.txt"));
BufferedWriter bufw=new BufferedWriter(new OutStreamWriter(System.out));

需求4:读取键盘录入数据,显示在控制台上
1,明确源和目的:
源:InputStream Reader
目的:OutputStream Writer
2,明确是否是纯文本
是:
源:Reader
目的:Writer
3,明确设备:
源:键盘,System.in
目的:硬盘:System.out
InputStream in=System.in;
OutputStream out=System.out;
4,需要额外功能吗?
1,需要转换,因为都是字节流,但是操作的却是文本数据,
所以使用字符流操作起来更为便捷.
InputStreamReader isr=new InputStreamReader(System.in);
OutputStreamWriter osw=new OutputStreamWriter(System.out);
2,需要高效:
BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(System.out));






----------------------------------------------------------
5,将一个中文字符串数据按照指定的编码表写入到一个文本文件中.

1,目的:OutputStream,Writer
2,是纯文本,Writer
3,设备:硬盘,File
FileWriter fw=new FileWriter("a.txt");
fw.write("你好");
注意:既然需求中已经明确了指定编码表的动作.
那就不可以使用FileWriter,因为它内部是使用默认的本地码表.
只能使用其父类.OutputStreamWriter.
OutputStreamWriter接收一个字节输出流对象,既然是操作文件.那么该对象应该是FileOutputStream.

OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("a.txt"),charsetName);

需要高效:
BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("a.txt"),charsetName));


什么时候使用转换流?
1,源或者目的对应的设备是字节流,但是操作的却是广西数据,可以使用转换作为桥梁.搞高对文本操作的便捷.
2,一旦操作文本涉及到具体的指定编码表是,必须使用转换流.




public class Person implements Serializable/*标记接口*/{



private transient String name;//非静态数据不想被序列化,可以使用transient修饰。


/*
 * 递归:函数自身直接或者间接调用了自身.
 * 
 * 一个功能在被重复使用,并每次使用时,参与运算的结果和上一次调用 有关,这时可以用递归。
 * 
 * 
 * 
 * 注意:
 * 1,递归一定明确条件,否则容易栈溢出。
 * 2。注意一下递归的次数。
 * 
 */



/*

* Map-->Hashtable---->Properties

* Properties 集合

* 特点: 1,该集合的键和值都是字符串类型。 2,集合中的数据可以保存到流中,或者从流中获取

* 通常该集合用于操作以键和值对形式存在的配置文件。
*/
/*
 * PrintStream:
 * 1,提供了打印的方法,可以对多种数据类型值进行打印机,并保持数据的表示形式。
 * 2,不抛出IOException异常
 * 
 * 构造函数,接收三种类型的值。
 * 1,字符串路径。
 * 2,File对象
 * 3,字节输出流。
 * 
 * PrintWriter:
 * 字符打印流
 * 构造函数参数:
 * 1,字符串路径。
 * 2,File对象
 * 3,字节输出流。
 * 4。字符输出流
 * 
 */
//会出现乱码!读取指定的编码文件
FileReader fr=new FileReader("u8_1.txt");


OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("gbk_2.txt"),"GBK");
FileWriter fw=new FileWriter("gbk1.txt");
//以上两名代码的功能是相同的.
//FileWriter:其实就是转换流指定了本机默认码表的体现,而且这个转换流的子类对象,可以方便操作文本文件.
// 简单说:操作文件夹的字节流+本机默认的编码表.
// 这是按照默认码表来操作文件的便捷类.
//如果操作文本文件需要明确具体的编码,FileWriter就不行了.必须用转换流.
/*
*RandomAccessFile
* 不是io体系中的子类
*
* 特点:
* 1,该对象能读能写
* 2,该对象内部维护了一个byte数组,并通过指针可以操作灵气数组中的元素。
* 3,可以通过getFilePointor方法获取指针的位置,和通过seek方法设置指针的位置。
* 4,其实该对象就是将字节输入流和输出流进行的封装。
* 5,该对象的源或者目的只能是文件,通过构造函数就看出。
*  
*/
原创粉丝点击