Java中IO产生中文乱码问题的原因

        首先Java中IO流是用于文件的输入与输出的,输入是指将数据从本地磁盘文件中输入到JVM运行内存中,而输出则是将数据从JVM运行内存中输出到本地磁盘文件。

IO流分字节流与字符流:

1.字节流有FileInputStream、FileOutputStream、BufferedInputStream、BufferedOutputStream。

字节流可以通过在文件当中逐一读取数据所对应的ASCII码的二进制数(一个二进制数占一个字节)。

字节流读取中文与英文的区别:

1.读取中文时,每三个二进制数才可以确定一个中文与符号,而字节流每次仅仅读取一个字节,不能读取到完整的中文二进制数,所以所读出的数据在字符集中是找不到的,就产生了中文乱码问题。

2.英文中每一个字母与符号都是对应唯一的一个二进制数,所以在字节流读取过程中都是准确无误的。

示例代码:

package com.ioProject.Test01;

import java.io.*;

public class ioTest05 {
    public static void main(String[] args) throws IOException {
        File file = new File("untitled\\c.txt");
        boolean newFile = file.createNewFile();
        FileInputStream fis = new FileInputStream(file);
        int ch;
        while ((ch = fis.read()) != -1) {
            System.out.print((char) ch);
        }
        fis.close();
    }
}
//c.txt文件中的数据为Test
//最终输出的结果为Test
//后我将c.txt文件中数据换为测试
//最终输出结果为æµè¯

对于字节流会产生中文乱码问题,我们可以通过字符流来进行优化:

字符流有FileReader、BufferedReader、InputStreamReader、FileWriter、BufferedWriter、OutputStreamWriter。

字符流可以一次性读取多个二进制数,中文二进制数的补码以1开头,而英文二进制数的补码以0开头,在读取过程中若识别到以0开头的二进制数则只读取一个字节,若识别到以1开头的二进制数则一次读取多个(若使用的字符编码方案是GBK则读取2个,若使用的字符编码方案是utf-8则读取3个)。所以在进行输入与输出操作时,需注意保持字符编码方案一致,否则也会出现中文乱码问题。

下面对应的是字符流的构造函数,可以直接传入一个字符串路径或者File对象,同时可以传入一个字符编码格式(若不传入则默认为utf-8)。

示例代码:

package com.ioProject.Test01;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.nio.charset.Charset;

public class ioTest06 {
    public static void main(String[] args) throws IOException {
        File file = new File("untitled\\c.txt");
        boolean newFile = file.createNewFile();
        FileReader fr = new FileReader(file, Charset.defaultCharset());
    }
}

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!针对Java IO流读取文件出现乱码的问题,有几个可能的原因和解决方案。 1. 编码不匹配:如果文件是以非UTF-8编码保存的,而你使用了UTF-8编码读取文件,就会导致乱码。你可以尝试指定正确的编码来读取文件。例如,如果文件是以GBK编码保存的,你可以使用`InputStreamReader`类来指定GBK编码进行读取,示例代码如下: ```java try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("file.txt"), "GBK"))) { String line; while ((line = reader.readLine()) != null) { // 处理每一行数据 } } catch (IOException e) { e.printStackTrace(); } ``` 2. 字符集处理不当:在处理文本文件时,如果没有正确处理字符集,也可能导致乱码。你可以尝试使用`Charset`类来处理字符集,示例代码如下: ```java import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; try { Path path = Paths.get("file.txt"); Charset charset = Charset.forName("GBK"); // 根据文件实际编码调整 List<String> lines = Files.readAllLines(path, charset); for (String line : lines) { // 处理每一行数据 } } catch (IOException e) { e.printStackTrace(); } ``` 3. 文件内容损坏:如果文件本身存在损坏或者乱码,那么无论你以何种方式读取文件,都会出现乱码。请确保文件本身没有问题,可以尝试使用其他文本编辑器打开文件查看是否乱码。 希望以上解决方案能够帮助你解决问题!如果还有其他疑问,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值