用java程序复制UTF-8文件后开头出现?号

原始文件内容是这样的:

1000|1.0.0
313|20140814|2
银行流水号|银行交易时间|交易日期|银行虚拟账号|银行账号|银行账号类型|姓名|性别|证件类型|证件号码|证件有效期限|电话|邮箱|省|

市|区|详细地址|客户风险等级|第三方产品代码
31301201408140000002802313000000|20140814101832|20140814|00000000002014081200000000000355|6216920000065381|01|000|0|00|

371321198812266128|20150202|15811111111|[email protected]||11|||8|000888

我们将其另存为UTF-8格式,并用如下java代码读取文件

package com.szkingdom.leejun;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Arrays;

public class FileBomTest {
	public static void main(String[] args) throws IOException {
		File file = new File("F:\\haha.txt");
		FileInputStream fileInputStream=new FileInputStream(file);
		byte[] b=new byte[1024];
		byte[] B=new byte[0];
		int read =-1;
		while ((read=fileInputStream.read(b))>-1) {
			int i=B.length;
			B=Arrays.copyOf(B, B.length+read);
			for(int j=0;j<read;j++){
				B[i+j]=b[j];
			}
		}

		System.out.println(new String(B,"UTF-8"));
	}
}

这时候控制台上显示是这样的:

?1000|1.0.0
313|20140814|2
银行流水号|银行交易时间|交易日期|银行虚拟账号|银行账号|银行账号类型|姓名|性别|证件类型|证件号码|证件有效期限|电话|邮箱|省|市|区|详细地址|客户风险等级|第三方产品代码
31301201408140000002802313000000|20140814101832|20140814|00000000002014081200000000000355|6216920000065381|01|000|0|00|371321198812266128|20150202|15811111111|[email protected]||11|||8|000888

在最前面多了一个?号这是为什么。原因其实很简单,当我们再windows下另存为时windows给UTF-8添加了BOM头。导致了读取异常的现象。我们用16进制打开文件可以看到:EF BB BF 这几个前缀。既然知道出现?号的原理了,那么我们只需要判断是否有该前缀,若有则跳过相应的字符就行了。或者可以用外部工具类读取。

时间: 2024-12-19 15:22:48

用java程序复制UTF-8文件后开头出现?号的相关文章

WEB应用中的普通Java程序如何读取资源文件

1 package cn.itcast; 2 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 6 import javax.servlet.ServletException; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpSer

java程序执行SQL脚本文件

首先引入ibatis-common-2.jar包 import com.ibatis.common.jdbc.ScriptRunner; import com.ibatis.common.resources.Resources; jpetstore测试代码如下: package com.ibatis.jpetstore.test; import java.sql.DriverManager; import java.util.Properties; import com.ibatis.commo

Java-Servlet--《12-WEB应用中的普通Java程序如何读取资源文件.mp4》 有疑问

\第五天-servlet开发和ServletConfig与ServletContext对象\12-WEB应用中的普通Java程序如何读取资源文件.mp4; 多层时,DAO为了得到资源文件中的配置参数: servlet 中的 doGet方法中获得ServletcontextServletcontext context = this.getServletContext();然后将context 对象传到 DAO中使用,这样的话耦合就高了,不合理. 所以:要通过类加载器的方式 这个Properties

把Java程序打包成jar文件包并执行

把Java程序打包成jar文件包并执行 1.首先要确认自己写的程序有没有报错. 2.第一次我写的是Web Project到现在,我一直没有执行成功,所以最好创建的是java Project 打包步骤: 1.在项目上,右键,选择Export. 2.进入到下图界面,选择Java 下面的JAR file 3.选择项目,确认必要的文件是否选中,选择保存jar文件包的路径,如下图 4.完成步骤3之后,点击Next,进入如下图界面: 5.直接点Next,进入下面的界面: 6.直接点Finish,jar文件包

Java程序导出成.jar文件、生成.exe可执行文件及打包成可执行安装程序(可在无Java环境的计算机上运行)--以个人所得税计算器为例

作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 需要准备的软件: jdk,eclipse,exe4j,Inno Setup Compiler 一.Java源程序--个人所得税: package math; import javax.swing.JOptionPane;//凯鲁嘎吉 http://www.cnblogs.com/kailugaji/ public class WRRTax { public static void main( Stri

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

今天遇到一个奇葩问题,在读取一个TXT文件时,出现开头多了一个问号(?).如下图: 莫名奇妙的多了一个.最后通过网上资料,知道在Java中,class文件采用utf8的编码方式,JVM运行时采用utf16.Java的字符串是永远都是unicode的,采用的是UTF-16的编码方式. 想测试一下,java对UTF-8文件的读写的能力,结果发现了一个很郁闷的问题,如果通过java写的UTF-8文件,使用Java可以正确的读,但是如果用记事本将相同的内容使用UTF-8格式保存,则在使用程序读取是会从文

General MYSQL 复制.frm数据库文件后查看表提示表不存在 Error code: 1146

现象: 将含.frm的源数据库文件夹复制到另一Mysql环境下后,打开Mysql,查看数据库和表都无问题,但在打开数据表查看表结构和表数据时提示error code: 1146,要访问的数据表"doesn't exist" 解决: 除了复制.frm的源数据库文件夹外,还需停止mysql服务(无论是拷贝源还是拷贝目的地,mysql服务最好都停掉),然后再复制与源数据库文件夹同目录下的以下3个文件粘贴或覆盖到目的文件中,然后再启动Mysql服务即可. 拷贝以上3个文件需以停止Mysql服务

Java程序中读取外部文件时的路径问题

转自:https://www.cnblogs.com/wt20/p/8320346.html 项目经常会读取一些配置文件, 因此getResource方法便能够起到重要作用 使用时主要是两种方法, 一个是字节码文件Class类, 另一个是ClassLoader类加载器 使用Class类时有两种使用方式: 1. 使用"/"  获取到的是classpath路径 2. 不使用"/" 这就是相对路径 ClassLoader类 没有"/"的写法, 获取到的

java程序实现删除本地文件

import java.io.File; public class Test { public static void main(String args[]) {    Test t = new Test();    delFolder("d:/test");    System.out.println("OK"); } // 删除文件夹 // param folderPath 文件夹完整绝对路径 public static void delFolder(Strin