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

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日

悬赏问题

  • ¥170 如图所示配置eNSP
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥15 键盘指令混乱情况下的启动盘系统重装