如何判断java.io.File所读取的文件编码

如何判断java.io.File所读取的文件编码

问题

java中涉及到文件读取,就经常要考虑文件编码问题。虽然程序中一般都指定UTF-8编码,但是用户总可能提交各种编码的文件(特别是windows下用户),如果对这些文件不做判断就直接按照UTF-8的方式读取的话,是肯定会乱码的。

解决方案

java原生并不支持文件编码的判断,一般都是read文件的前几个字节来判断,需要自己编写工具类,判断的编码类型也比较少。最近找到了个开源的项目juniversalchardet,能比较优雅的完成这个任务。
使用方法也很简单,下载它的jar包,按照官网的例子操作即可,当然这段代码自己封装成工具类最好了:

import org.mozilla.universalchardet.UniversalDetector;

public class TestDetector {
  public static void main(String[] args) throws java.io.IOException {
    byte[] buf = new byte[4096];
    String fileName = args[0];
    java.io.FileInputStream fis = new java.io.FileInputStream(fileName);

    // (1)
    UniversalDetector detector = new UniversalDetector(null);

    // (2)
    int nread;
    while ((nread = fis.read(buf)) > 0 && !detector.isDone()) {
      detector.handleData(buf, 0, nread);
    }
    // (3)
    detector.dataEnd();

    // (4)
    String encoding = detector.getDetectedCharset();
    if (encoding != null) {
      System.out.println("Detected encoding = " + encoding);
    } else {
      System.out.println("No encoding detected.");
    }

    // (5)
    detector.reset();
  }
}

我自己写成工具类测试的时候,发现有些文件还是不能判断出来(比如excel保存过的gbk编码的.csv文件),所以使用它判断文件编码的时候,最好处理下得不到编码的情况,比如给个默认编码啥的。

juniversalchardet的项目地址

  1. googlecode
  2. github
时间: 2024-10-08 17:22:25

如何判断java.io.File所读取的文件编码的相关文章

Java IO: File

原文链接 作者: Jakob Jenkov 译者: 李璟([email protected]) Java IO API中的FIle类可以让你访问底层文件系统,通过File类,你可以做到以下几点: 检测文件是否存在 读取文件长度 重命名或移动文件 删除文件 检测某个路径是文件还是目录 读取目录中的文件列表 请注意:File只能访问文件以及文件系统的元数据.如果你想读写文件内容,需要使用FileInputStream.FileOutputStream或者RandomAccessFile.如果你正在使

java.io.File的基本使用以及关于Windows中大小写问题

package fengke.filedemo; import java.io.File;import java.io.IOException;/** * java.io.File的基本使用以及关于Windows中大小写问题 * @author 锋客 *   注意:文件创建的异常:默认路径与绝对路径的问题:多级目录的创建 *       掌握三种构造方法:不能用于文件内容的访问. * */ public class FileDemo {    /* File类只用于表示文件(目录)的信息(名称.

利用java.io.File类实现遍历本地磁盘上指定盘符或文件夹的所有的文件

2016-11-18 这是本人的第一篇随笔博客,纠结了半天还是选择自己学的时候比较用心的一些知识点上.利用java.io.File类指定本地的文件夹进行遍历所有的文件. package org.lxm.filedemo; import java.io.File; import java.util.Scanner; /* * 本程序是将某个盘的所有文件夹及其文件全部调出来的操作 */ public class FileAllDemo { public static void main(String

IO:File类(java.io.File)

public class File extends Object implements Serializable, Comparable<File> 构造方法: public File(String pathname) 按照完整路径实例化 public File(File parent, String child) 按照父路径和文件名实例化 成员: public static final String separator 目录分隔符 ('\'.'/'等) public static final

File类(java.io.File)

File类(java.io.File) public class File extends Object implements Serializable, Comparable<File> 构造方法: public File(String pathname) 按照完整路径实例化 public File(File parent, String child) 按照父路径和文件名实例化 成员: public static final String separator 目录分隔符 ('\'.'/'等)

33.JAVA编程思想——JAVA IO File类

33.JAVA编程思想--JAVA IO File类 RandomAccessFile用于包括了已知长度记录的文件.以便我们能用 seek()从一条记录移至还有一条:然后读取或改动那些记录. 各记录的长度并不一定同样:仅仅要知道它们有多大以及置于文件何处就可以. 首先.我们有点难以相信RandomAccessFile 不属于InputStream 或者OutputStream 分层结构的一部分.除了恰巧实现了DataInput 以及DataOutput(这两者亦由 DataInputStream

Gradle构建Android Project出现java.io.File找不到的问题

出现此问题,一般是提示在  proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' 这行出错. 此问题是proguard-android.txt这个文件找不到,这个文件在 ${sdk.dir}\tools\proguard\proguard-android.txt:proguard-project.txt 所以,要让gadle要能找到这个文件,需要在系统变量中添加ANDROID_HOME

Java 基础【12】java.io.file 文件(文件夹) 创建和删除

使用 java.io.file 创建文件(文件夹),算是 java 最基础的知识. JDK API 中描述: 来段代码会看的更清楚: File file1 = new File("F:/AAA/BBB/CCC"); if (file1.mkdirs()) { System.out.println("多级层文件夹创建成功!创建后的文件目录为:" + file1.getPath() + ",上级文件为:" + file1.getParent());

java获取指定路径下的指定文件/java.io.File.listFiles(FilenameFilter filter)

java.io.File.listFiles(FilenameFilter filter) 返回抽象路径名数组,表示在目录中此抽象路径名表示,满足指定过滤器的文件和目录. 声明 以下是java.io.File.listFiles(FilenameFilter filter)方法的声明: public File[] listFiles(FilenameFilter filter) 参数 filter - 文件名过滤器 返回值 该方法返回抽象路径名数组,表示在目录中此抽象路径名表示,满足指定过滤器的