Java - 如何逐字而不是逐行读取大文件?

时间:2015-11-04 10:18:42

标签: java

我想阅读Java中的“text8”语料库并重新格式化一些单词。问题是,在这个100MB的语料库中,所有单词都在一行上。因此,如果我尝试使用BufferedReaderreadLine加载它,它会立即占用太多空间而无法处理它以分隔一个列表/数组中的所有单词。

所以我的问题是:在Java中是否有可能逐行读取语料库,逐字阅读?例如,因为所有单词都在一行上,例如每次迭代读取100个单词?

4 个答案:

答案 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);  
    }