字符流的出现是为了方便的操作字符
其实最重要的是它的内部加入了编码表,字符流会自动的进行编码和解码。
举个例子,当使用字符流输入字符串”199”的时候, 每个字符都会写入到文件中,由于字符‘1’的统一码是0X0031,所以会根据这个内部的编码表将0x0031转成一个代码。这个编码表可以是任何的编码表,比如在美国,默认的编码方案的ascii 字符‘1’的ascii的是49,而所以会将0x49写入到对应的文件中,这里就使用了特定的编码方案。
当你再去用字符流读取相应的文件时候,系统会根据你的编码表去解码你对应文件中的各个位对应的二进制位,从而转成统一码,然后转成相应的字符。
你会这样去想,如果我们不去使用系统默认的编码方式的话,怎么将字符以特定的编码方式去编码和解码呢?
这时就用到了转换流 InputStreamReader和OutputStreamWriter
来将指定的编码格式来编码和解码一个字符。
下边来举个例子
OutputStreamWriter osw = new OutputStreamWriter(newFileOutputStream("text.txt"));
osw.write("你好");
osw.close();
这里我们,没有指定编码表,这时自动使用系统自带的编码表。
我这里是utf-8的编码形式。
如果只输入默认形式的编码。我们写一个fileWriter就足够了
也就是上述所讲到的字符流编码的自动转换。
我再次重申一遍,使用OutputStreamWriter是为了改变系统内置的编码类型,如果仅仅是录入字符数据,我们使用系统自带的字符流就可以。
例如,在我的机子上使用GBK编码的格式输出的时候,我必须使用这个流,因为我的系统默认为utf-8
当指定用OutputStreamWriterosw = new OutputStreamWriter(newFileOutputStream("text.txt"),"GBK");
文本就会出现���乱码的形式。
因为文本拿utf-8的编码表去解码GBK的,所以就有乱码。
当然,转换流的强大之处在于可以去更改系统默认的编码表。
也就是上边的方框。
还有一点,文本中写入的其实都是二进制文件,但是为什么打开后是对应的字符呢,是因为文本程序在打开时候,就已经对其二进制进行了解码处理了。
这里再提一点,就是在web中进行操作的时候,比方说有一个input 输入了汉字给服务器端,也就是将汉字经过utf-8编码后传入到服务器端。
但是tomcat默认的编码是iso8859-1。也就是tomcat使用iso8859-1去解码utf-8编码后的字节码。所以得到的是乱码。
现在就只能在服务器端将这个乱码先编码(iso8859-1)--》字节码
然后再使用utf-8将其解码
String name1 =newString(name.getBytes("iso8859-1"),"UTF-8");
如果使用get提交的时候,必须这么做,如果是post的话,可以使用request.setCharacterEncoding(arg0),则自动帮你转化。
但是也可以将tomcat的码表改成gbk,但是这样不推荐