Java FileInputStream读中文乱码问题解决方案

1、前提

以读取编码是GBK的文件为案例,文件内容只有中文和中文符号

2、原因

FileInputStream读中文乱码是因为一个中文对应两个字节存储(负数),也就是说,读取对应中文的字节数应该是偶数; 而英文对应一个字节存储。FileInputStream每次读取一个数组长度的字节时,读取的中文字节数可能是奇数,也就是只读到中文的一半字节,出现乱码。

3、解决方法

一次读取所有字节,此方法不靠谱,因为不确定总字节数。

在输出时进行判断,遍历数组判断负数的个数,如果是奇数,说明读取到中文的一半字节,对数组进行扩容再输出;否则正常输出

4、代码案例

package 第二题;
​
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
​
public class MainTest {
​
  public static void main(String[] args) throws UnsupportedEncodingException {
    // 创建File对象
    File file = new File("D:\\filetest\\file4.txt");
    FileInputStream fileInputStream = null;
    try {
      // 新建一个FileInputStream对象
      fileInputStream = new FileInputStream(file);
      // 新建一个字节数组
      byte[] buf = new byte[2];
      // read(buf):此方法的返回值就是当前读取的字节个数,将数据读取到buf数组
      // 将readLen变量也就是read方法的返回值,当此变量等于-1,则读到文件末尾
      int readLen = -1;
       //读取文件数据
      while ((readLen = fileInputStream.read(buf)) != -1) {
        int pos=0;//记录负数的个数
        for(byte v:buf)
        {
          if(v<0)
          {
            pos++;
          }
        }
        //负数个数为偶数,读取完整,没有读取到半个中文
        if(pos%2==0)
        {
          // 将字节数组转换成字符串
          String content = new String(buf, 0, readLen);
          System.out.print(content);
        }else {//负数个数为奇数,读取不完整,会乱码
         //再读取下一位字节
          int nextByteValue=fileInputStream.read();
          int nextLen=readLen+1;
          //字节数组扩容一位
          buf= Arrays.copyOf(buf,nextLen);
          buf[readLen]= (byte) nextByteValue;
          String content=new String(buf,0,nextLen);
          System.out.print(content);
          //奇数,字节补全
          //针对数组扩容一个字节单元
        /* buf=Arrays.copyOf(buf, readLen+1);
          int nextByteValue=fileInputStream.read();
          buf[readLen]= (byte) nextByteValue;
          String content = new String(buf, 0, readLen);
          System.out.print(content);*/
        }
      }
    } catch (FileNotFoundException e) {
      // 输出堆栈信息
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      try {
        // 文件输入流关闭(释放资源)
        fileInputStream.close();
      } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    }
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java中的FileInputStream 和 FileOutputStream 介绍_动力节点Java学院整理

    FileInputStream 和 FileOutputStream 介绍 FileInputStream 是文件输入流,它继承于InputStream. 通常,我们使用FileInputStream从某个文件中获得输入字节. FileOutputStream 是文件输出流,它继承于OutputStream. 通常,我们使用FileOutputStream 将数据写入 File 或 FileDescriptor 的输出流. FileInputStream 函数接口 FileInputStream

  • java 中InputStream,String,File之间的相互转化对比

    InputStream,String,File相互转化  1. String --> InputStream InputStream String2InputStream(String str){ ByteArrayInputStream stream = new ByteArrayInputStream(str.getBytes()); return stream; } 2. InputStream --> String String inputStream2String(InputStre

  • Java使用FileInputStream流读取文件示例详解

    一.File流概念 JAVA中针对文件的读写操作设置了一系列的流,其中主要有FileInputStream,FileOutputStream,FileReader,FileWriter四种最为常用的流 二.FileInputStream 1)FileInputStream概念  FileInputStream流被称为文件字节输入流,意思指对文件数据以字节的形式进行读取操作如读取图片视频等 2)构造方法 2.1)通过打开与File类对象代表的实际文件的链接来创建FileInputStream流对象

  • InputStreamReader 和FileReader的区别及InputStream和Reader的区别

    首先给大家介绍InputStreamReader 和FileReader的区别,具体内容如下所示: InputStreamReader 和 BufferedReader .其中最重要的类是 InputStreamReader ,它是字节转换为字符的桥梁. 你可以在构造器重指定编码的方式,如果不指定的话将采用底层操作系统的默认编码方式,例如 GBK 等. FileReader 与 InputStreamReader 涉及编码转换 ( 指定编码方式或者采用 os 默认编码 ) ,可能在不同的平台上出

  • Android 数据存储之 FileInputStream 工具类及FileInputStream类的使用

    安卓的三种本地的典型数据存储方式 SharedPreferences 以文件格式保存在本地存储中 SQL数据库 这篇文章就是讲解一下如何使用 SharedPreferences 保存文件.主要解释什么都写在注释里面的. IDE : Android Studio 参考文章:http://www.jb51.net/article/74215.htm 絮叨一下:本来文件操作这一块上周就想把其弄懂,然后继续进一步的学习.但是因为官方的 Android Training 之中的概念太过于繁杂.导致我认为存

  • 详解FileInputStream读取文件数据的两种方式

    FileInputStream(文件字节读取流): read():一个一个字节的读 read(byte[] buf):先把字节存入到缓冲区字节数组中,一下读一个数组(常用) import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.Arrays; public class FileIn

  • Java FileInputStream读中文乱码问题解决方案

    1.前提 以读取编码是GBK的文件为案例,文件内容只有中文和中文符号 2.原因 FileInputStream读中文乱码是因为一个中文对应两个字节存储(负数),也就是说,读取对应中文的字节数应该是偶数: 而英文对应一个字节存储.FileInputStream每次读取一个数组长度的字节时,读取的中文字节数可能是奇数,也就是只读到中文的一半字节,出现乱码. 3.解决方法 一次读取所有字节,此方法不靠谱,因为不确定总字节数. 在输出时进行判断,遍历数组判断负数的个数,如果是奇数,说明读取到中文的一半字

  • Sublime Text 打开Java文档中文乱码的解决方案

    问题: 打开文档后出现中文乱码如图 1.在安装插件之前,首先要安装package control这个组件,才能够给Sublime Text安装各种插件 打开Sublime Text,按 ctrl+` 或者点击菜单栏 View下的Show Console 调出console == Sublime Text2 对于Sublime Text2,输入粘贴以下代码到底部命令行,并回车 import urllib2,os,hashlib; h = 'df21e130d211cfc94d9b0905775a7

  • Java Servlet输出中文乱码问题解决方案

    1.现象:字节流向浏览器输出中文,可能会乱码(IE低版本) private void byteMethod(HttpServletResponse response) throws IOException, UnsupportedEncodingException { String date = "你好"; ServletOutputStream outputStream = response.getOutputStream(); outputStream.write(date.get

  • SpringMVC 中文乱码的解决方案

    背景 举个例子,出现中文乱码的例子:提交表单的时候. 表单 <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <form action="/c02/t1" method=&quo

  • SpringMVC Restful风格与中文乱码问题解决方案介绍

    目录 基本要点 1.定义 2.传统方式与Restful风格的区别 3.如何使用Restful风格 4.为什么要用restful 5.乱码问题 基本要点 1.定义 根据百度百科的定义,RESTFUL是一种网络应用程序的设计风格和开发方式 2.传统方式与Restful风格的区别 在我们学习restful风格之前,我们请求接口,都是使用http://localhost:8080/controller?method=add这种方式携带接口所需要的参数 而调用restful风格的接口时,我们可以改成htt

  • MySql安装步骤图文教程及中文乱码的解决方案

    MySql Server安装步骤如下所示: 1安装MySql Server 2 安装MySqlServer管理工具 解压中文语言包,将文件复制到安装目录下覆盖 文件覆盖后,打开软件设置语言为中文(CN) 3 MySqlServer开发注意事项(C#) 1.联接字符串:"Server=localhost;Database=100;Uid=root;Pwd='root'" 2.引用MySql.Data.dll;using MySql.Data.MySqlClient; 3.使用MySqlC

  • java中FileOutputStream中文乱码问题解决办法

    java中FileOutputStream中文乱码问题解决办法 使用FileOutputStream序列化可以直接向文件写入文本内容,代码如下: FileOutputStream outStream = new FileOutputStream(file); outStream.write(str.getBytes()); outStream.close(); 但这里的字符串如果包含中文,就会出现乱码,这是因为FileOutputStream是字节流,将文本按字节写入文件,而一个汉字是两个字节,

  • pyftplib中文乱码问题解决方案

    这篇文章主要介绍了pyftplib中文乱码问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 采用pyftpdlib启动ftp服务端,ftp客户端在上传文件的时候,如果不指定字符编码,如果遇到中文,可能会乱码:网上找了很多资料,但是他们的客户端都是基于python实现的.还是没法解决我得问题 于是重新:FTPHandler的decode方法 def decode(self, bytes): return bytes.decode('ut

  • springboot参数传中文乱码的解决方案

    前言 本文案例来自业务部门的一个业务场景.他们的业务场景是他们部门研发了一个微服务上下文透传组件,其透传原理也挺简单的,就是通过springboot拦截器把请求参数塞进threadlocal,然后下游通过threadlocal取到值,服务之间进行feign调用时,再把threadlocal的参数塞到header头里面.这个组件一直用得好好的,突然有一天因为传的参数值是中文,导致乱码.他们通过尝试下面的各种方案,都无法解决.最后就让我们部门排查处理. 业务部门的实现思路 他们一开始的思路方向是参数

  • Java连接数据库oracle中文乱码解决方案

    今天写了一个java项目连接数据库,之后写了一个执行入库操作的模块.此时暴露出一个问题就是项目的中文插入到数据库时会是乱码: 项目输出的中文: 执行插入操作后数据库中内容: 此时CustomerNumber字段是乱码. 出现这种情况一般都是数据库编码与项目编码不一致导致的,首先查看项目与数据库的编码格式: 查看项目编码: 项目的编码是gbk格式 查看数据库编码格式: 数据库编码格式是ISO-8859-1 以上查看编码格式操作可以百度 出现这种情况一般可以通过两种方式解决.一是修改数据库或者项目的

随机推荐