繁体   English   中英

从UTF-8文本文件中读取数据并进行标记化

[英]Reading data from UTF-8 text file and tokenize

我正在尝试从文本文件中读取UTF-8并进行一些标记化,但我遇到了编码问题:

try {
    fis = new FileInputStream(fName);
} catch (FileNotFoundException ex) {
    //...
}

DataInputStream myInput = new DataInputStream(fis);
    try {
        while (thisLine = myInput.readLine()) != null) {
            StringTokenizer st = new StringTokenizer(thisLine, ";");
            while (st.hasMoreElements()) {
            // do something with st.nextToken();
    }
}
} catch (Exception e) {
//...
}

和DataInputStream没有任何参数来设置编码!

让我引用Javadoc这个方法。

DataInputStream.readLine()

已过时。 此方法无法将字节正确转换为字符。 从JDK 1.1开始,读取文本行的首选方法是通过BufferedReader.readLine()方法。 使用DataInputStream类读取行的程序可以通过替换表单的代码转换为使用BufferedReader类:

     DataInputStream d = new DataInputStream(in);

有:

     BufferedReader d
          = new BufferedReader(new InputStreamReader(in));

顺便说一句:JDK 1.1于1997年2月问世,所以这对你来说不是什么新鲜事。

想想如果你读过Javadoc,每个人都会节省多少时间。 ;)

您可以使用InputStreamReader:

BufferedReader br = new BufferedReader (new InputStreamReader (source, charset);
while (br.readLine () != null) { ... }

您也可以尝试扫描仪,但我不确定它是否可以正常工作

为什么不使用InputStreamReader并指定编码? 然后,您可以使用BufferedReader进行换行以提供readLine()功能。

当您阅读文本(而不是二进制数据)时,您应该使用Reader(而不是InputStream)。 您可以通过执行-Dfile.encoding = utf-8来指定vm的编码。 Reader将自动使用此编码。 所以你甚至可以轻松切换编码。 您可以在FileReader上使用BufferedReader来获取readLine()。 readLine()方法在读取文本时只有意义,否则行结尾只是字节

一个非常简单的方法:

File myFile = ...

String contents = Files.toString(myFile, Charsets.UTF_8);
for (String token : contents.split(";")) {
    // do something with token
}

FilesCharsets来自番石榴 或者,如果您需要逐行处理文件,请从此处开始:

List<String> lines = Files.readLines(myFile, Charsets.UTF_8);

另请注意, split()在这里比StringTokenizer更容易使用。

知道并使用图书馆 ,因为我喜欢说。 (当然,一次阅读整个文件可能不适合所有情况。)

编辑 (2013):将我的建议从Apache Commons IO转移到Guava,这是一个整体更清洁,更积极维护的库。

StringTokenizer是一个非常简单的文本标记化类,我只推荐它用于不需要进一步识别标记的任务(即使用字典查找),并且只用于西方语言。

对于有关西方语言的更高级案例,可以基于unicode字符类(这将拾取多种空格,分隔字符等)编写简单的标记化器,然后使用正则表达式扩展以捕获特殊情况(如'that's',' C ++的...)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM