关于字符输入流中read方法传一个字符数组的问题

关于字符输入流中read方法传一个字符数组的问题

老师您好,视频中只讲了一个一个读取字符的方法,但是我查了文档,还有int read(char[] cbuf),可以传入一个字符数组的办法。于是我试了一下,问题是这样的:

当这个字符数组开的比较小,比如15时,传入的数据就会和预期不相同(不是乱码)。而如果数组再开大一点,则又和预期相同了。请问老师,这里的字符数组开的大和小有什么区别吗

char[] chars=new char[15];



public class TextFileSample {
    /*FileReader读取并通过FileWriter写入文本文件案例*/
    public void readTextFile(){
        FileReader fr=null;
        FileWriter fw=null;
        File f1=new File("c:/java/demo.txt");
        File f2=new File("c:/java/demo1.txt");
        try {
            fr=new FileReader(f1);
            fw=new FileWriter(f2);
            char[] chars=new char[15];
            int len;
            while((len=fr.read(chars))!=-1){
                System.out.print(new String(chars));
                fw.write(chars);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                fw.close();
                fr.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }


正在回答

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

1回答

同学你好,在最后一次读取时,当获取的数据不够15时,就会从第一行去获取数据,从而满足15的长度将数据写入到demo1.txt文件中。建议同学调整write()方法,如下所示:

https://img1.sycdn.imooc.com//climg/632c1da009eee0f206230227.jpg

write(byte[] b, int off, int len)方法是将指定byte数组中从off开始的len个字节写入到文件。

http://img1.sycdn.imooc.com//climg/606691c309e4e7c505970356.jpg

比如:fw.write(chars,0,len);是将字节数组chars中前len个字节写入到文件。

祝学习愉快!

  • 月是天上月阿 提问者 #1
    老师您好!好像不是这个问题吧,我加上了0,len结果还是一样的。当我把数组开到1024时,就没有出现这个重复的问题。所以我的问题是为什么数组开大就对了 ,数组开小就不对,字符数入流不是一个字符一个字符读的吗为什么还和数组大小有关
    2022-09-23 08:33:15
  • 同学你好,当修改为“fw.write(chars,0,len);”语句后,文件的读写都是没有问题的。同学看到的最后一次输出与实际文本不一致,是因为打印语句的问题。如果同学对比两个文本,会发现,实际的读写结果是完全一致的。

    打印语句的问题是出现在字符数组中的,举个例子:

    加入字符数组的长度如同学的代码中是15,倒数第二次读取时,可以将数组读满,假如读入的都是字符“X”,那么数组中的内容是“XXXXXXXXXXXXXXX”,并且返回的len值为15。

    此时对外写出时,由于使用的“fw.write(chars,0,len);”,会将数组中的15个字符全部写出,并没有发生任何问题。

    但是如果最后一次读取的时候,文件中只有5个字符“Y”了,那么显然只可以读到这5个“Y”。但是数组本身并不会将自身内容进行清空,而是用这5个“Y”去覆盖。此时数组的内容就会变成“YYYYYXXXXXXXXXX”,并且返回的len值为5。

    此时对外写出时,由于使用的“fw.write(chars,0,len);”,并不会将数组中的15个字符全部写出,而是从0下标开始,写出5个字符,即5个“Y”,并没有发生任何问题。

    但是打印语句就不一样了,打印语句输出的字符串是将数组完整转换为String的,即“YYYYYXXXXXXXXXX”的完整表现。显然这与实际情况不符。

    所以就会出现,文件的复制没有问题,但是在控制台看到的输出效果有问题。

    同学描述的将数组扩大为1024时没有出现问题,是因为文本中的数据量少于1024字符,所以只读取了一次并且数组没有读满,如果字符数量足够多,也会出现同样的问题。

    祝学习愉快~

    2022-09-23 10:28:26
  • 好的谢谢老师,懂了

    2022-09-23 13:40:14
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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