Java 读取大型文件的最有效方法

Java 读取大型文件的最有效方法,java,nio,Java,Nio,我不熟悉JavaNIOAPI。 我需要帮助才能得到面试中常见问题的答案。 若有一个文件包含50GB的数据,那个么我们从文件中读取数据并找到最频繁的单词的最有效方法是什么 readLine()是比scanner更好的API。 除了创建多个线程以使用BufferedReader.readLine()API批量读取此文件外,我们还有其他方法吗?请参阅java.nio.channels.FileChannel javadocs: 文件的区域可以直接映射到存储器中;对于大型文件,这通常比调用通常的读或写方

我不熟悉JavaNIOAPI。 我需要帮助才能得到面试中常见问题的答案。 若有一个文件包含50GB的数据,那个么我们从文件中读取数据并找到最频繁的单词的最有效方法是什么

readLine()是比scanner更好的API。
除了创建多个线程以使用BufferedReader.readLine()API批量读取此文件外,我们还有其他方法吗?

请参阅java.nio.channels.FileChannel javadocs:


文件的区域可以直接映射到存储器中;对于大型文件,这通常比调用通常的读或写方法更有效

也许,使用下面的课程,您可以获得获取/阅读输入的最快方式:

 import java.io.DataInputStream; 
 import java.io.FileInputStream; 
 import java.io.IOException; 
 import java.io.InputStreamReader; 
 import java.util.Scanner; 
 import java.util.StringTokenizer; 

public class Main 
{ 
static class Reader 
{ 
    final private int BUFFER_SIZE = 1 << 16; 
    private DataInputStream din; 
    private byte[] buffer; 
    private int bufferPointer, bytesRead; 

    public Reader() 
    { 
        din = new DataInputStream(System.in); 
        buffer = new byte[BUFFER_SIZE]; 
        bufferPointer = bytesRead = 0; 
    } 

    public Reader(String file_name) throws IOException 
    { 
        din = new DataInputStream(new FileInputStream(file_name)); 
        buffer = new byte[BUFFER_SIZE]; 
        bufferPointer = bytesRead = 0; 
    } 

    public String readLine() throws IOException 
    { 
        byte[] buf = new byte[64]; // line length 
        int cnt = 0, c; 
        while ((c = read()) != -1) 
        { 
            if (c == '\n') 
                break; 
            buf[cnt++] = (byte) c; 
        } 
        return new String(buf, 0, cnt); 
    } 

    public int nextInt() throws IOException 
    { 
        int ret = 0; 
        byte c = read(); 
        while (c <= ' ') 
            c = read(); 
        boolean neg = (c == '-'); 
        if (neg) 
            c = read(); 
        do
        { 
            ret = ret * 10 + c - '0'; 
        } while ((c = read()) >= '0' && c <= '9'); 

        if (neg) 
            return -ret; 
        return ret; 
    } 

    public long nextLong() throws IOException 
    { 
        long ret = 0; 
        byte c = read(); 
        while (c <= ' ') 
            c = read(); 
        boolean neg = (c == '-'); 
        if (neg) 
            c = read(); 
        do { 
            ret = ret * 10 + c - '0'; 
        } 
        while ((c = read()) >= '0' && c <= '9'); 
        if (neg) 
            return -ret; 
        return ret; 
    } 

    public double nextDouble() throws IOException 
    { 
        double ret = 0, div = 1; 
        byte c = read(); 
        while (c <= ' ') 
            c = read(); 
        boolean neg = (c == '-'); 
        if (neg) 
            c = read(); 

        do { 
            ret = ret * 10 + c - '0'; 
        } 
        while ((c = read()) >= '0' && c <= '9'); 

        if (c == '.') 
        { 
            while ((c = read()) >= '0' && c <= '9') 
            { 
                ret += (c - '0') / (div *= 10); 
            } 
        } 

        if (neg) 
            return -ret; 
        return ret; 
    } 

    private void fillBuffer() throws IOException 
    { 
        bytesRead = din.read(buffer, bufferPointer = 0, BUFFER_SIZE); 
        if (bytesRead == -1) 
            buffer[0] = -1; 
    } 

    private byte read() throws IOException 
    { 
        if (bufferPointer == bytesRead) 
            fillBuffer(); 
        return buffer[bufferPointer++]; 
    } 

    public void close() throws IOException 
    { 
        if (din == null) 
            return; 
        din.close(); 
    } 
} 

public static void main(String[] args) throws IOException 
{ 
    Reader s=new Reader(); 
    int n = s.nextInt(); 
    int k = s.nextInt(); 
    int count=0; 
    while (n-- > 0) 
    { 
        int x = s.nextInt(); 
        if (x%k == 0) 
        count++; 
    } 
    System.out.println(count); 
} 
} 
import java.io.DataInputStream;
导入java.io.FileInputStream;
导入java.io.IOException;
导入java.io.InputStreamReader;
导入java.util.Scanner;
导入java.util.StringTokenizer;
公共班机
{ 
静态类读取器
{ 

final private int BUFFER_SIZE=1感谢您分享上述代码,以清晰地解释该场景。我没有什么疑问。据我所知,din=new DataInputStream(new FileInputStream(file_name));上面的代码行使用API DataInputStream读取文件,但这也需要将数据读入字符串变量,这当然是一项代价高昂的操作。还有其他方法可以改进它吗?基本上,这里我们没有根据变量的类型读取任何类型的变量。我们只是在r它是int、long、String或任何其他类型的变量。因此,不需要将变量显式存储为String!我还有两个问题。a)在每次读取操作中,都会返回一个值b)在我的访谈中,我被告知文件读取操作成本很高。您能帮我解决上述问题吗?我们可以研究一下这是为了理解FileChannel API,t,