通过文件流操作某个文件的时候,经常得到的是一堆乱码(中文乱码),如下面的一段代码运行后出现乱码,见图1
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
public class CsvDemo {
public static void readFile(String file, String code) {
BufferedReader fr;
try {
String myCode = code!=null&&!"".equals(code) ? code : "UTF8";
InputStreamReader read = new InputStreamReader(new FileInputStream(
file), myCode);
fr = new BufferedReader(read);
String line = null;
int flag=1;
// 读取每一行,如果结束了,line会为空
while ((line = fr.readLine()) != null && line.trim().length() > 0) {
if(flag==1) {
line=line.substring(1);//去掉文件头
flag++;
}
// 每一行创建一个Student对象,并存入数组中
System.out.println(line);
}
fr.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String file = "E:/5bb.312.1363@@.csv";
String file1 = "E:/MODELF-F0000_1.csv";
readFile(file, "GB2312");
// readFile(file1, file1Code);
// readFile(file, "GB2312");
// System.out.println(BytesEncodingDetect.nicename[s.detectEncoding(new File(file1))]);
// System.out.println(BytesEncodingDetect.nicename[s.detectEncoding(new File(file))]);
}
}
图1
原因: 字符集编码指定有误
难题: 怎样让程序自动识别文件的编码呢?如果知道了文件的编码,则动态的传递到程序中去,达到正确识别文件的目的
解决: 从网络上搜索到这样一个类“BytesEncodingDetect.java”(在附件中),可以达到目的。
下面是经调试后的源程序代码及正确识别文件后的截图 图2
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
public class CsvDemo {
public static void readFile(String file, String code) {
BufferedReader fr;
try {
String myCode = code!=null&&!"".equals(code) ? code : "UTF8";
InputStreamReader read = new InputStreamReader(new FileInputStream(
file), myCode);
fr = new BufferedReader(read);
String line = null;
int flag=1;
// 读取每一行,如果结束了,line会为空
while ((line = fr.readLine()) != null && line.trim().length() > 0) {
if(flag==1) {
line=line.substring(1);//去掉文件头
flag++;
}
// 每一行创建一个Student对象,并存入数组中
System.out.println(line);
}
fr.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
BytesEncodingDetect s = new BytesEncodingDetect();
String file = "E:/5bb.312.1363@@.csv";
String file1 = "E:/MODELF-F0000_1.csv";
//得到文件的编码
String fileCode = BytesEncodingDetect.nicename[s.detectEncoding(new File(file))];
String file1Code = BytesEncodingDetect.nicename[s.detectEncoding(new File(file1))];
readFile(file, fileCode);
// readFile(file1, file1Code);
// readFile(file, "GB2312");
// System.out.println(BytesEncodingDetect.nicename[s.detectEncoding(new File(file1))]);
// System.out.println(BytesEncodingDetect.nicename[s.detectEncoding(new File(file))]);
}
}
图2
BytesEncodingDetect.java该类的其他用法,还有
BytesEncodingDetect s = new BytesEncodingDetect();
String str = "??¤¤¤å";
System.out.println(BytesEncodingDetect.nicename[s.detectEncoding(str.getBytes("ISO-8859-1"))]);
System.out.println(new String(str.getBytes("ISO-8859-1"), "BIG5"));
System.out.println(BytesEncodingDetect.nicename[s.detectEncoding("Java世纪网".getBytes())]);
System.out.println(BytesEncodingDetect.nicename[s.detectEncoding(new URL("http://www.java2000.net"))]);
类文件BytesEncodingDetect.java和测试代码见附件
- 大小: 19.4 KB
- 大小: 19.6 KB
分享到:
相关推荐
EncodingDetect.java,java自动获取文件的编码,智能识别文件编码,支持本地file及指定url的编码识别,支持多达40余种编码的识别,包括最常见的UTF-8,GBK,GB2312,BIG5,UNICODE,ISO8859_1,ASCII等,FileUtil....
Java自动识别文件字符编码工具类 参考博客 https://blog.csdn.net/superbeyone/article/details/103036914 使用方式: String encode = EncodingDetect.getFileEncode(geoJsonFile); log.info("系统检测到文件[ {}...
然而,Java标准库并没有提供一种直接的自动检测文件编码的方法。通常,开发者需要借助第三方库或者自定义算法来实现这个功能。 这篇名为“BytesEncodingDetect.java”的文件很可能包含了一个自定义的编码检测算法。...
接下来,我们讨论读取CSV文件,特别是自动识别文件编码。在Java中,`java.nio.charset.Charset`类用于表示字符编码,但默认情况下,Java文件读取操作通常假设文件为UTF-8编码。对于其他编码,我们需要借助第三方库如...
- **错误处理**:当无法识别文件编码时,工具类应提供适当的错误处理机制,比如返回默认编码或抛出异常,以便调用者能够处理这种情况。 - **性能优化**:虽然检测文件编码有助于保证正确性,但可能会增加程序的运行...
首先,`chardet.jar`可能是一个字符集检测库,用于自动识别文件的原始编码。在处理未知编码的文件时,这样的工具非常有用。Chardet(字符集检测)通常是基于统计模型来判断文件最有可能采用的编码方式。例如,它可以...
在Java中,`java.nio.charset`包提供了一系列类用于处理和识别文件编码。最常用的类是`Charset`,它表示一种字符集,可以用来检测和转换文件的编码。例如,我们可以使用`Charset.defaultCharset()`获取系统默认的...
【标题】"cpdetector_1.0.10自动识别网页文件编码" 是一个软件工具,主要用于检测和识别网页文件的字符编码。这个版本是1.0.10,表明这是一个经过多次迭代优化的成熟软件。 【描述】"cpdetector自动识别网页文件...
java 取文件的编码格式 例如UTF-8,GBK,UTF-16,GB2312等等 java 取文件的编码格式 例如UTF-8,GBK,UTF-16,GB2312等等 java 取文件的编码格式 例如UTF-8,GBK,UTF-16,GB2312等等
这两个库都可以帮助我们自动识别文件的编码,并检查是否存在BOM。 1. **chardet库**: `chardet`库是基于Java的字符集检测工具,它可以分析字节序列并猜测其对应的字符编码。要使用`chardet`,你需要先将其导入到...
例如,Apache Tika库可以分析多种类型的文件内容,包括文本、图片等,自动识别出其内部的字符编码。 4. **逐步尝试**:如果以上方法都无法确定,可以按照常见编码的优先级顺序依次尝试解码,看哪个解码结果最合理。...
总的来说,`cpdetector_1.0.10.jar`是Java开发中的一个实用工具,它提供了高效且准确的文件编码检测功能,帮助开发者更好地处理文本数据,避免因编码问题而引发的程序异常。通过理解并熟练使用这类工具,可以提升...
总之,Java提供了一些库和工具来帮助开发者识别文件的编码,通过引入`cpdetector`和`chardet`库,结合`FileCharsetDetector.java`中的方法,可以有效地解决文件编码的判断问题。理解这些工具的工作原理,以及如何在...
例如,`java.nio.charset.Charset`类提供了识别字符集的功能,但不能自动检测文件编码。通常,我们需要读取文件的前几个字节,然后基于这些字节的特定模式(如BOM,Byte Order Mark)来猜测编码。 Apache Commons ...
文件编码是用来表示文本字符的规则,常见的有ASCII、GB2312、GBK、UTF-8等。不同的编码方式决定了字符集的大小和覆盖的字符范围。例如,ASCII只包含英文字符,而GBK则包含了更多的中文字符。UTF-8是一种多字节编码...
在编程领域,正确识别文件编码至关重要,因为它直接影响到文本的显示和处理,尤其是在处理多语言或者非ASCII字符时。`editminus`通过其强大的编码识别能力,确保了用户在打开任何类型的文本文件时都能获得准确无误的...
Java在处理图文识别时,不仅可以识别文字,还可以处理图像中的其他元素,如图表、符号等,这在数据分析、文档自动化等领域非常有用。 总结来说,Java提供了强大的工具和库,使得开发人员能够轻松实现图文识别和文字...
在处理未知编码的文件时,可能需要使用一些库来自动检测文件的编码,例如ICU4J库提供了`BreakIterator`和`CharsetDetector`类,能够帮助识别文件的编码格式。 了解和熟练掌握URL和文件的编码方式对于开发跨平台、跨...
此外,"charopen.bat"和"chartypeall.bat"可能是批处理脚本,它们可能封装了一些常用的操作,如批量检测文件编码或一次性打开多个文件。这些批处理文件可以大大提高工作效率,特别是在处理大量文本文件时。 在处理...