次のリンクを見てください。
http://snippetsofjosh.wordpress.com/tag/advantages-and-disadvantages-of-arraylist/
これが、(Array)List ではなく Array を常に使用することを好む理由の 1 つです。それでも、メモリ管理と速度について考えさせられました。
したがって、次の質問にたどり着きました。
ファイルのサイズ (/エントリ数) がわからない場合に、ファイルからデータを保存する最良の方法は何ですか(最良とは「計算時間の最小量」として定義されます) 。
以下に、3 つの異なる方法を紹介します。どの方法が最適で、その理由を知りたいと思います。質問を明確にするために、配列で終わる必要があると仮定しましょう。また、.txt ファイルのすべての行に 1 つのエントリ (/1 つの文字列) しかないと仮定しましょう。また、質問の範囲を限定するために、この質問は 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();
別の方法 (さらに良い方法) がある場合は、以下に入力してください。また、必要に応じてコードを自由に調整してください。
答え:
配列にデータを格納する最速の方法は、次の方法です。
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()]);