关于read(byte[] b)方法的返回值

关于read(byte[] b)方法的返回值

# 具体遇到的问题

imooc.txt文件中的内容如下,请问下面的代码输出值的含义是什么?

是不是换行符也会占一个字节?
 http://img1.sycdn.imooc.com//climg/5fa4b408099d6b0d01340055.jpghttp://img1.sycdn.imooc.com//climg/5fa4b41a09f61bb100970044.jpg
# 粘贴全部相关代码,切记添加代码注释(请勿截图)

在这package pers.snail.chars;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class CharDemo {

    public static void main(String[] args) {
        try {
            FileInputStream fis = new FileInputStream("imooc.txt");  
            InputStreamReader isr = new InputStreamReader(fis,"GBK");
            FileOutputStream fos = new FileOutputStream("imooc1.txt");  
            OutputStreamWriter osw = new OutputStreamWriter(fos,"GBK");//读写数据时要保持编码格式的一致
            int n = 0;
            char[] ch = new char[10];
            //读文件
//            while((n=isr.read())!=-1) {  //第一种读法,一次读取一个字节
//                System.out.print((char)n);
//            }
            while((n=isr.read(ch))!=-1) { //第二种读法,一次读取ch.length个字节
                System.out.println(n);
//                String s = new String(ch,0,n); //参数含义与write(b,off,n)相同
//                System.out.print(s);
            }
            //写文件
//            while((n=isr.read(ch))!=-1) {
//                osw.write(ch,0,n);
//            }
  //          osw.flush();
            osw.close();
            fos.close();
            isr.close();
            fis.close();    
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch(IOException e) {
            e.printStackTrace();
        }
        

    }

}

里输入代码,可通过选择【代码语言】突出显示

正在回答

登陆购买课程后可参与讨论,去登陆

4回答

同学你好,

1,通过isr.read(ch)将数据读取到字符数组ch中,而n是实际读取的字符数,ch数组长度为10,那么如果有20个数据,第一次循环读取了10个,数组读满了,此时n就是10;而这个10对应的是文件中的“你好,慕课网”以及换行符其中的一个字节(换行符占两个)

2,字符流先会按照编码方式去读取字节转换成字符放入数组;utf-8每个汉字3个字节,gbk每个汉字2个字节;如果是一个utf-8的汉字的话,读出来3个字节,转gbk的时候转成了1.5个字符,两个utf-8汉字读出来6个字节 ,转gbk的时候转成了3个字符;所以“你好,慕课网”6个汉字,18个字节,转gbk时转成了9个字符,再加上个换行;同理下面输出10,也是这个道理

祝学习愉快


  • 小曼巴0 提问者 #1
    老师您好,请问字符流中int n = read(char[] ch),n的含义是实际读取的子符数吗?
    2020-11-08 22:22:02
  • 好帮手慕小班 回复 提问者 小曼巴0 #2
    同学你好,同学的理解是正确的,返回值n就是实际读取的字符数。继续加油 祝学习愉快~
    2020-11-09 10:05:14
好帮手慕阿园 2020-11-06 19:08:06

同学你好

1,read(byte[] b) 方法是从输入流中将最多b.length个字节的数据读入一个byte数组b中。方法返回读入数组b的字节总数,如果因为已经到达文件末尾而没有更多的数据,则返回 -1。

2,  输出10是因为同学前面定义的了char[] ch = new char[10];,长度是10的char数组,而返回值n表示的是返回数组的ch的字节数,所以最后输出了10

3,输出4老师这里没有进行复现,如下

http://img1.sycdn.imooc.com//climg/5fa52ca409f2376704610283.jpg

4,这个编程题并不能很好的证明在不同编码下所占的字节数

同学可以结合下面这个例子来理解下

http://img1.sycdn.imooc.com//climg/5fa52db109285a5a08440367.jpg

5,是的,read()方法一次是读取一个数据字节,如下

http://img1.sycdn.imooc.com//climg/5fa52e2f09ca9fea05700236.jpg

祝学习愉快

  • 提问者 小曼巴0 #1
    老师您好,能不能具体解释下,第一次读的10个字节对应imooc.txt中的哪些内容?以及为什么这些内容占10个字节?谢谢
    2020-11-06 20:27:18
好帮手慕阿园 2020-11-06 19:06:57

同学你好

1,read(byte[] b) 方法是从输入流中将最多b.length个字节的数据读入一个byte数组b中。方法返回读入数组b的字节总数,如果因为已经到达文件末尾而没有更多的数据,则返回 -1。

2,  输出10是因为同学前面定义的了char[] ch = new char[10];,长度是10的char数组,而返回值n表示的是返回数组的ch的字节数,所以最后输出了10

3,输出4老师这里没有进行复现,如下

http://img1.sycdn.imooc.com//climg/5fa52ca409f2376704610283.jpg

4,这个编程题并不能很好的证明在不同编码下所占的字节数

同学可以结合下面这个例子来理解下

http://img1.sycdn.imooc.com//climg/5fa52db109285a5a08440367.jpg

5,是的,read()方法一次是读取一个数据字节,如下

http://img1.sycdn.imooc.com//climg/5fa52e2f09ca9fea05700236.jpg

祝学习愉快

小曼巴0 提问者 2020-11-06 10:34:09

之前老师介绍String时,提到utf编码中一个汉字用三个字节表示,GBK编码一个汉字用2个字节表示,上述代码中,我在读数据时使用了GBK编码,而eclipse的默认编码时utf-8,但我感觉无论哪种编码,上述程序的输出结果都于前面学习String时理解的不一致?请问是什么原因?read()方法不是应该一次读一个字节吗?

http://img1.sycdn.imooc.com//climg/5fa4b60c09acf9ab09370441.jpg

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师