java读取UTF-8文本文件第一个字符多出一个问号解决方法

java 读取文件文本内容_Java读取文本文件 java 读取文件文本内容There are many ways to read a text file in java. Let’s look at java read text file different methods one by one. 有许多方法可以读取Java中的文本文件。 让我们一一看一下Java读取文本文件的不同方法。 Java读取文本文件 (Java read text... 阅读详情

1.创建工具类

[java]  view plain  copy
  1. import java.io.*;  
  2.   
  3. public class UnicodeReader extends Reader {  
  4.   PushbackInputStream internalIn;  
  5.   InputStreamReader   internalIn2 = null;  
  6.   String              defaultEnc;  
  7.   
  8.   private static final int BOM_SIZE = 4;  
  9.   
  10.     
  11.   UnicodeReader(InputStream in, String defaultEnc) {  
  12.      internalIn = new PushbackInputStream(in, BOM_SIZE);  
  13.      this.defaultEnc = defaultEnc;  
  14.   }  
  15.   
  16.   public String getDefaultEncoding() {  
  17.      return defaultEnc;  
  18.   }  
  19.   
  20.     
  21.   public String getEncoding() {  
  22.      if (internalIn2 == null) return null;  
  23.      return internalIn2.getEncoding();  
  24.   }  
  25.   
  26.     
  27.   protected void init() throws IOException {  
  28.      if (internalIn2 != null) return;  
  29.   
  30.      String encoding;  
  31.      byte bom[] = new byte[BOM_SIZE];  
  32.      int n, unread;  
  33.      n = internalIn.read(bom, 0, bom.length);  
  34.   
  35.      if ( (bom[0] == (byte)0x00) && (bom[1] == (byte)0x00) &&  
  36.                  (bom[2] == (byte)0xFE) && (bom[3] == (byte)0xFF) ) {  
  37.         encoding = "UTF-32BE";  
  38.         unread = n - 4;  
  39.      } else if ( (bom[0] == (byte)0xFF) && (bom[1] == (byte)0xFE) &&  
  40.                  (bom[2] == (byte)0x00) && (bom[3] == (byte)0x00) ) {  
  41.         encoding = "UTF-32LE";  
  42.         unread = n - 4;  
  43.      } else if (  (bom[0] == (byte)0xEF) && (bom[1] == (byte)0xBB) &&  
  44.            (bom[2] == (byte)0xBF) ) {  
  45.         encoding = "UTF-8";  
  46.         unread = n - 3;  
  47.      } else if ( (bom[0] == (byte)0xFE) && (bom[1] == (byte)0xFF) ) {  
  48.         encoding = "UTF-16BE";  
  49.         unread = n - 2;  
  50.      } else if ( (bom[0] == (byte)0xFF) && (bom[1] == (byte)0xFE) ) {  
  51.         encoding = "UTF-16LE";  
  52.         unread = n - 2;  
  53.      } else {  
  54.         // Unicode BOM mark not found, unread all bytes  
  55.         encoding = defaultEnc;  
  56.         unread = n;  
  57.      }      
  58.      //System.out.println("read=" + n + ", unread=" + unread);  
  59.   
  60.      if (unread > 0) internalIn.unread(bom, (n - unread), unread);  
  61.   
  62.      // Use given encoding  
  63.      if (encoding == null) {  
  64.         internalIn2 = new InputStreamReader(internalIn);  
  65.      } else {  
  66.         internalIn2 = new InputStreamReader(internalIn, encoding);  
  67.      }  
  68.   }  
  69.   
  70.   public void close() throws IOException {  
  71.      init();  
  72.      internalIn2.close();  
  73.   }  
  74.   
  75.   public int read(char[] cbuf, int off, int len) throws IOException {  
  76.      init();  
  77.      return internalIn2.read(cbuf, off, len);  
  78.   }  
  79.   
  80. }  

2.使用工具类读取文件

[java]  view plain  copy
  1. BufferedReader br = new BufferedReader(  
  2.      new UnicodeReader(  
  3.      new FileInputStream(sqlFile),   
  4.      Charset.defaultCharset().name()));   



3.出现有问号的编写

  1. File f  = new File("./utf.txt");  
  2.         FileInputStream in = new FileInputStream(f);  
  3.         // 指定读取文件时以UTF-8的格式读取  
  4.         BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8"));  
  5.           
  6.         String line = br.readLine();  
  7.         while(line != null)  
  8.         {  
  9.             System.out.println(line);  
  10.             line = br.readLine();  
  11.         }  

只需编写工具类,将 new  InputStreamReader(in,  "UTF-8" )替换成

new UnicodeReader(new FileInputStream(sqlFile),Charset.defaultCharset().name())就可以解决该问题。

java 读取文件乱码 NULL 博文链接:https://call-me-java-126-com.iteye.com/blog/1544324 立即下载

相关推荐

Java解决UTF-8的BOM问题

Java解决UTF-8的BOM问题,使用“UnicodeInputStream”、“UnicodeReader”。

java读取UTF-8的txt文件发现开头的一个字符问题

今天遇到一个奇葩问题,在读取一个TXT文件时,出现开头多了一个问号(?)。如下图: 莫名奇妙的多了一个。最后通过网上资料,知道在Java中,class文件采用utf8的编码方式,JVM运行时采用utf16。Java的字符串是永远都是unicode的,采用的是UTF-16的编码方式。想测试一下,java对UTF-8文件的读写的能力,结果发现了一个很郁闷的问题,如果通过java写的UTF-8文件...

weixin_30920091的博客 455

ENSP Pro VXLAN EVPN分布式网关部署配置

在BGP EVPN方式部署分布式网关的场景中,控制平面的流程包括VXLAN隧道建立、MAC地址动态学习;转发平面的流程包括同子网已知单播报文转发、同子网BUM报文转发、跨子网报文转发。该方式实现的功能全面,支持主机IP路由通告、主机MAC地址通告、主机ARP通告,可以直接使能ARP广播抑制功能。如果在VXLAN网络中采用分布式网关,推荐使用此方式。对比集中式网关,分布式网关的arp条目比集中式网关的arp条目少,分布式网关只学习租户侧的arp条目,不学习网络侧的arp条目。

qq2353177176的博客 4560

isutf8 java_Java读取UTF-8格式txt文件第一行出现乱码——问号“?”及解决;Java读带有BOM的UTF-8文件乱码原因及解决方法...

Java读取UTF-8的txt文件第一行出现乱码“?”及解决test.txt文件内容:A中2国3456test.txt文件采用写字板保存为UTF-8格式保存并关闭后使用写字板再次打开该UTF-8文档,中文、字母正常显示测试代码:importjava.io.BufferedReader;importjava.io.File;importjava.io.FileInputStream;impor...

weixin_42144366的博客 809

word 2013 长篇文档排版案例教程

office 2013 制作长文格式模板

1万+

UE5 StateTree实战:用分层状态机重构你的AI行为逻辑(附蓝图配置避坑点)

本文详细介绍了UE5中StateTree分层状态机的实战应用,帮助开发者重构AI行为逻辑。通过核心概念解析、迁移策略、高级技巧和避坑指南,展示了StateTree在灵活性、可维护性和并行处理方面的优势,特别适合复杂AI行为的开发与优化。

weixin_42558257的博客 249

JAVA处理txt文件中BOM头

背景 由于不同系统中生成的txt文件存在BOM头不同的问题,在文件的第一行的开头位置有时会存在“M-oM-;M-?”的隐藏内容,因此对上传txt文件需要特殊处理以防止文件处理过程中产生错误。 解决方式 从网站下载类UnicodeReader和BufferedReader publ...

chouqiu8451的博客 955

勇闯dify v1.0.0之设置模型供应商。解决:Reached maximum retries (3) for URL https://marketplace.dify.ai/

朋友们,大家好,今天带大家来勇闯dify v1.0.0。为什么叫勇闯呢?我就这么说吧,本来我昨天就想带大家勇闯v1.0.0的。但是dify的marketplace访问不了。公司的网和手机热点都试了,就是访问不了。我们连个模型都没有,还勇闯个球啊,对吧,就搁置了。今天,我赶紧看看这个marketplace好了没。一看,可以了。赶紧写下这篇博客,帮助同志们走出困境。

xiezhipu的博客 4616

Java读取UTF-8格式txt文件第一行出现乱码——问号“?”及解决

今天导入文件的时候,出现?,经过核查是UTF-8那个BOM的问题,最后经过查找,找了一个比较好的方法解决。 使用一个更强大点的工具类(可以支持UTF-8/UTF-16LE/UTF-16BE/UTF-32LE/UTF-32BE):            参考地址:http://koti.mbnet.fi/akini/java/unicodereader/, 下载其中两个文件:Uni

hongtea1234的专栏 4100

【Android Performance】Android CPU调度模式详解:从performance到schedutil的Governor调优指南

本文系统讲解Android/Linux系统中的CPU频率调节策略(Governor),涵盖六大调度模式的底层工作原理:performance(性能优先)、powersave(省电优先)、conservative(保守调频)、ondemand(按需调频)、userspace(手动控制)以及schedutil(调度器驱动)。文中深入拆解每种Governor的调频决策逻辑、上升/下降曲线的差异、适用场景与选型建议,并配以实操命令演示如何查看可用Governor列表、动态切换调度模式以及多Cluster架构下的统一

weixin_44081096的博客 432

TC8:SOMEIPSRV_SD_MESSAGE_07-09

TTL为服务实例的生命周期。在此生命周期之后,不提供服务实例。

jasonj333 908

java 写utf-8有bom_Java读带有BOM的UTF-8文件乱码

通过java写的UTF-8文件,使用Java可以正确的读,但是如果用记事本将相同的内容使用UTF-8格式保存,则在使用程序读取是会从文件中多读出一个不可见字符,多一个?实例:新建一个文本:内容为“测试BOM”的txt文本,另存为UTF-8.处理带BOM的类UnicodeReaderpackage com.java.io;import java.io.IOException;import java....

weixin_36269733的博客 574

【Neo4j × Python】基于知识图谱的电影问答系统(含问题记录与解决)附:源代码(含Bug解决)

此前,曾介绍过Neo4j的一些基础知识,本篇将在PyCharm中与Neo4j建立关联,从0到1实现一个基于知识图谱的电影问答系统,实现过程中,没有一帆风顺,而是遇到了一些问题,因此也包含问题的记录与解决。

追光者♂:记录、分享、总结、提升,现象级专栏《Python从入门到人工智能》作者,无惧黑暗,坚信曙光 3166

java读取文件有个问号_java读取文本文件第一个字符多出一个问号解决方法

测试代码如下package test;import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.i...

weixin_35918198的博客 1371

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Java如何获取文本文件的字符编码【UTF-8格式判断改进版】

一、认识字符编码: 1、Java中String的默认编码为UTF-8,可以使用以下语句获取:Charset.defaultCharset(); 2、Windows操作系统下,文本文件的默认编码为ANSI,对中文Windows来说即为GBK。例如我们使用记事本程序新建一个文本文档,其默认字符编码即为ANSI。 3、Text文本文档有四种编码选项:ANSI、Unicode(含UnicodeBi...

小宇飞刀的BLOG 1万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

用Java从UTF-8文本文件中读取内容

整体思路:(1)读取源文件内容(UTF-8编码无BOM), 通过FileReader字符流完成;(2)向目标文件写内容,通过FileWriter字符流完成;(3)向控制台输出内容;最后的结果是,目标文件为UTF-8编码格式,一切正常;控制台得到的输出,中文字符为乱码,英文字母,标点符号一切正常。解码过程我查阅了Java API文档,官方在线文档在这里。结合之前理解的Java输入流与输出流的知识,找到

u012934551的博客 8082

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

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

Java读取UTF-8格式txt文件第一行出现乱码——问号“?”及解决;Java读带有BOM的UTF-8文件乱码原因及解决方法

Java读取UTF-8格式txt文件第一行出现乱码——问号“?”及解决;Java读带有BOM的UTF-8文件乱码原因及解决方法

jackpk的专栏 5万+

Windows系统——读取编码为utf-8与utf-8-sig的文件区别

Windows系统——读取编码为utf-8与utf-8-sig的文件区别 1、问题背景: 相信很多细心的朋友在实战的过程中发现,Windows系统下,利用Python或者Java读取txt文件时,控制台打印首行正常,但是若是用首行内容打开文本的话,就会报错。(换句话说,断点调试你会发现第一行多了一串字符"\ufeff")。Linux与Ma...

GeekZW的博客 2694

读取 UTF-8 格式的文本第一行第一个字符是空字符的解决办法

完成项目过程中遇到的问题,记录一下。 java读取UTF-8格式文件时,发现了一个很郁闷的问题:如果通过java写的UTF-8文件,使用Java可以正确的读,但是如果用记事本将相同的内容使用UTF-8格式保存,则在使用程序读取是会从文件中多读出一个不可见字符。 测试代码如下: package test; import java.io.*; public class HelloWorld { ...

yeshenyuexieriji的博客 1219

windows java读取utf-8编码文件时出现第一个字符为未知字符"?" 的解决方案

个人作为笔记记录在csdn上,暂时也没有对其进行深入了解,只做出处理方案。 在windows 环境下,使用java文件流读取文本文件时,会出现第一个字符为未知字符"?" 其他字符完整。google之,了解到bom编码标记。使用 16进制打印输出结果: 只要出现该头的16进制编码为这种字符便可以断定该文本文件的编码方式了。 bom编码标记: bom全称是:byte order mar

u012682171的专栏 2863
上一篇: Spring3.0配置多个事务管理器(即操作多个数据源)的方法
下一篇: 关于电量虚报,高电量关机的解决方法
mmoooodd
博客等级 码龄18年 35粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值