java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > java字节数组解决FileInputStream读取汉字乱码

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

作者:深入技术了解原理

这篇文章主要介绍了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();
                }
            }
        }
    }
}

总结

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

您可能感兴趣的文章:
阅读全文