java用字节数组解决FileInputStream读取汉字出现乱码问题

 更新时间:2024年05月30日 14:51:33   作者:深入技术了解原理  
这篇文章主要介绍了java用字节数组解决FileInputStream读取汉字出现乱码问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

用字节数组解决FileInputStream读取汉字出现乱码

package hanjia;
import java.io.*;
//用“字节数组”方式读取文本文件内容,然后利用String(byte[] bytes)
//或String(byte[] bytes, int offset, int length) 构造新字符串来输出。
//解决思路:先用较大的字节数组读取文本文件内容,将调用String类构造方法将字节数组内容组合成有意义的汉字
class hanjia {
	public static void main(String args[]) throws IOException {
		FileInputStream infile = new FileInputStream("D:/KuGou/f.txt");
		try {
			byte[] b = new byte[128];// 定义一个字节数组
			int i = infile.read(b);// 读取数据存放到字节数组中,read()返回值-1表示结束
			while (i != -1) {// 读指针到达输出流尾部时结束
				System.out.print(new String(b, 0, i));//从开头到结束将字节数组内容转换为字符串,并输出
				i = infile.read(b);// 读取后续数据存放到字节数组中
			}
		} catch (IOException e) {
			System.out.println(e.getMessage());
		} finally {
			infile.close();// 关闭输入流
		}
	}
}

解决FileInputStream读取ANSI格式txt中文乱码

GBK中文转为byte后以负数开头,正常来说为连续两个负数,生僻字可能为一个负数和一个整数,所以需要特殊处理一下

注:utf-8的txt一个中文占三个byte数组,故此方法不适用

import java.io.FileInputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;

public class FileInputStreamTest03 {
    public static void main(String[] args) {
        // test
        String s = "中c国Dh丄";
        byte[] bs = new byte[10];
        try {
            bs = s.getBytes("GBK");
            System.out.println(Arrays.toString(bs));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        String s2 = null;
        try {
            s2 = new String(bs, "GBK");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        System.out.println(s2);
        // main
        FileInputStream fp = null;
        try {
            fp = new FileInputStream("C:\\Users\\dell\\Documents\\a代码备份\\python\\爬虫\\bilibili\\list.txt");
            byte[] b = new byte[10];
            int num;
            while ((num = fp.read(b)) != -1){
                int pos = 0; // 记录负值个数,中文GBK为两个负值
                for (byte b1 : b) {
                    if (b1 < 0){
                        pos++;
                    }
                }
                // System.out.println(Arrays.toString(b));
                if (pos%2 != 0 && b[b.length-1] < 0){
                    int nextValue=fp.read();
                    int size = b.length;
                    int nextLen=size+1;
                    //字节数组扩容一位
                    b = Arrays.copyOf(b,nextLen);
                    b[size]= (byte) nextValue;
                    String content=new String(b, 0, nextLen, "GBK");
                    System.out.print(content);
                } else {
                    System.out.print(new String(b, 0, num, "GBK"));
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fp != null){
                try {
                    fp.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。 

相关文章

  • java datetime数据类型去掉时分秒的案例详解

    java datetime数据类型去掉时分秒的案例详解

    在Java中,如果我们想要表示一个日期而不包括时间(时分秒),我们通常会使用java.time包中的LocalDate类,这篇文章主要介绍了java datetime数据类型去掉时分秒,需要的朋友可以参考下
    2024-06-06
  • java后端返回数据给前端时去除值为空或NULL的属性、忽略某些属性代码示例

    java后端返回数据给前端时去除值为空或NULL的属性、忽略某些属性代码示例

    在Java开发中我们处理JSON数据时经常会遇到空值(null)的情况,这篇文章主要给大家介绍了关于java后端返回数据给前端时去除值为空或NULL的属性、忽略某些属性的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-07-07
  • 微信公众号支付(二)实现统一下单接口

    微信公众号支付(二)实现统一下单接口

    本篇文章主要给大家介绍调用微信公众支付的统一下单API,通过参数封装为xml格式并发送到微信给的接口地址就可以获得返回内容,需要的朋友可以参考下本文
    2015-09-09
  • 解决nacos升级spring cloud 2020.0无法使用bootstrap.yml的问题

    解决nacos升级spring cloud 2020.0无法使用bootstrap.yml的问题

    这篇文章主要介绍了解决nacos升级spring cloud 2020.0无法使用bootstrap.yml的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Java Date类的使用方式(日期处理)

    Java Date类的使用方式(日期处理)

    本文介绍了Java中的Date类和Calendar类的使用,详细讲解了Date类的构造方法和常用方法,并通过一个实例演示了如何使用Date类来比较两个时间点之间的关系
    2024-11-11
  • Springboot下使用Redis管道(pipeline)进行批量操作

    Springboot下使用Redis管道(pipeline)进行批量操作

    本文主要介绍了Spring boot 下使用Redis管道(pipeline)进行批量操作,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • Java比较两个List的值是否相等的方法

    Java比较两个List的值是否相等的方法

    这篇文章主要介绍了Java比较两个List的值是否相等的方法,涉及java针对队列比较的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • Java LinkedHashMap深入分析源码

    Java LinkedHashMap深入分析源码

    大多数情况下,只要不涉及线程安全问题,Map基本都可以使用HashMap,不过HashMap有一个问题,就是迭代HashMap的顺序并不是HashMap放置的顺序,也就是无序。HashMap的这一缺点往往会带来困扰,所以LinkedHashMap就闪亮登场了,这篇文章通过源码解析带你了解LinkedHashMap
    2022-11-11
  • springboot的异步任务:无返回值和有返回值问题

    springboot的异步任务:无返回值和有返回值问题

    这篇文章主要介绍了springboot的异步任务:无返回值和有返回值问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • Netty分布式源码分析监听读事件

    Netty分布式源码分析监听读事件

    这篇文章主要介绍了Netty分布式监听读事件方法的代码跟踪解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-03-03

最新评论