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

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

img

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

  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();

```

设置字符集,应该就行了
public static void read() throws IOException{
InputStreamReader is=new InputStreamReader(new FileInputStream("gbk.txt"),"utf-8");
char[] buf=new char[8];
int len=is.read(buf);
System.out.println(new String(buf,0,len));
is.close();
}
以上可以参考,如有帮助,请采纳!