Java读取TXT文本文件乱码解决方案

Java读取TXT文本文件乱码解决方案

今天在解析一个文本文件的时候出现了乱码,以前从未遇到,花了点时间解决了,在此总结一下:

首先,先看一下解析的代码:

private String[] getProjectData(File file){

} String[] data = null; try { } return data; BufferedReader br = new BufferedReader(new FileReader(file)); String str = br.readLine(); data = str.split("\t"); br.close(); e.printStackTrace(); e.printStackTrace(); } catch (FileNotFoundException e) { } catch (IOException e) {

这个方法很简单,就是获取txt文件中的一行数据,然后转换为数组,我这个文本中只有一行。就这种情况下获取到的str是乱码,我想出现乱码肯定是字符集编码的问题,然后自己新建了一个文本文档测试没有问题(开始用的文本时别的程序导出的),所以我估计是开始那个txt文件编码的问题,查看发现是Unicode编码(如何查看txt的编码呢,教你一个笨笨的办法:打开文件——另存为,然后看到最下面的编码,默认选择的就是当前文档的编码格式),问题就出现在这里。问题找到了就好解决了,修改代码为:

private String[] getProjectData(File file){

} String[] data = null; try { } return data; BufferedReader br = new BufferedReader(new String str = br.readLine(); data = str.split("\t"); br.close(); e.printStackTrace(); e.printStackTrace(); InputStreamReader(new FileInputStream(file),"UTF-16")); } catch (FileNotFoundException e) { } catch (IOException e) {

使用文件流读取,转换编码为“UTF-16”,这样乱码问题就解决了。

归纳一下:

txt文本文档有四种编码选项:ANSI、Unicode、Unicode big endian、UTF-8;默认应该是ANSI选项,就是系统的默认编码,一般是GBK,这种情况下用第一段代码解析是没有问题的,

也不需要转码;其他格式就需要用第二段代码对应转码了,Unicode对应UTF-16,UTF-8就不用说了。

关于获取txt文件编码,我们可能有时候需要用程序获取,动态判断,这里给一点资料,参考参考:

ANSI: 无格式定义

Unicode: 前两个字节为FFFE Unicode文档以0xFFFE开头

Unicode big endian: 前两字节为FEFF

UTF-8: 前两字节为EFBB UTF-8以0xEFBBBF开头

用程序取出前几个字节并进行判断即可。

 

第二篇:Java读取TXT文本文件乱码解决方案

Java读取TXT文本文件乱码解决方案

今天在解析一个文本文件的时候出现了乱码,以前从未遇到,花了点时间解决了,在此总结一下:

首先,先看一下解析的代码:

private String[] getProjectData(File file){

} String[] data = null; try { } return data; BufferedReader br = new BufferedReader(new FileReader(file)); String str = br.readLine(); data = str.split("\t"); br.close(); e.printStackTrace(); e.printStackTrace(); } catch (FileNotFoundException e) { } catch (IOException e) {

这个方法很简单,就是获取txt文件中的一行数据,然后转换为数组,我这个文本中只有一行。就这种情况下获取到的str是乱码,我想出现乱码肯定是字符集编码的问题,然后自己新建了一个文本文档测试没有问题(开始用的文本时别的程序导出的),所以我估计是开始那个txt文件编码的问题,查看发现是Unicode编码(如何查看txt的编码呢,教你一个笨笨的办法:打开文件——另存为,然后看到最下面的编码,默认选择的就是当前文档的编码格式),问题就出现在这里。问题找到了就好解决了,修改代码为:

private String[] getProjectData(File file){

} String[] data = null; try { } return data; BufferedReader br = new BufferedReader(new String str = br.readLine(); data = str.split("\t"); br.close(); e.printStackTrace(); e.printStackTrace(); InputStreamReader(new FileInputStream(file),"UTF-16")); } catch (FileNotFoundException e) { } catch (IOException e) {

使用文件流读取,转换编码为“UTF-16”,这样乱码问题就解决了。

归纳一下:

txt文本文档有四种编码选项:ANSI、Unicode、Unicode big endian、UTF-8;默认应该是ANSI选项,就是系统的默认编码,一般是GBK,这种情况下用第一段代码解析是没有问题的,

也不需要转码;其他格式就需要用第二段代码对应转码了,Unicode对应UTF-16,UTF-8就不用说了。

关于获取txt文件编码,我们可能有时候需要用程序获取,动态判断,这里给一点资料,参考参考:

ANSI: 无格式定义

Unicode: 前两个字节为FFFE Unicode文档以0xFFFE开头

Unicode big endian: 前两字节为FEFF

UTF-8: 前两字节为EFBB UTF-8以0xEFBBBF开头

用程序取出前几个字节并进行判断即可。

package com.syscan.oa.util;

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.FileWriter;

import java.io.IOException;

import java.util.ArrayList;

import java.util.List;

public class ReadWritTxtFileIO {

//

//

String path = "d:/file4.txt"; String[] str = writeToDat(path); System.out.println("str.length == " +str.length); for (int i = 0; i < str.length; i++) { } System.out.println(str[i]); String[] splitStr = str[i].split("#"); System.out.println("splitStr.length == " +splitStr.length); for(int j = 0; j < splitStr.length; j++) { } System.out.println(splitStr[j]); WriteDate(); public static void main(String[] args) { ReadDate(); //

BufferedWriter output = new BufferedWriter(new FileWriter(file)); file.createNewFile(); } file.delete(); try { File file = new File("D:/abc.txt"); if (file.exists()) { /** * 写入数据 */ @SuppressWarnings("unchecked") public static void WriteDate() { /** * 读取数据 */ public static void ReadDate() { } String url = "e:/2.txt"; try { } FileReader read = new FileReader(new File(url)); StringBuffer sb = new StringBuffer(); char ch[] = new char[1024]; int d = read.read(ch); while (d != -1) { } System.out.print(sb.toString()); e.printStackTrace(); e.printStackTrace(); String str = new String(ch, 0, d); sb.append(str); d = read.read(ch); } } catch (FileNotFoundException e) { } catch (IOException e) {

} } } ArrayList ResolveList = new ArrayList(); for (int i = 0; i < 10; i++) { } for (int i = 0; i < ResolveList.size(); i++) { } output.close(); System.out.println(ex); output.write(String.valueOf(ResolveList.get(i)) + "\n"); ResolveList.add(Math.random() * 100); } catch (Exception ex) { @SuppressWarnings("unchecked") public static String[] writeToDat(String path) { } File file = new File(path); List list = new ArrayList(); String[] str = null; try { } // 确定数组长度 str = new String[list.size()]; for (int i = 0; i < list.size(); i++) { } return str; String s = (String) list.get(i); str[i] = s; BufferedReader bw = new BufferedReader(new FileReader(file)); String line = null; // 因为不知道有几行数据,所以先存入list集合中 while ((line = bw.readLine()) != null) { } bw.close(); e.printStackTrace(); list.add(line); } catch (IOException e) {

相关推荐