FileReader读取中文txt文件编码丢失问题

Vue 文件读取组件封装:解决 FileReader 状态管理与响应式冲突 FileReader 是浏览器原生的异步文件读取 API,但其状态机模型(EMPTY→LOADING→DONE)、静默错误机制、不可复用实例等特性,与 Vue 响应式系统存在底层哲学冲突。直接在 setup 或 methods 中裸调用易引发乱码、内存泄漏、状态丢失等问题。本文聚焦 FileReader 封装的核心动因——构建状态可控、错误可溯、编码可配的 Vue 专用读取桥接层,覆盖 readAsText 编码适配、readAsDataURL 内存优化、跨浏览器兼容处理等工程实践要点,为文件预览、文本解析 阅读详情

有一个UTF-8编码的文本文件,用FileReader读取到一个字符串,然后转换字符集:str=new String(str.getBytes(),"UTF-8");结果大部分中文显示正常,但最后仍有部分汉字显示为问号! 
Java代码  
public static List<String> getLines(String fileName){   
        List<String> lines=new ArrayList<String>();   
        try {   
            BufferedReader br = new BufferedReader(new FileReader(fileName));   
            String line = null;   
            while ((line = br.readLine()) != null) {   
                lines.add(new String(line.getBytes("GBK"),"UTF-8"));   
            }   
            br.close();   
        } catch (FileNotFoundException e) {   
        }catch (IOException e) {}   
        return lines;   
    } 

public static List<String> getLines(String fileName){
  List<String> lines=new ArrayList<String>();
  try {
   BufferedReader br = new BufferedReader(new FileReader(fileName));
   String line = null;
   while ((line = br.readLine()) != null) {
    lines.add(new String(line.getBytes("GBK"),"UTF-8"));
   }
   br.close();
  } catch (FileNotFoundException e) {
  }catch (IOException e) {}
  return lines;
 }

 

文件读入时是按OS的默认字符集即GBK解码的,我先用默认字符集GBK编码str.getBytes(“GBK”),此时应该还原为文件中的字节序列了,然后再按UTF-8解码,生成的字符串按理说应该就应该是正确的。

为什么结果中还是有部分乱码呢? 
问题出在FileReader读取文件的过程中,FileReader继承了InputStreamReader,但并没有实现父类中带字符集参数的构造函数,所以FileReader只能按系统默认的字符集来解码,然后在UTF-8 -> GBK -> UTF-8的过程中编码出现损失,造成结果不能还原最初的字符。

原因明确了,这个问题解决起来并不困难,用InputStreamReader代替FileReader,InputStreamReader isr=new InputStreamReader(new FileInputStream(fileName),"UTF-8");这样读取文件就会直接用UTF-8解码,不用再做编码转换。 
Java代码  
public static List<String> getLines(String fileName){   
        List<String> lines=new ArrayList<String>();   
        try {   
            BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(fileName),"UTF-8"));   
            String line = null;   
            while ((line = br.readLine()) != null) {   
                lines.add(line);   
            }   
            br.close();   
        } catch (FileNotFoundException e) {   
        }catch (IOException e) {}   
        return lines;   
    }  

 

Java乱码问题解析与UTF-8编码实践指南 字符编码是计算机处理文本的基础,从ASCII到Unicode的演进解决了多语言支持问题。UTF-8作为Unicode的变长编码实现,因其兼容性和高效性成为行业标准。在Java开发中,乱码常发生在编码(Encode)与解码(Decode)环节,本质是字符集不匹配导致的解释错误。通过理解JVM编码层级、掌握StandardCharsets等API,可以解决控制台输出、文件读写和网络传输中的乱码问题。企业级实践中,统一使用UTF-8编码规范,配合Maven构建配置和数据库连接设置,能有效避免跨平台兼容性问题。本文 阅读详情

相关推荐

Java I/O流核心原理与性能优化实战

I/O流是计算机系统中数据传输的基础抽象,通过统一的接口处理文件、网络等不同数据源。其核心原理包括字节流/字符流的二进制与文本处理差异,以及缓冲流通过批量传输提升效率的机制。在工程实践中,合理选择I/O类型(如NIO非阻塞模型)和优化策略(如零拷贝技术)能显著提升系统性能,特别是在处理大文件传输或高并发场景时。通过分析PostgreSQL I/O错误等典型问题,开发者可以掌握编码规范、缓冲策略等关键技术要点,有效避免SQL Server校验和错误等常见陷阱。

weixin_30443075的博客 533

FileReader读取中文txt文件编码丢失问题(乱码)

有一个UTF-8编码的文本文件,用FileReader读取到一个字符串,然后转换字符集:str=new String(str.getBytes(),"UTF-8");结果大部分中文显示正常,但最后仍有部分汉字显示为问号! [code="java"] public static List getLines(String fileName){ List lines=new ArrayList...

gundumw100的专栏 541

Java Swing桌面应用开发实战:从零构建单机版文件传输助手

桌面应用开发是连接用户与本地系统资源的重要桥梁,其核心在于通过图形用户界面(GUI)提供直观、高效的操作体验。Java Swing作为Java标准库的一部分,凭借其丰富的组件库和成熟的MVC架构思想,成为构建跨平台桌面应用的经典选择。在工程实践中,通过SwingWorker实现后台线程处理,能有效解决文件操作时的界面卡顿问题,提升应用响应性。结合文件系统操作、自定义组件渲染和事件驱动编程,开发者可以构建出功能完善、用户体验良好的单机工具。本文以开发一个本地文件管理助手为例,详细拆解了如何使用Swing实现目

weixin_30251829的博客 315

FileReader读取文件编码丢失问题(乱码)

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33943836的博客 618

Java IO流核心原理与实战:从字节字符流到NIO性能优化

在Java编程中,输入输出(IO)是数据持久化、网络通信和系统交互的基石。其核心抽象“流”(Stream)将数据视为在源与目标间流动的字节或字符序列,通过装饰器模式灵活组合功能。理解字节流与字符流的根本区别——前者处理原始二进制数据,后者专为文本设计并涉及编码解码——是避免乱码和文件损坏的关键。缓冲流通过批量处理减少系统调用,是提升IO性能的通用实践。在需要处理海量数据或高并发连接时,Java NIO提供了基于通道(Channel)和缓冲区(Buffer)的非阻塞模型,有效解决了传统阻塞IO的线程瓶颈。本文

weixin_34212762的博客 558

蓝牙耳机充电仓——功能框架

数据传输:大部分充电仓会跟耳机通信,控制耳机开机、关机和进入可搜索模式等等。蓝牙耳机给大家的生活带来便利,来讲讲TWS蓝牙耳机的搭档充电仓吧!方便携带:如果耳机单独带着,指定能弄丢一个,有了充电仓就安全多了。收纳保护:把珍爱的耳机放入充电仓里,防止丢失、磕碰、刮花等。给耳机充电:提供电力补给,让耳机持续使用。

改变自己现在能改变的,珍惜自己现在所拥有的 8953

VS读取文件显示:字符串中的字符无效

VS读取文件:字符串中的字符无效

lmj7926的博客 6103

QuickFix Java 讲解(五)消息的收发与查看

本系列力求手把手教你怎样利用QuickFix Java 搭建自己的 FIX 协议收发平台,以及其中的注意事项。 所有源码的地址(免费): https://github.com/zongzhec/QuickFixPractise 这节我们讨论将Acceptor和Initiator启动以后,收到的消息极其查看方式。 6. 收发双方的通信 6.1. 启动后的通信和登录 为方便起见,这里我们使用统一的源码:https://github.com/zongzhec/QuickFixPractise ..

2247

fileReader字符流读取中文乱码的解决办法

在使用字符流读取文件中的数据时,中文会因为编码的原因出现乱码: windows系统默认编码可以在DOS中查看,936中国 - 简体中文(GB2312); idea的默认编码为utf-8; 所以在使用fileReader的时候就会出现乱码情况。 FileReader fileReader = new FileReader("D:\\aaa\\4.txt"); /*int len = 0; while ((len = fileReader.read())!= -1){

weixin_43373600的博客 2591

一文速学数模-K-means聚类算法实战:信用卡用户画像聚类分析

该项目算是非常经典的金融业务用户画像的基础分析了,主要根据用户信用卡使用行为数据进行分析,根据收集到的不同字段信息,对每个用户划分类别。这里需要说明一下的是,聚类模型只是将具有相似行为的大部分用户聚集到一个类别里面,这点并不会考虑到每个字段的含义,也就是分成的类别并不是用户价值等级,此类别仅仅是这个类别大体相同的信用卡用户行为对象,并不能给每个用户价值打上标签,那是评价模型做的事,这里要注意不要搞混淆了,用户价值评价是评价模型决定的,而画像是聚类模型分析的。

master_hunter的博客 1万+

【ubuntu24.04】auto remove后,重启,kernel panic ,please reboot your computer vfs unable to mount root fs

Ubuntu 24.04系统在运行auto remove后出现内核恐慌(kernel panic)无法启动,显示"VFS: unable to mount root fs"错误。该问题是由于当前内核被清除导致系统无法挂载根分区。解决步骤包括:1)尝试用GRUB菜单中的旧内核启动;2)在GRUB中临时编辑启动参数;3)使用Ubuntu启动盘进行chroot修复;4)使用Boot-Repair工具一键修复。成功启动后,需要重新安装linux-generic等元包,重建initramfs并更新

突围 1216

前端使用FileReader读中文会乱码

这么读取之后,打印读入的内容,可以看到中文字符都无法正确显示。

changyana的博客 1224

AutoSAR系列讲解(入门篇)4.6-BSW的Watchdog功能

BSW的看门狗功能

雪云飞星的博客 1万+

FileReader读取中文txt文件编码丢失问题(乱码)(转)

有一个UTF-8编码的文本文件,用FileReader读取到一个字符串,然后转换字符集:str=new String(str.getBytes(),"UTF-8");结果大部分中文显示正常,但最后仍有部分汉字显示为问号!  public static List&lt;String&gt; getLines(String fileName){ List&lt;String&g...

weixin_33991727的博客 117

通过情感分类实例 详细介绍如果借助Huggingface平台 完成Transformers模型运行(包括配置环境-tokenizer-Model-输出头-预测)

attention_mask和padding是配套使用的,当人为去修改padding的时候,也要把attention_mask里面的参数进行修改。下载Huggingface包,Huggingface可以说是一个社区,集成了很多nlp的模型、数据集、预训练权重文件等等,并且免费,只需要pip install下载即可。那么用什么做分类就选择什么输出头,就import什么东西。代码中使用了自动分词器选择,它是由checkpoint指定的预训练模型关联的,不用我们自己选择tokenizer,它自动帮我们选择好了。

LZL2020LZL的博客 1137

LeRobot 入门教程(十一)π0(Pi0)π0.5(Pi0.5)训练、推理、部署

本文介绍了Physical Intelligence公司开发的π₀和π₀.₅系列通用机器人控制视觉-语言-动作模型。π₀作为首款基础模型,融合流匹配、跨实体训练等技术,支持50Hz高频控制。π₀.₅是其升级版,通过异构数据协同训练解决开放世界泛化问题,在Libero基准测试中表现优异。文章详细说明了两个模型的安装要求、使用方法、训练策略及关键参数配置,包括混合精度训练、梯度检查点等优化技术,为机器人在多样化场景中的语义理解和动作控制提供了完整解决方案。

2506_90492529的博客 5053

Postman请求结果乱码:从字符编码原理到全链路解决方案

字符编码是计算机科学中数据表示与交换的基础,它定义了字符与二进制数据之间的映射规则。其核心原理在于确保编码与解码过程使用同一套“密码本”,否则就会产生乱码。在Web开发与API调试领域,正确理解并统一字符编码对于保障数据完整性和可读性具有重要技术价值,尤其是在处理多语言内容(如中文)时。UTF-8作为当前互联网事实上的标准编码,因其良好的兼容性与广泛的字符覆盖,成为跨系统、跨平台通信的首选。在实际工程实践中,API调试工具(如Postman)出现响应乱码,是编码不一致问题的典型应用场景。这通常涉及服务器响应

weixin_30947043的博客 432

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

哈希、加密与编码的本质区别:从概念到实战的安全应用

在计算机安全与数据通信领域,哈希、加密和编码是三个基础且核心的技术概念。哈希是一种单向函数,它将任意长度的输入转换为固定长度的输出,主要用于数据完整性校验和密码存储,其核心特性是单向性和抗碰撞性。加密则通过密钥对数据进行可逆的变换,旨在确保数据的保密性,分为对称加密和非对称加密。编码则是数据格式的转换,如Base64,旨在解决数据在不同系统或协议间的兼容表示问题,通常公开可逆。理解这三者的区别对于设计安全架构至关重要,例如在密码存储场景中,应使用加盐的密码学哈希函数而非加密,以防止密钥泄露导致的全盘风险;在

cuankuangzhong6373的博客 442

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java IO流详解

读文件、写文件FileReaderFileWriter缺点:字符基础流使用电脑系统默认编码,Windows是GBK,读取UTF-8中文文件会乱码,新手不推荐直接用。FileReader中文乱码底层原因FileReader默认使用操作系统的系统编码(Windows GBK),解码规则和文件UTF-8二进制不匹配,翻译文字出错;必须使用转换流手动指定UTF-8编码。相对路径找不到文件程序启动的基准工作目录发生变化,JVM拼接出的完整地址错误,优先使用绝对路径调试。

2601_95390587的博客 285

Java缓冲流原理与性能优化实战

缓冲流是Java IO体系中提升读写效率的核心技术,通过在基础流上增加内存缓冲区层,显著减少物理IO操作次数。其工作原理基于批量处理机制,当缓冲区数据不足时自动触发批量填充,而非逐字节处理。这种设计在文件传输、日志收集等场景能带来8-15倍的性能提升,特别适合处理大文件或高频小数据量操作。技术实现上采用装饰器模式,通过维护缓冲区数组、位置指针等状态实现高效读写。最佳实践中需要注意缓冲区大小配置(通常8-32KB)、流关闭管理以及字符编码处理等关键点,避免常见性能陷阱。

weixin_30680385的博客 365

Java I/O流核心原理与实战:从字节字符到NIO,打通编程任督二脉

在Java编程中,输入输出(I/O)是数据交换的基础,其核心在于理解数据如何在不同介质间流动。I/O流本质是数据的单向管道,基于装饰器模式设计,允许功能像乐高积木一样灵活组合,这提升了代码的复用性和可维护性。从技术价值看,掌握I/O流不仅能优化程序性能,更是处理文件、网络通信等场景的基石。具体到Java,I/O体系分为处理二进制的字节流和专为文本设计的字符流,而NIO则引入了面向块的通道与缓冲区模型,支持非阻塞操作,显著提升了高并发场景下的效率。本文聚焦**Java I/O流**与**装饰器模式**,通过图

weixin_30781107的博客 407
上一篇: 今天写的一段复杂sql语句
下一篇: 最近收集的9000个英语单词
hxpjava1
博客等级 码龄19年 1365粉丝 511原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值