今天在练习io流的时候出现了一些问题
read读出来的数字一直比文本字符大,多的会输出空格
并且不管输入什么中文字符串首字符都是乱码
![](https://profile-avatar.csdnimg.cn/6672ac21d8c344c898d09722584a1390_m0_55678568.jpg!4)
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();
```
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报 - 多出许多空格: 因为你把读取的内容读取到数组中去了, 数组的长度设置长了 打印的 时候 直接把数组整个打印了, 数组内没有被字符占用的 就变成空格了
悬赏问题
- ¥15 metadata提取的PDF元数据,如何转换为一个Excel
- ¥15 关于arduino编程toCharArray()函数的使用
- ¥100 vc++混合CEF采用CLR方式编译报错
- ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
- ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
- ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
- ¥50 如何openEuler 22.03上安装配置drbd
- ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
- ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
- ¥15 Windows11, backspace, enter, space键失灵