I/O输入输出(3)

字符编码

       计算机里只有数字,计算机软件里的一切都是用数字来表示的,屏幕上显示的一个个字符也不例外。

       ASCII(美国标准信息交换码)0-127a-97

       中国GB2312->GBK,每一个中文字符都用两个字节的数字来表示,中文字符的每个字节的最高位bit都为1

 

Unicode编码

ISO(国际标准化组织)将全世界所有的符号进行了统一编码,称之为Unicode编码。Unicode编码的字符都占用两个字节的大小,对于ASCII码所表示的字符,只是简单地在ACAII码原来占用的一个字节前面,增加一个所有bits0的字节。

Unicode只占用两个字节,在全世界范围内所表示的字符个数不会超过216次方(65536,实际上,Unicode编码中还保留了两千多个数值没有用于字符编码。

Java中的字符使用的都是Unicode编码,Java在通过Unicode保证跨平台特性的前提下,也支持本地平台字符集。

 

UTF-8编码

       ASCII码字符保持原样,仍然只占用一个字节,对于其它国家的字符,UTF-8使用两个或三个字节来表示。使用UTF-8编码的文件,通常都要用EF BB BF 作为文件开头的三个字节数据。

       UTF-8Unicode转换关系:

       /u0001-/u007f之间,UTF-8(byte)c

       /u0000/u0080-/u07ff之间的字符,(byte)(0xc0|(0x1f&(c>>6)))(byte)(0x80|(0x3f&c))

       /u0800-/uffff之间,

(byte)(0xe0|(0x0f&(c>>12)))(byte)(0x80|(0x3f&(c>>6)))(byte)(0x80|(0x3f&c))

       UTF-8的优点:

              不会出现内容为0x00字节

              便于应用程序检测数据在传输过程中是否发生了错误

              直接处理使用ASCII码的英文文档

       缺点:

              有些字符需用3个字节,亚洲文字尤其

UTF-16编码

       Unicode基础上进行一些细节上的扩充,增加了对Unicode编码没有包括的那些字符的表示方式

       UTF-16Unicode的扩充并没有影响Unicode编码所包括的那些字符,只是增加了对Unicode编码没有包括的那些字符的表示方式,一个使用Unicode编码的字符就是UTF-16格式的。

       Unicode编码将0xd800-0xdfff区间的数值保留出来,UTF-16扩充的字符,占用四个字节,前面两个字节的数值为0xd800-0xd8ff之间,后面两个字节的数值为0xdc00-0xdfff之间。

 

 

 

 

for(int i=0;i<strC.length();i++)

              {

                     System.out.println(Integer.toHexString((int)strC.charAt(i)));

                     byte[] buf = strC.getBytes("gb2312");

                     for(int i=0;i<buf.length;i++)

                     {

                            System.out.println(Integer.toHexString(buf[i]));

                     }

                     for (int i=0;i<buf.length;i++ )

                     {

                            System.out.write(buf[i]);

                     }

              }

视频中使用的JDK1.4版本,在JDK1.6中,并不允许在同一个函数中使用相同的变量名,故应改为:

for(int m=0;m<strC.length();m++)

              {

                     System.out.println(Integer.toHexString((int)strC.charAt(m)));

                     byte[] buf = strC.getBytes("gb2312");

                     for(int i=0;i<buf.length;i++)

                     {

                            System.out.println(Integer.toHexString(buf[i]));

                     }

                     for (int j=0;j<buf.length;j++ )

                     {

                            System.out.write(buf[j]);

                     }

              }

第二个程序中的小经验:不能在switch…case…语句中定义变量。

 

过滤流与包装类

       包装类的概念与作用

       BufferedInputStreamBufferedOutputStream

       DateInputStreamDateOutputStream

       PrintStream

       ObjectInputStreamObjectOutputStream

       字节流与字符流的转换

 

       包装类的概念与作用

              如何向文件写入浮点数?floatToIntBits(float value)

       使用DateOutputStreamDateOutputStream并没有对应到任何具体的流设备,一定要给它传递一个对应流设备的输出流对象,完成类似DateOutputStream功能的类就是一个包装类,也叫过滤流类或处理流类。

 

BufferedInputStreamBufferedOutputStream

       缓冲流为I/O流增加了内存缓冲区,增加缓冲区有两个基本目的:

              允许Java程序一次不只操作一个字节,这样提高了程序的性能。

              由于有了缓冲区,使得在流上执行skipmarkreset方法都成为可能。

       BufferedInputStreamBufferedOutputStreamJava提供的两个缓冲区包装类,不农牧民底层系统是否使用了缓冲区,这两个类在自己的实例对象中创建缓冲区。想想这种缓冲区与底层系统提供的缓冲区的区别。

 

DataInputStreamDataOutputStream

       DataInputStream类中有一个readUTF方法,而没有readBytesreadChars方法。

PrintStream

      PrintStream类提供了一系列的PrintlnPrint方法,可以将基本数据类型的数据格式化成字符串输出。

 

ObjectInputStreamObjectOutputStream

       ObjectInputStreamObjectOutputStream类是两个包装类,用于从底层输入流中读取对象类型的数据和将对象类型的数据写入到底层输出流

       ObjectInputStreamObjectOutputStream类所读写的对象必须实现了Serializable接口。对象中的transienstatic类型的成员变量不会被读取和写入。

       一个可以被序列化的MyClass类的定义:

 

字节流与字符流的转换

 

 

Java程序与其它进程的数据通信

       Java程序中可以用Process类的实例对象来表示子进程,子进程的标准输入和输出不再连接到键盘和显示器,而是以管道流的形式连接到父进程的一个输出流和输入流对象上。

       调用Process类的getOutputStreamgetInputStream方法可以获得连接到子进程的输出流和输入流对象。

 

经验:变量尽量不要放在循环语句中定义,以节省CPU资源,提高程序效率

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值