我想阅读Java中的“text8”语料库并重新格式化一些单词。问题是,在这个100MB的语料库中,所有单词都在一行上。因此,如果我尝试使用BufferedReader
和readLine
加载它,它会立即占用太多空间而无法处理它以分隔一个列表/数组中的所有单词。
所以我的问题是:在Java中是否有可能逐行读取语料库,逐字阅读?例如,因为所有单词都在一行上,例如每次迭代读取100个单词?
答案 0 :(得分:6)
您可以尝试使用Scanner
并将分隔符设置为适合您的任何内容:
Scanner input=new Scanner(myFile);
input.useDelimiter(" +"); //delimitor is one or more spaces
while(input.hasNext()){
System.out.println(input.next());
}
答案 1 :(得分:2)
我建议你使用"字符流"与FileReader
以下是http://www.tutorialspoint.com/java/java_files_io.htm
的示例代码import java.io.*;
public class CopyFile {
public static void main(String args[]) throws IOException
{
FileReader in = null;
FileWriter out = null;
try {
in = new FileReader("input.txt");
out = new FileWriter("output.txt");
int c;
while ((c = in.read()) != -1) {
out.write(c);
}
}finally {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
}
}
它读取16位Unicode字符。这样,如果你的文字是一整行就无所谓了。
由于您正在尝试逐字搜索,因此您可以轻松阅读,直到您偶然发现一个空间并且有您的话语。
答案 2 :(得分:1)
使用next
java.util.Scanner
方法
next
方法查找并返回此扫描程序中的下一个完整令牌。一个 完整标记之前和之后是匹配的输入 分隔符模式。此方法可能在等待输入时阻塞 扫描,即使之前的Scanner.hasNext调用返回true。
示例:
public static void main(String[] args) {
Scanner sc = new Scanner (System.in);
String a = sc.next();
String b = sc.next();
System.out.println("First Word: "+a);
System.out.println("Second Word: "+b);
sc.close();
}
输入:
Hello Stackoverflow
输出
第一句话:你好
第二个字:Stackoverflow
在您的情况下,使用Scanner
来阅读文件,然后使用scannerobject.next()
方法阅读每个标记(单词)
答案 3 :(得分:-1)
try(FileInputStream fis = new FileInputStream("Example.docx")) {
ZipSecureFile.setMinInflateRatio(0.009);
XWPFDocument file = new XWPFDocument(OPCPackage.open(fis));
ext = new XWPFWordExtractor(file);
Scanner scanner = new Scanner(ext.getText());
while(scanner.hasNextLine()) {
String[] value = scanner.nextLine().split(" ");
for(String v:value) {
System.out.println(v);
}
}
}catch(Exception e) {
System.out.println(e);
}