如何在JAVA中快速读取double文件
我有很多小文件包含一些数字,像这样 我需要读取第一个和第二个双精度,为此,我使用BufferedReader读取行并将其拆分,但速度非常慢。我想知道是否有其他方法可以更快地做到这一点如何在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
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吗?