A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 蔡汉康 中级黑马   /  2012-11-7 21:55  /  1503 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 蔡汉康 于 2012-11-7 22:48 编辑
  1. import java.io.*;

  2. class EncodeStream
  3. {
  4.         public static void main(String[] args) throws IOException
  5.         {
  6.                         //writeText();
  7.                         readText();
  8.         }

  9.         public static void readText()throws IOException
  10.         {
  11.                 InputStreamReader isr = new InputStreamReader(new FileInputStream("utf.txt"),"gbk");

  12.                 char[] buf = new char[10];//这里字符数组长度定义的问题不是很明白,为什么要设定成10,
  13.                                           //写入用utf-8编码表(一个中文用3个字节表示),   读取时用gbk编码表(一个中文用2个字节表示)
  14.                 int len = isr.read(buf);//那么这个read()方法的在电脑上是怎么样运作的,能否解释一下过程,?????它不会读取10个字符吗????编译不会出错吗?????

  15.                 String str = new String(buf,0,len);

  16.                 System.out.println(str);

  17.                 isr.close();
  18.         }
  19.         public static void writeText()throws IOException
  20.         {
  21.                 OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("utf.txt"),"UTF-8");

  22.                 osw.write("你好");

  23.                 osw.close();
  24.         }

  25. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

3 个回复

倒序浏览
  • char[] buf = new char[10];//这里字符数组长度定义的问题不是很明白,为什么要设定成10,
这个你随意,可以根据需要来定义数组的长度,通常情况下是1024;很少定义为10 除非你要读取的数据真的很少。
//写入用utf-8编码表(一个中文用3个字节表示),   读取时用gbk编码表(一个中文用2个字节表示)
int len = isr.read(buf);//那么这个read()方法的在电脑上是怎么样运作的,能否解释一下过程,?????它不会读取10个字符吗????编译不会出错吗?????
int len = isr.read(buf);执行到这条语句的时候,isr流对象调用它的read方法开始从isr关联的文件中读取数据,如果是空参数的read(),那么只读一个字节便结束
如果是isr.read(buf);传递了一个数组,那么只会在把数组读满或者文件中的数据读完(数组长度大于文件大小),才会结束;
因此 isr.read(buf);它把buf数组读满就结束了 并返回一个int类型的数值,一共读了多少数据;


评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

回复 使用道具 举报
焦晨光 发表于 2012-11-7 22:22
  • char[] buf = new char[10];//这里字符数组长度定义的问题不是很明白,为什么要设定成10,
    这个你随意, ...

  • 谢谢,现在有点明白了
    回复 使用道具 举报
    char[] buf = new char[10];这没有固定要设置能10,按自己的需要一般为1024的整数倍, 只是通过字符数组进行读取,定义一个字符数组,用于存储读到的字符。效率不高,为了提高效率可以用缓冲区。
    它编译不会出错,只是运行结果会乱码。如:浣犲ソ,写入用utf-8编码表(一个中文用3个字节表示),   读取时用gbk编码表(一个中文用2个字节表示),当然是会乱码的啊。
    read(char[])返回的是读到字符个数。read方法是将字符一个一个的放入数组中,如字符为“abc”,那么read(buf)执行后,char[0]="a",char[1]="b",char[2]="c"。它不会读取10个字符,因为String(buf,0,len)将字符数组中的一部分转换成字符串,也就是读到几个取几个。
    回复 使用道具 举报
    您需要登录后才可以回帖 登录 | 加入黑马