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

Java的io流输出有空格且首字符乱码
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
2条回答 默认 最新
- MR_ZhiEr 2022-01-14 18:41关注
两个问题, 其实楼上已经给出代码了, 这里我解释下
- 多出许多空格: 因为你把读取的内容读取到数组中去了, 数组的长度设置长了 打印的 时候 直接把数组整个打印了, 数组内没有被字符占用的 就变成空格了
解决办法是: 打印的时候只打印读取到的数组长度 - 中文乱码: 因为中文 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();
```
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报 - 多出许多空格: 因为你把读取的内容读取到数组中去了, 数组的长度设置长了 打印的 时候 直接把数组整个打印了, 数组内没有被字符占用的 就变成空格了