gpt4 book ai didi

java - 读取数组中文件数据的最快方法(Java)

转载 作者:行者123 更新时间:2023-12-01 06:45:07 25 4
gpt4 key购买 nike

请查看以下链接:

http://snippetsofjosh.wordpress.com/tag/advantages-and-disadvantages-of-arraylist/

这是我总是喜欢使用数组而不是(数组)列表的原因之一。尽管如此,这还是让我开始思考内存管理和速度。

因此我提出了以下问题:

当您不知道文件大小(/条目数)时,存储文件数据的最佳方式是什么(其中定义了best作为“最少的计算时间”)

下面,我将介绍 3 种不同的方法,我想知道哪一种最好以及为什么。为了问题清楚起见,我们假设我最终必须得到一个数组。另外,我们假设 .txt 文件中的每一行只有一个条目(/一个字符串)。另外,为了限制问题的范围,我将这个问题仅限于Java。

假设我们要从名为 words.txt 的文件中检索以下信息:

Hello
I
am
a
test
file

方法 1 - 双重且危险

File read = new File("words.txt");
Scanner in = new Scanner(read);

int counter = 0;

while (in.hasNextLine())
{
in.nextLine();
counter++;
}

String[] data = new String[counter];

in = new Scanner(read);

int i = 0;

while (in.hasNextLine())
{
data[i] = in.nextLine();
i++;
}

方法 2 - 清晰但多余

File read = new File("words.txt");
Scanner in = new Scanner(read);

ArrayList<String> temporary = new ArrayList<String>();

while (in.hasNextLine())
{
temporary.add(in.nextLine());
}

String[] data = new String[temporary.size()];

for (int i = 0; i < temporary.size(); i++)
{
data[i] = temporary.get(i);
}

方法 3 - 简短但严格

File read = new File("words.txt");
FileReader reader = new FileReader(read);

String content = null;

char[] chars = new char[(int) read.length()];
reader.read(chars);
content = new String(chars);

String[] data = content.split(System.getProperty("line.separator"));

reader.close();

如果您有其他方法(更好),请在下面提供。另外,如有必要,请随意调整我的代码。

<小时/>

Answer:

在数组中存储数据最快的方法是以下方法:

File read = new File("words.txt");
Scanner in = new Scanner(read);

ArrayList<String> temporary = new ArrayList<String>();

while (in.hasNextLine()) {
temporary.add(in.nextLine());
}

String[] data = temporary.toArray(new String[temporary.size()]);

对于 Java 7+:

Path loc = Paths.get(URI.create("file:///Users/joe/FileTest.txt"));
List<String> lines = Files.readAllLines(loc, Charset.defaultCharset());
String[] array = lines.toArray(new String[lines.size()]);

最佳答案

我认为最好在这里意味着更快。

我会使用方法 2,但使用 the Collection interface 提供的方法创建数组:

String[] array = temporary.toArray(new String[temporary.size()]);

或者更简单(Java 7+):

List<String> lines = Files.readAllLines(file, charset);
String[] array = lines.toArray(new String[lines.size()]);

其他方法:

  • 方法 1 执行两次传递,读取文件不太可能比调整数组列表的大小更有效
  • 我不确定方法 3 是否更快
<小时/>

更新:

为了完整起见,我运行了 microbenchmark使用如上所述的修改后的 method2 并包含一个附加方法 (method4),该方法一次读取所有字节,创建一个字符串并在新行上拆分。结果(以百万微秒为单位):

Benchmark   Mean 
method1 126.178
method2 59.679
method3 76.622
method4 75.293
<小时/>

编辑:

a larger 3MB file: LesMiserables.txt ,结果是一致的:

Benchmark      Mean 
method1 608649.322
method2 34167.101
method3 63410.496
method4 65552.79

关于java - 读取数组中文件数据的最快方法(Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17319621/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com