Java IO

来源:互联网 发布:微信排雷软件 编辑:程序博客网 时间:2024/06/05 07:04

流是指一连串流动的字符,是以先进先出方式发送信息的通道!


★ 明确数据所在的设备: 
源设备: 
键盘(System.in) 
硬盘(FileXXX)FileReader FileInputStream 
内存(数组)ByteArrayInputStream CharArrayReader StringReader 
网络(Socket) 
目的设备: 
显示器(控制台System.out) 
硬盘(FileXXX)FileWriter FileOutputStream 
内存(数组)ByteArrayOutputStream CharArrayWriter StringWriter 
网络(Socket)

★ 明确是否需要额外功能
1) 是否需要高效?缓冲区Buffered (字符与字节各两个)。 
2) 是否需要转换?转换流 InputStreamReader OutputStreamWriter 
3) 是否操作二进制数据类型? DataInputStream DataOutputStream 
4) 是否操作对象(对象序列化)? ObjectInputStream ObjectOutputStream 
5) 需要对多个源合并吗? SequenceInputStream 
6) 需要保证数据的表现形式到目的地吗? PrintStream 或 PrintWriter

练习1:用IO流复制一个文本文件。

1、明确源和目的。

源:InputStream Reader 
目的:OutputStream Writer

2、处理的数据是否是纯文本的数据?

源:Reader 
目的:Writer

3、明确是否需要额外功能?

BufferedReader br = new BufferedReader(new FileReader(“my.txt”)); 

BufferedWriter  bw = new BufferedWriter(new FileWriter(“you.txt”));

练习2:用IO流复制一个图片文件。 
1、明确源和目的。

源:InputStream Reader 
目的:OutputStream Writer

2、处理的数据是否是纯文本的数据?

源:InputStream 
目的:OutputStream

3、明确数据所在的设备。

源:file(硬盘) FileInputStream fis = new FileInputStream(“cat.jpg”); 
目的:file(硬盘) FileOutputStream fos = new FileOutputStrema(“cats.jpg”);

4、明确是否需要额外功能?

BufferedInputStream bufin = new BufferedInputStream( fis ); 
BufferedOutputStream bufout = new BufferedOutputStream( fos );

练习3:用IO流读取键盘录入,存储到一个文件中。 
1、明确源和目的

源:InputStream Reader 
目的:OutputStream Writer

2、处理的数据是否是纯文本的数据?

源:Reader 
目的:Writer

3、明确数据所在的设备。

源:键盘 InputStream in = System.in; 
目的:硬盘 FileWriter fw = new FileWriter(“my.txt”);

4、明确是否需要额外功能? 
(必须要将键盘录入的字节转成字符。 需要将字节–>字符的转换流。InputStreamReader 还想需要高效。
InputStreamReader isr = new InputStreamReader(System.in); 
FileWriter fw = new FileWriter(“a.txt”); 
BufferedReader bufr = new BufferedReader( isr); 
BufferedWriter bufw = new BufferedWriter( fw );

练习4:用IO流读取一个文本文件,显示到显示器上。 
1、明确源和目的。

源:InputStream Reader 
目的:OutputStream Writer

2、处理的数据是否是纯文本的数据?

源:Reader 
目的:Writer

3、明确数据所在的设备。

源:硬盘 FileReader fr = new FileReader(“a.txt”); 
目的:显示器 OutputStream out = System.out;

4、明确是否需要额外功能? 
(要将字符数据转换成字节输出。 输出转换流:OutputStreamWriter 还想需要高效。)

FileReader fr = new FileReader(“a.txt”); 
OutputStreamWriter osw = new OutputStreamWriter(System.out);

BufferedReader bufr = new BufferedReader( fr); 
BufferedWriter bufw = new BufferedWriter( osw );

练习需求5:用IO流读取一个文本文件,将文本按照指定的编码表UTF-8写入到另一个文件中。

1、明确源和目的。

源:InputStream Reader 
目的:OutputStream Writer

2、处理的数据是否是纯文本的数据?

源:Reader 
目的:Writer

3、明确数据所在的设备。

源:硬盘 FileReader fr = new FileReader(“a.txt”); 
目的:硬盘 FileOutputStream fout = new FileOutputStream(“b.txt”);

4、明确是否需要额外功能? 
(假定输出时要为字符数据指定编码表。转换流中的参数需要字节流,因此用FileOutputStream。 转换流:OutputStreamWriter,还想需要高效。)

FileReader fr = new FileReader(“a.txt”); 
OutputStreamWriter osw = new OutputStreamWriter(fout,”utf-8”);

BufferedReader bufr = new BufferedReader( fr); 
BufferedWriter bufw = new BufferedWriter( osw );

常见的编码表

ASCII:美国标准信息交换码。 用一个字节的7位可以表示。 
ISO8859-1:拉丁码表。欧洲码表 用一个字节的8位表示。 
GB2312:中国的中文编码表。 
GBK:中国的中文编码表升级,融合了更多的中文文字符号。 
Unicode:国际标准码,融合了多种文字。 所有文字都用两个字节来表示,Java语言使用的就是unicode 
UTF-8:一种变长的unicode码的实现方式,由1~4个字节表示。

Unicode和UTF-8的关系

★ Unicode

世界上存在着多种编码方式,同一个二进制数字可以被解释成不同的符号。因此,要想打开一个文本文件,就必须知道它的编码方式,否则用错误的编码方式解读,就会出现乱码。为什么电子邮件常常出现乱码?就是因为发信人和收信人使用的编码方式不一样。 
可以想象,如果有一种编码,将世界上所有的符号都纳入其中。每一个符号都给予一个独一无二的编码,那么乱码问题就会消失。这就是Unicode,就像它的名字都表示的,这是一种所有符号的编码。 
Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。

★ UTF-8

UTF-8是在互联网上使用最广的一种unicode的实现方式。其他实现方式还包括UTF-16和UTF-32,不过在互联网上基本不用。UTF-8是Unicode的实现方式之一。

★ UTF-8的编码格式 
UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。

UTF-8的编码规则很简单,只有二条: 
1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。 
2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。

0 0
原创粉丝点击