baidu_39454556 2020-07-13 15:53 采纳率: 100%
浏览 76
已采纳

字节流字符流的小问题

一个GBK编码的文本,里面内容:你

1.字节流一次读取一个字节

  public static void method1() throws IOException

    {
        FileInputStream f1 = new FileInputStream("E:\\JAVA练习\\JAVAl练习\\f.txt");
        FileOutputStream f2 = new FileOutputStream("E:\\JAVA练习\\JAVAl练习\\f复制.txt");
        int len;
        while((len = f1.read()) != -1){
             f2.write(len);
            System.out.println(len);
         }
        f1.close();
        f2.close();
    }

读取出来的是196,227

2.字节流一次读取一个字节数组

  public static void method2() throws IOException{
        FileInputStream f1 = new FileInputStream("E:\\JAVA练习\\JAVAl练习\\f.txt");
        FileOutputStream f2 = new FileOutputStream("E:\\JAVA练习\\JAVAl练习\\f复制.txt");
        int len;
        byte[] by = new byte[1024];
        while((len = f1.read(by)) != -1){
            f2.write(by);
            System.out.println(Arrays.toString(by));
        }
        f1.close();
        f2.close();
    }

读取出来的是[-60, -29,]

3.转换流输出

public static void method7() throws IOException{
        InputStreamReader f1 = new InputStreamReader(new FileInputStream("E:\\JAVA练习\\JAVAl练习\\f.txt"),"GBK");
        OutputStreamWriter f2 = new OutputStreamWriter(new FileOutputStream("E:\\\\\\\\JAVA练习\\\\\\\\JAVAl练习\\\\\\\\f复制.txt\\"),"GBK");
    int len;
    f2.write(196);
    f2.write(227);
    f2.write(-60);
    f2.write(-29);
         f2.write(50403);

三个方法独立运行。
问题:1.第三段明程序为什么写进去都是乱码?50403在GBK表示的不是“你”吗?“你”的
2.第一段程序和第二段程序,GBK编码是50403,二进制是1100010011100011,为什么两次读取的输出不一样?196和227相合并为1100010011100011,-60和-29为什么也表示“你”?将这两种字节以字节流一次写入一个字节形式写入,都可以得到“你”这个字。这是为什么呢?一个汉字用同一种编码能有两种字节表示吗?

  • 写回答

2条回答 默认 最新

  • 封印di恶魔 2020-07-13 17:08
    关注

    你写入方法错了,比如你有1524个字节,第二次读的时候只读了500个字节,但是你却把剩余的524个字节也一起写入了所以大小不一样
    部分情况下,甚至会使数据错乱出现乱码
    正确的读取方式是

    f2.write(by, 0, len);
    

    你那个是以一个错误的读取方式,刚好没多写入的数据没影响你的数据显示而已,并不代表他们相等

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?