如何在JAVA中快速读取double文件

如何在JAVA中快速读取double文件,java,string,io,double,Java,String,Io,Double,我有很多小文件包含一些数字,像这样 我需要读取第一个和第二个双精度,为此,我使用BufferedReader读取行并将其拆分,但速度非常慢。我想知道是否有其他方法可以更快地做到这一点 File ifile = new File(dataFile); FileReader ifr=new FileReader(ifile); BufferedReader br = new BufferedReader(ifr); br.readLine(); List<Double> ix = ne

我有很多小文件包含一些数字,像这样

我需要读取第一个和第二个双精度,为此,我使用BufferedReader读取行并将其拆分,但速度非常慢。我想知道是否有其他方法可以更快地做到这一点

File ifile = new File(dataFile);
FileReader ifr=new FileReader(ifile);
BufferedReader br = new BufferedReader(ifr);
br.readLine();
List<Double> ix = new ArrayList<Double>(1000);
List<Double> iy = new ArrayList<Double>(1000);
for (String sLine = br.readLine(); sLine != null && sLine != ""; sLine = br.readLine()) {
    String[] tmp = sLine.split(" ");
    double x = Double.parseDouble(tmp[0]);
    double y = Double.parseDouble(tmp[1]);
    ix.add(x);
    iy.add(y);
}
br.close();
File-ifile=新文件(数据文件);
FileReader ifr=新的FileReader(ifile);
BufferedReader br=新的BufferedReader(ifr);
br.readLine();
列表九=新阵列列表(1000);
列表iy=新阵列列表(1000);
对于(字符串sLine=br.readLine();sLine!=null&&sLine!=“sLine=br.readLine()){
字符串[]tmp=sLine.split(“”);
double x=double.parseDouble(tmp[0]);
double y=double.parseDouble(tmp[1]);
九.添加(x);
iy.添加(y);
}
br.close();

这里可能发生的一个小修改是,不是拆分整行,而是获取一个数组并从该数组中读取;您可以使用regex,它只获得初始的两个双精度值

如果读取的字符串非常大,这可能会提高性能

...
...
Pattern pattern = Pattern.compile("^([\\d.-]*)\\s([\\d.-]*)");
for (String sLine = br.readLine()) {
    Matcher matcher = pattern.matcher(sLine);
    if (matcher.matches()) {
        double x = Double.parseDouble(matcher.group(1));
        double y = Double.parseDouble(matcher.group(2));
        ix.add(x);
        iy.add(y);
    }
}
...
...
您还可以跳过空行检查和其他验证,因为if中的代码只有在模式与该行匹配时才会执行


这里使用的正则表达式演示:

请查找代码中提到的java文档

package com.learning.stackoverflow;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;

import static com.google.common.base.MoreObjects.firstNonNull;

/**
 * {@link FileReader} accept file name and returns
 * first and second column value per line in the embeded object {@link RequiredData}
 * when <code>getDoubleValuesPerLine()</code> is called
 */
public class FileReader {
    private final String completeFilePath;
    private final List<RequiredData> requiredDataList;

    public FileReader(String completeFilePath) {
        this.completeFilePath = completeFilePath;
        this.requiredDataList = new ArrayList<>();
    }

    /**
     * Method getDoubleValuesPerLine() will return first and
     * second double values in the embeded object {@link RequiredData}
     *
     * @return
     */
    public List<RequiredData> getDoubleValuesPerLine() {
        try (Stream<String> stream = Files.lines(Paths.get(this.completeFilePath))) {
            stream.forEach(this::readDataFromStringLine);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return requiredDataList;
    }

    private void readDataFromStringLine(String stringLine) {
        String[] independentValues = firstNonNull(stringLine.trim(), "").split(" ");
        requiredDataList.add(new RequiredData(Double.valueOf(independentValues[0]), Double.valueOf(independentValues[1])));
    }

    public class RequiredData {
        private final Double firstColumn;
        private final Double secondColumn;

        public RequiredData(Double firstColumn, Double secondColumn) {
            this.firstColumn = firstColumn;
            this.secondColumn = secondColumn;
        }

        public Double getFirstColumn() {
            return firstColumn;
        }

        public Double getSecondColumn() {
            return secondColumn;
        }
    }
}

您是否尝试分析您的代码?你知道你的代码的瓶颈是什么吗?如何避免第一行,标题行你能详细说明一下Mark.zxx吗?