java字符流

    技术2026-04-05  4

    人机之间的交流

    java字符流预备知识编码如何将字节数组识别成话?常见编码GBKUTF-8UTF-16UTF-32 java字符流

    java字符流

    预备知识

    编码

    计算机只能存储字节数组,他也只能读取字节数组,

    如何将字节数组识别成话?

    人为规定好,字节和字母的对应关系,这样看到一串字节,就可以知道想表达的是什么。

    ASCII编码例子: I love you 73 32 108 111 118 101 32 121 111 117

    常见编码

    人们为了表示自己国家的文字来交流,发明了各种各样的编码。

    GBK
    优点:汉字两个字节,字母一个字节表示。 缺点:只适合与中国地区使用,只兼容汉语。

    windows 在中国大陆编码ANSI默认就对应了GBK

    UTF-8
    可变长编码,一个或多个字节表示一个字符。 优点: 完美兼容ASCII码 ,存储ASCII范围里的字符时,只占一个字节。支持各国语言。 缺点:除ASCII外都占多个字节,比如一个汉字占3个字节。可变长编码导致解析字符数组性能较差。
    UTF-16
    定长编码,每个字符两个字节(无论中文字符和是英文字符)。java内部Char数组使用的就是UTF-16编码,所以char占2个字节。 优点:方便解码。 缺点:ASCII也是2个字节,如果英文字母较多的字符串,则会较占地方。并且新扩展的Unicode已经大于65536个字符,大于两个字节表示的范围,所以有时候需要4个字节来表示一个字符。
    UTF-32
    4个字节表示一个字符。定长编码。 优点:和Unicode字符集上字符一一对应。 缺点:浪费空间。

    java字符流

    字符流,就是指定好编码再读取或写入,将外部的字节流按照指定编码转化成java内部的编码存储。java内部编码是UTF-16.

    package 指针23期java教学; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.Reader; import java.io.Writer; import java.nio.CharBuffer; public class encode { public static void main(String[] args) { char[] array=new char[512]; try( //Reader in=new FileReader("test.txt"); 默认使用ANSI编码来读取。 //指定编码来读取。 Reader in= new InputStreamReader(new BufferedInputStream(new FileInputStream("test.txt")),"GBK"); //Writer out=new FileWriter("tttt"); 默认使用ANSI编码去写入。 //指定编码来写入。 Writer out=new OutputStreamWriter(new BufferedOutputStream(new FileOutputStream("tttt.txt")),"utf-8"); ){ /* out.write("测试数据"); out.flush(); 字符流写入必须flush才能确保一定输出到目标。close时也会调用flush。 */ char buff[]=new char[512]; while(in.read(buff)!=-1){ System.out.println(buff); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
    Processed: 0.013, SQL: 9