重庆分公司,新征程启航

为企业提供网站建设、域名注册、服务器等服务

(Io流)关于在idea中为什么用字节输入流输出对应文件时会出现乱码?-创新互联

ASCII(国外),GBK(国内)是一种字符集;
GBK中.一个英文字母一个字节,二进制第一位是0;
GBK中,一个中文汉字两个字节,二进制的第一位是1

创新互联公司是专业的丹江口网站建设公司,丹江口接单;提供成都网站设计、网站制作,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行丹江口网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!

Unicode(万国码)也是一种字符集,而CTF-8则是一种编码规范;

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
idea中用的是CTF-8编码规范,汉字为三个字节;
public class Main {
  public static void main(String[] args) throws IOException {
  FileInputStream fileInputStream=new FileInputStream("aaa.txt");
  int len=0;
  byte[]array=new byte[12];
  while((len=fileInputStream.read(array))!=-1){
  String a=new String(array,0,len);
  System.out.println(a);
}
输出的结果为:

我是大帅

比如这样 此时aaa.txt中的文本内容为"我是大帅哥";
1.经过分析,我是大帅哥一共占15个字节;
2当我创建一个长度为12的byte数组时,字节流他会一次性读取aaa.txt中"我是大帅哥"所对应的的二进制编码,如果我此时byte数组长度是12,一次性读取12个字节;
3.第一次读取12个字节所对应的刚好就是"我是大帅"这四个字所对应的12个字节;下一次将继续重复操作;

public class Main {
  public static void main(String[] args) throws IOException {
  FileInputStream fileInputStream=new FileInputStream("aaa.txt");
  int len=0;
  byte[]array=new byte[15];
  while((len=fileInputStream.read(array))!=-1){
  String a=new String(array,0,len);
  System.out.println(a);
}
输出的结果为:

我是大帅哥

这里能够输出出来,是因为一次性都读上了;

但是!!!!!!!!!!!!!!!!!!
public class Main {
  public static void main(String[] args) throws IOException {
  FileInputStream fileInputStream=new FileInputStream("aaa.txt");
  int len=0;
  byte[]array=new byte[11];
  while((len=fileInputStream.read(array))!=-1){
  String a=new String(array,0,len);
  System.out.println(a);
}
输出的结果为:
我是大�
�哥
1.那为什么这种会出现乱码?
 因为在这字节流读取过程中他会读取11个字节,并且放到数组中,但是当读取到"帅"这个词中,将其一分为二,不能完整的读取.所以会出现乱码;

那么如何避免这种错误的出现;
当要用输入流读取文件中的数据时,尽量用字符输入流,避免用字节输入流(除非byte数组长度大于等于自身文件字节长度)
编码和解码使用同一个码表,同一个解码方式;(Windows一般默认字符集都是GBK);

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


当前名称:(Io流)关于在idea中为什么用字节输入流输出对应文件时会出现乱码?-创新互联
链接分享:http://cqcxhl.com/article/hhdip.html

其他资讯

在线咨询
服务热线
服务热线:028-86922220
TOP