[英]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
}
Files
和Charsets
来自番石榴 。 或者,如果您需要逐行处理文件,请从此处开始:
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.