以字节流读取文件时中文乱码解决(二)

在上一节中说明了每次读取一个字节时乱码解决方法,这一节我将阐述每次读取多个字节乱码的解决。

问题:

中文字符占2个字节,非中文占一个字节

例如:"abc中国"

当我们以每四个字节读取文件时,此时会读到 "abc" + ""的一半,此时就会产生乱码。

byte[] b = new btye[4];

inputStream.read(b);//出现乱码

解决方法:

1.判断当前读到的 byte数组是否乱码,参考: http://www.cnblogs.com/Nbge/archive/2013/05/22/3093041.html

2.当前byte数组存在乱码时,必定是在读取最后一个字节时读到了中文的一半,此时我们再读取一个字节,然后重新创建byte数组,这样就解决了乱码。

源码:

public void test() {
		byte[] b = new byte[4];
		int len = -1;
		try (InputStream is = new FileInputStream("files/test2.txt")) {
			while ((len = is.read(b)) != -1) {
				// String s = new String(new byte[] { b[len - 2], b[len - 1] });
				String s = new String(b, 0, len);
				byte[] b2 = s.getBytes("iso8859_1");
				// 以 iso8859_1 编码时出现乱码时 byte 值为 63
				if (b2[b2.length - 1] == 63) {
					byte[] b3 = new byte[1];
					is.read(b3);
					byte temp = b3[0];
					b3 = Arrays.copyOf(b, b3.length + b.length);
					b3[b3.length - 1] = temp;
					System.out.print(new String(b3, 0, b3.length));
				} else {
					System.out.print(new String(b, 0, len));
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}




你可能感兴趣的:(java)