Java:将文件读入数组

35
我有一个文件(名为“number.txt”),我想在Java中将其读入数组中。我应该如何做?这是一个简单的“一维”文件,包含100个数字。
问题是每次都会出现异常。显然找不到它(我确定拼写正确)。当查看代码示例时,它并未指定文件的完整文件路径,只有文件本身的名称。如果需要,我该如何处理?
此外,在读取文件时,数组是否会自动包含文件的所有行,还是我需要制作循环,将每行复制到相应的下标i?
我听说过BufferedReader类,它的目的是什么,与读取输入有何关联?
5个回答

66

这里是一些示例代码,可帮助您入门:

package com.acme;

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

public class FileArrayProvider {

    public String[] readLines(String filename) throws IOException {
        FileReader fileReader = new FileReader(filename);
        BufferedReader bufferedReader = new BufferedReader(fileReader);
        List<String> lines = new ArrayList<String>();
        String line = null;
        while ((line = bufferedReader.readLine()) != null) {
            lines.add(line);
        }
        bufferedReader.close();
        return lines.toArray(new String[lines.size()]);
    }
}

以及一个示例单元测试:

package com.acme;

import java.io.IOException;

import org.junit.Test;

public class FileArrayProviderTest {

    @Test
    public void testFileArrayProvider() throws IOException {
        FileArrayProvider fap = new FileArrayProvider();
        String[] lines = fap
                .readLines("src/main/java/com/acme/FileArrayProvider.java");
        for (String line : lines) {
            System.out.println(line);
        }
    }
}
希望这可以帮到您。

2
bufferedReader.close() 应该被包含在 try {} finally {} 块中吗? - LukeGT
@LukeGT- 是的,对于生产代码应该这样做。这些示例方法只是抛出异常。 - toolkit
现在最好使用try-with-resources语句,而不是try-finally。 - Slaw

42
import java.io.File;

import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;

import java.util.List;

// ...

Path filePath = new File("fileName").toPath();
Charset charset = Charset.defaultCharset();        
List<String> stringList = Files.readAllLines(filePath, charset);
String[] stringArray = stringList.toArray(new String[]{});

@Northener已经提到他们看过一些例子。这个回答没有回答他们所问的任何问题。 - allingeek
6
在Java 8中,您只需调用Files.readAllLines(filePath),它等同于将StandardCharsets.UTF_8作为字符集传递。 - emlai

4

Apache Commons I/O 提供了 FileUtils#readLines() 方法,它适用于大部分文件,除了特别巨大的文件:http://commons.apache.org/io/api-release/index.html。版本 2.1 中还包含 FileUtils.lineIterator() 方法,它适用于处理大文件。Google 的 Guava 库也包含类似的工具。


0
为了完整起见,另一种将文件1的所有行作为String[]读取的方法是使用Java 8+的BufferedReader.lines()方法。像这样:
BufferedReader br ...
String[] lines = br.lines().toArray(String[]::new);

请注意,由于lines()流无法提前告诉下游方法将有多少行,因此需要创建一些临时的String数组。但是,实现旨在避免不必要的复制。

1 - 你可以使用这种方法来处理任何可以用BufferedReader包装的东西。


0

在Java中,您应该能够使用正斜杠来引用文件位置。

BufferedReader类用于包装其他文件读取器,其读取方法可能不是非常高效的。您可以在Java APIs中找到更详细的描述。

Toolkit对BufferedReader的使用可能是您所需要的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接