黑黑是魔法少女 2022-01-14 16:36 采纳率: 75%
浏览 76
已结题

Java的io流输出有空格且首字符乱码

今天在练习io流的时候出现了一些问题
read读出来的数字一直比文本字符大,多的会输出空格
并且不管输入什么中文字符串首字符都是乱码

img

  • 写回答

2条回答 默认 最新

  • MR_ZhiEr 2022-01-14 18:41
    关注

    两个问题, 其实楼上已经给出代码了, 这里我解释下

    1. 多出许多空格: 因为你把读取的内容读取到数组中去了, 数组的长度设置长了 打印的 时候 直接把数组整个打印了, 数组内没有被字符占用的 就变成空格了
      解决办法是: 打印的时候只打印读取到的数组长度
    2. 中文乱码: 因为中文 GBK 编码 是2个字节每个汉字, utf-8 编码是 3个字节每个汉字, 你读取用的FileInputStream是字节流, 一次只读取一个字节, 这就造成了 虚拟机不知道哪几个字节是一个汉字, 该用哪个编码表解码, 所以会乱码
      解决办法是: 指定编码表, 要么麻烦的 使用 字节流读取, 使用转换流指定编码解码 要么 直接使用字符流读取, 直接指定编码表就可以了
      另外再提一下的是每个字母是占一个字符的
      ```java
      //1.写文件
       OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("a.txt"),"gbk");
       String s ="春风扶栏露华浓";
       //1.1 字符串转成字符数组
       char[] c = s.toCharArray();
       //1.2 开始写入文件
       osw.write(c);
       //1.3 释放资源
       osw.close();
      
        //2. 读取文件
        //2.1 获取输入流, 用转换流 编码
        InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"), Charset.forName("gbk"));
        //2.2 定义一个int类型的变量, 用来存 一次读取到数组中的长度
        int len;
        //2.3 定义一个char类型的数组, 用来存读取到的内容
        char[] chars = new char[1024];
        //2.4 读取内容到数组中, 每次读取的长度是 len
        while ((len= isr.read(chars))!=-1){
            //2.5 利用字符串的构造方法, 把char数组变成 字符串
            String s1 = new String(chars,0,len);
            System.out.println(s1);
        }
        //2.6 释放资源
        isr.close();
    

    ```

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

报告相同问题?

问题事件

  • 系统已结题 1月28日
  • 已采纳回答 1月20日
  • 创建了问题 1月14日

悬赏问题

  • ¥15 商城生产日期批次库存问题
  • ¥15 esp8266控制共阳极wrgb灯板无法关闭所有led灯
  • ¥100 python读取速度问题
  • ¥15 stm32f407使用DMA问题
  • ¥15 您好 这个API接口该怎么弄 网站搭建好了 API也有 现在就不知道该怎么填写API 不知道怎么用
  • ¥88 用uniapp写一个多端的程序,用到高德地图,用高德的JSAPI吗?
  • ¥20 关于#c++#的问题:水果店管理系统
  • ¥30 dbLinq最新版linq sqlite
  • ¥20 对D盘进行分盘之前没有将visual studio2022卸载掉,现在该如何下载回来
  • ¥15 完成虚拟机环境配置,还有安装kettle