----------------------ASP.Net+Android+IOS开发.Net培训、期待与您交流! -----------
黑马程序员_java基础篇操作数据的,操作字节数组的,字符编码Day6
这些类都是IO包中的,重点是编码问题,趁自己还没有忘记赶快记下来。
(一)
对于我们的数据操作流 DataInputStream,主要还是为我们对数据操作提供了方便,如下我们可以看到它的方法有很多,对数据操作的如下:
DataOutputStream dos=new DataOutputStream(new FileOutputStream("d:/demo.txt"));
dos.writeUTF("da");
dos.writeInt(11);
dos.close();
DataInputStream dis=new DataInputStream(new FileInputStream("d:/demo.txt"));
System.out.println("字符串"+dis.readUTF()+"数字"+dis.readInt());
在从文件中读出数据时,不用费心地自行判断读入字符串时或读入int类型时何时该停止,使用对应的readUTF()或readInt()方法就可以正确地读入完整类型数据。同样地,DataInputStream、DataOutputStream并没有改变InputStream或OutputStream的行为,读入或写出时的动作还是InputStream、OutputStream负责。DataInputStream、DataOutputStream只是在实现对应的方法时,动态地为它们加上类型判断功能。
(二)
ByteArrayInputStream,ByteArrayOutputStream这个类也有点神奇,因为他不需要我们关闭,WHY?因为他压根就没有用到系统资源,内部封装了数组,如果你想将文本中的数据读入内存中用它。
ByteArrayInputStream bis=new ByteArrayInputStream("ss".getBytes());
ByteArrayOutputStream bos=newByteArrayOutputStream();
int len=0;
while((len=bis.read())!=-1)
{
bos.write(len);
}
可以将ss源改成文件。
(三)字符编码
这是一个永恒的话题,我们要注意编码问题,像这几天做课设就有自己的网页中用的是gbk,数据库用的是UTF8,最后出现乱码,找了好久才找出来,编码有许多ACSII,gbk,Unicode
,其实Unicode包含了UTF8。要想不乱码,必须得用一种编码。
就像我们平常所说的“联通”二字,如果写在记事本中保存再打开会出现乱码,这是为什么呢?
这是编码问题,我们先解释一下,再通过程序来看看原理。
由于记事本保存时,默认的格式是gbk(中文系统),但是联通二字,有点特别,所有的数据最后在计算机中都是用二进制表示的,“联通”二字虽然用gbk存储,但是打开的时候,记事本通过判断头部特征,结果与UTF8的一样,就不管三七二十二用UTF8的表示了。UTF8特征头部是
110… 后面的是10…如果头部有两个1,后面的格式有事10…,那么就读两个字节。如果1110那么就读三个字节,后面的是10..,10…,
见程序:
String str="联通";
byte[] b=str.getBytes("GBK");
for(byte bi:b)
{
System.out.println(Integer.toBinaryString(bi&255));
}
输出结果又两种:
不与255的
与255的
为什么要与&255呢?
因为我们看到不与255的结果是前面24位都是1,因为中文字表示的时候,用GBK,一个中文字表示两个字符,四个字节,32位,一般是负数。所以前面的24位基本都是1.
----------------------ASP.Net+Android+IOS开发.Net培训、期待与您交流! -----------