如何在Java中更快地读取大型文本文件?

如何在Java中更快地读取大型文本文件?,java,performance,arraylist,java.util.scanner,bufferedreader,Java,Performance,Arraylist,Java.util.scanner,Bufferedreader,我刚刚做了一个简单的顺序中值滤波算法,我碰巧用了两个扫描器来处理命令行输入,一个扫描器来读取文件。现在的问题是,我有一个2000000行的文本文件,两列文本的形式是,读取该文件需要很长时间(超过2分钟) 基本上,程序只是简单地获取输入,使用中值滤波算法并写入输出文件 下面是我的代码: main.java import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOE

我刚刚做了一个简单的顺序中值滤波算法,我碰巧用了两个扫描器来处理命令行输入,一个扫描器来读取文件。现在的问题是,我有一个
2000000
行的文本文件,两列文本的形式是
,读取该文件需要很长时间(超过2分钟)

基本上,程序只是简单地获取输入,使用中值滤波算法并写入输出文件

下面是我的代码: main.java

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class main {
    public static void main(String args[]) throws NumberFormatException, IOException{
        String inFile; //Input file name.
        int filterSize; //Filter size (odd integer >= 3).
        String outFile; //Output file name.
        int arraySize;
        List<Float> elements = new ArrayList<Float>();
        int index = 0;

        //Scanner to take input file name, filter size and output file name.
        Scanner keyboardInput = new Scanner(System.in);
        System.out.println("Enter your keyboard input as follows: <data file name> <filter size(odd int >= 3> <output file name>");

        //Assigning values to variables.
        inFile = keyboardInput.next();
        filterSize = keyboardInput.nextInt();
        outFile = keyboardInput.next();


//      //Reading file
//      Scanner readFile = new Scanner(new File(inFile));
//      readFile.nextInt(); //Get Array Size        
//      
//      //Add elements into ArrayList
//      while(readFile.hasNext()){
//          readFile.nextInt();
//          elements.add(Float.parseFloat(readFile.next()));
//      }    

        //Reading file
        BufferedReader br = new BufferedReader(new FileReader(inFile));
        br.readLine(); //Get Array Size 

        String line;
        while((line = br.readLine())!= null){
            String[] nums = line.split(" ");
            int val = Integer.valueOf(nums[0]);
            elements.add(Float.valueOf(nums[1]));
        }
        br.close();

        new Serial(elements, filterSize, outFile);

    }
}
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class Serial {
    int filterSize; //Filter size (odd integer >= 3).
    String outFile; //Output file name.
    int arraySize;
    List<Float> elements = new ArrayList<Float>();
    int index = 0;


    public Serial(List<Float> elements, int filterSize, String outFile) throws FileNotFoundException, UnsupportedEncodingException {
        this.elements = elements;
        this.filterSize= filterSize;
        this.outFile = outFile;


        List<Float> tempElements = new ArrayList<Float>();
        List<Float> outputElements = new ArrayList<Float>();

        //Add first boundary element to ouput ArrayList
        outputElements.add(this.elements.get(0));

        while(elements.size() >= filterSize){
            for(int i = 0; i<filterSize; i++){
                tempElements.add(this.elements.get(i));
            }

            Collections.sort(tempElements);
            outputElements.add(tempElements.get((filterSize-1)/2));

            elements.remove(0);
            tempElements.clear();
        }

        //Add last boundary element to output ArrayList
        if (elements != null && !elements.isEmpty()) {
            outputElements.add(elements.get(elements.size()-1));
        }

        /*Trace. Checking if output is correct
        for(int i=0; i<outputElements.size(); i++){
            System.out.println(outputElements.get(i));
        }*/

        //Write elements to output file     
        PrintWriter writeOutput = new PrintWriter(this.outFile, "UTF-8");
        writeOutput.println(outputElements.size());//Number of lines
        for(int i=0; i<outputElements.size();i++){
            writeOutput.println(i+1 + " " + outputElements.get(i)); //Each line is written
        }

        writeOutput.close(); //Close when output finished writing.
    }   
}
使用将提高读取文件的速度,因为它的缓冲区比扫描仪大得多

我从您之前的一个问题中看到,您最初使用的是缓冲读取器。您可以逐行读取并在空格上拆分字符串,如下所示:

    //Reading file
    BufferedReader br = new BufferedReader(new FileReader(inFile));
    br.readLine(); //Get Array Size 

    String line;
    while((line = br.readLine())!= null){
        String[] nums = line.split(" ");
        int val = Integer.valueOf(nums[0]);
        elements.add(Float.valueOf(nums[1]));
    }
    br.close();
使用将提高读取文件的速度,因为它的缓冲区比扫描仪大得多

我从您之前的一个问题中看到,您最初使用的是缓冲读取器。您可以逐行读取并在空格上拆分字符串,如下所示:

    //Reading file
    BufferedReader br = new BufferedReader(new FileReader(inFile));
    br.readLine(); //Get Array Size 

    String line;
    while((line = br.readLine())!= null){
        String[] nums = line.split(" ");
        int val = Integer.valueOf(nums[0]);
        elements.add(Float.valueOf(nums[1]));
    }
    br.close();
使用将提高读取文件的速度,因为它的缓冲区比扫描仪大得多

我从您之前的一个问题中看到,您最初使用的是缓冲读取器。您可以逐行读取并在空格上拆分字符串,如下所示:

    //Reading file
    BufferedReader br = new BufferedReader(new FileReader(inFile));
    br.readLine(); //Get Array Size 

    String line;
    while((line = br.readLine())!= null){
        String[] nums = line.split(" ");
        int val = Integer.valueOf(nums[0]);
        elements.add(Float.valueOf(nums[1]));
    }
    br.close();
使用将提高读取文件的速度,因为它的缓冲区比扫描仪大得多

我从您之前的一个问题中看到,您最初使用的是缓冲读取器。您可以逐行读取并在空格上拆分字符串,如下所示:

    //Reading file
    BufferedReader br = new BufferedReader(new FileReader(inFile));
    br.readLine(); //Get Array Size 

    String line;
    while((line = br.readLine())!= null){
        String[] nums = line.split(" ");
        int val = Integer.valueOf(nums[0]);
        elements.add(Float.valueOf(nums[1]));
    }
    br.close();

在线程“main”java.lang.NumberFormatException中使用BufferedReader异常时出现以下错误:对于输入字符串:“at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)at java.lang.Integer.parseInt(Integer.java:504)at java.lang.Integer.valueOf(Integer.java:582)at main.main(main.java:45)字符串“”正试图转换为int。我假定您的输入文件是数组的第一行大小,每行后面都有两个数字。是这样吗?您可能需要添加一些错误检查。我用一个示例输入文件编辑了主帖。我不知道如何在注释中对其进行格式化。另外,您可以通过将ArrayList操作的大小预先调整为近似等于最终大小的大小来优化它。@n完全是的,这将帮助您:请注意,ArrayList内部包含一个数组(连续内存占用)。当可用空间耗尽时,ArrayList必须为添加更多元素保留更多空间,这意味着为新的、更大的数组和复制数据分配内存,如果经常重复,这可能是代价高昂的操作java.lang.NumberFormatException:For input string:“”at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)at java.lang.Integer.parseInt(Integer.java:504)at java.lang.Integer.valueOf(Integer.java:582)at main.main(main.java:45)A字符串“”正在尝试转换为int。我假定您的输入文件是数组的第一行大小,每行后面都有两个数字。是这样吗?您可能需要添加一些错误检查。我用一个示例输入文件编辑了主帖。我不知道如何在注释中对其进行格式化。另外,您可以通过将ArrayList操作的大小预先调整为近似等于最终大小的大小来优化它。@n完全是的,这将帮助您:请注意,ArrayList内部包含一个数组(连续内存占用)。当可用空间耗尽时,ArrayList必须为添加更多元素保留更多空间,这意味着为新的、更大的数组和复制数据分配内存,如果经常重复,这可能是代价高昂的操作java.lang.NumberFormatException:For input string:“”at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)at java.lang.Integer.parseInt(Integer.java:504)at java.lang.Integer.valueOf(Integer.java:582)at main.main(main.java:45)A字符串“”正在尝试转换为int。我假定您的输入文件是数组的第一行大小,每行后面都有两个数字。是这样吗?您可能需要添加一些错误检查。我用一个示例输入文件编辑了主帖。我不知道如何在注释中对其进行格式化。另外,您可以通过将ArrayList操作的大小预先调整为近似等于最终大小的大小来优化它。@n完全是的,这将帮助您:请注意,ArrayList内部包含一个数组(连续内存占用)。当可用空间耗尽时,ArrayList必须为添加更多元素保留更多空间,这意味着为新的、更大的数组和复制数据分配内存,如果经常重复,这可能是代价高昂的操作java.lang.NumberFormatException:For input string:“”at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)at java.lang.Integer.parseInt(Integer.java:504)at java.lang.Integer.valueOf(Integer.java:582)at main.main(main.java:45)A字符串“”正在尝试转换为int。我假定您的输入文件是数组的第一行大小,每行后面都有两个数字。是这样吗?您可能需要添加一些错误检查。我用一个示例输入文件编辑了主帖。我不知道如何在注释中对其进行格式化。另外,您可以通过将ArrayList操作的大小预先调整为近似等于最终大小的大小来优化它。@n完全是的,这将帮助您:请注意,ArrayList内部包含一个数组(连续内存占用)。当可用空间耗尽时,ArrayList必须为添加更多元素保留更多空间,这意味着要为新的、更大的数组和cop分配内存