使用java读取文件最有效的方法是什么?

使用java读取文件最有效的方法是什么?,java,Java,我有一个包含1亿条记录的文本文件。我正在使用非常旧的方式读取文件,但它花费了很长时间,无法完成,因为内存不足的问题。如果您能推荐使用java或使用任何外部库读取文件的最佳方式,我将不胜感激。(最终解决方案应减少耗时)这是我上面解释的代码 BufferedReader reader = null; List<String> fileLines = new ArrayList<String>(); String line = ""; reader =

我有一个包含1亿条记录的文本文件。我正在使用非常旧的方式读取文件,但它花费了很长时间,无法完成,因为内存不足的问题。如果您能推荐使用java或使用任何外部库读取文件的最佳方式,我将不胜感激。(最终解决方案应减少耗时)这是我上面解释的代码

BufferedReader reader = null;

    List<String> fileLines = new ArrayList<String>();
    String line = "";
    reader = new BufferedReader(new java.io.FileReader(file));
    while ((line = reader.readLine()) != null) {
        fileLines.add(line);
    }
    reader.close();
    return fileLines;
BufferedReader读取器=null;
List fileLines=new ArrayList();
字符串行=”;
reader=newbufferedreader(newjava.io.FileReader(file));
而((line=reader.readLine())!=null){
文件行。添加(行);
}
reader.close();
返回文件行;
也用了另一种方法,但结果是一样的

 public static void fileReading(File file, Object executingClass, String methodName, int size) throws IOException {
    try {
        Method method = executingClass.getClass().getMethod(methodName, List.class);

        BufferedReader reader = null;

        List<String> fileLines = new ArrayList<String>();
        String line = "";
        reader = new BufferedReader(new java.io.FileReader(file));
        int track = 0;
        while ((line = reader.readLine()) != null) {
            track++;
            fileLines.add(line);

            if (0 == track % size) {
                method.invoke(executingClass, fileLines);
                fileLines.clear();
            }
        }

        if (!fileLines.isEmpty()) {
            method.invoke(executingClass, fileLines);
            fileLines.clear();
        }

        reader.close();


    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    }
}
publicstaticvoidfilereading(文件文件、对象executingClass、字符串methodName、int size)引发IOException{
试一试{
方法Method=executingClass.getClass().getMethod(方法名,List.class);
BufferedReader reader=null;
List fileLines=new ArrayList();
字符串行=”;
reader=newbufferedreader(newjava.io.FileReader(file));
int轨道=0;
而((line=reader.readLine())!=null){
track++;
文件行。添加(行);
如果(0==磁道大小百分比){
调用(executingClass、文件行);
fileLines.clear();
}
}
如果(!fileLines.isEmpty()){
调用(executingClass、文件行);
fileLines.clear();
}
reader.close();
}捕获(无此方法例外){
e、 printStackTrace();
}捕获(非法访问例外e){
e、 printStackTrace();
}捕获(调用TargetException e){
e、 printStackTrace();
}
}

您有两种选择:

1-最好不要读取整个文件并将其存储在内存中。只需读取一行(或代表一个条目的一组行),处理它,然后对文件中的所有行重复它


2-如果确实需要将整个文件存储在内存中,请尝试增加JVM堆的大小。

通过传递以下参数,尝试扩大Java中分配给JVM的内存:

-Xms=3000m -Xmx=5000m
其中
m
表示MiB。您也可以对GiB使用
g


尝试逐个处理记录,而不将所有记录都存储在内存中。您试图通过将每一行添加到列表中来将整个文件读取到内存中。Java的JVM在默认情况下有~1GB的限制(尽管您可以增加它)。为什么你不能一次读每一行,做任何你需要的处理然后扔掉呢?我已经更新了我的问题,请看。通过使用我的新方法,我一次得到1000个字符串列表,并对其进行处理。你说的高效到底是什么意思?是的,我认为你不理解我们。您应该执行类似于
method.invoke(executingClass,ONELINE)
1亿次的操作,而不是
method.invoke(executingClass,十亿行)
一次。您应该只在必要时执行此操作。他可能不需要。我不知道伙计“如果你真的需要把整个文件存储在内存中……”然后修改你的算法,因为不,你不需要。