18

我正在使用 BufferedReader 从 txt 文件中读取数字进行分析。我现在要解决的方法是 - 使用 .readline 读取一行,使用 .split 将此字符串拆分为字符串数组

public InputFile () {
    fileIn = null;

    //stuff here

    fileIn = new FileReader((filename + ".txt"));
    buffIn = new BufferedReader(fileIn);


    return;
    //stuff here
}

public String ReadBigStringIn() {
    String line = null;

    try { line = buffIn.readLine(); }
    catch(IOException e){};

    return line;
}

public ProcessMain() {
    initComponents();
    String[] stringArray;
    String line;

    try {
        InputFile stringIn = new InputFile();
        line = stringIn.ReadBigStringIn();
        stringArray = line.split("[^0-9.+Ee-]+"); 
        // analysis etc.
    }
}

这很好用,但是如果 txt 文件有多行文本怎么办?有没有办法输出一个长字符串,或者可能是另一种方法?也许使用while(buffIn.readline != null) {}?不知道如何实现这一点。

想法赞赏,谢谢。

4

7 回答 7

33

你是对的,这里需要一个循环。

通常的成语(仅使用纯 Java)是这样的:

public String ReadBigStringIn(BufferedReader buffIn) throws IOException {
    StringBuilder everything = new StringBuilder();
    String line;
    while( (line = buffIn.readLine()) != null) {
       everything.append(line);
    }
    return everything.toString();
}

这将删除换行符 - 如果您想保留它们,请不要使用该readLine()方法,而只需读入 a char[](并将其附加到您的 StringBuilder)。

请注意,此循环将一直运行到流结束(如果它没有结束,则会阻塞),因此如果您需要不同的条件来完成循环,请在其中实现它。

于 2011-04-01T16:20:00.653 回答
6

我强烈建议在这里使用库,但是从 Java 8 开始,您也可以使用流来执行此操作。

    try (InputStreamReader in = new InputStreamReader(System.in);
         BufferedReader buffer = new BufferedReader(in)) {
        final String fileAsText = buffer.lines().collect(Collectors.joining());
        System.out.println(fileAsText);
    } catch (Exception e) {
        e.printStackTrace();
    }

您还可以注意到它在内部joining使用时非常有效StringBuilder

于 2016-06-29T13:54:09.670 回答
2

如果您只想将整个文件读入字符串,我建议您使用GuavaFiles类:

String text = Files.toString("filename.txt", Charsets.UTF_8);

当然,这是假设您要维护换行符。如果你想删除换行符,你可以以这种方式加载它,然后使用 String.replace,或者你可以再次使用 Guava:

List<String> lines = Files.readLines(new File("filename.txt"), Charsets.UTF_8);
String joined = Joiner.on("").join(lines);
于 2011-04-01T16:17:18.137 回答
1

听起来你想要 Apache IO FileUtils

String text = FileUtils.readStringFromFile(new File(filename + ".txt"));
String[] stringArray = text.split("[^0-9.+Ee-]+");
于 2011-04-01T16:19:01.440 回答
0

如果您创建一个StringBuilder,那么您可以将每一行附加到它,并在最后返回使用的字符串toString()

您可以将您的 ReadBigStringIn() 替换为

public String ReadBigStringIn() {
        StringBuilder b = new StringBuilder();

        try {
            String line = buffIn.readLine();
            while (line != null) {
                b.append(line);
                line = buffIn.readLine();
            }
        }
        catch(IOException e){};

        return b.toString();
}
于 2011-04-01T16:19:45.530 回答
0

这将创建一个长字符串,每一行都与字符串“”(一个空格)分开:

public String ReadBigStringIn() {
    StringBuffer line = new StringBuffer();


    try { 
        while(buffIn.ready()) {
        line.append(" " + buffIn.readLine());
    } catch(IOException e){
        e.printStackTrace();
    }

    return line.toString();
}
于 2011-04-01T16:22:46.013 回答
0

您有一个包含双打的文件。看起来每行有多个数字,并且可能有多行。

最简单的做法是在 while 循环中读取行。

当到达最后一行时,您可以从您的 ReadBigStringIn 方法返回 null 并在那里终止您的循环。

但更正常的是以一种方法创建和使用阅读器。也许您可以更改为读取文件并返回数组或双精度列表的方法。

顺便说一句,你能简单地用空格分割你的字符串吗?

将整个文件读入单个字符串可能适合您的特定情况,但请注意,如果您的文件非常大,它可能会导致内存爆炸。对于此类 i/o,流式处理方法通常更安全。

于 2011-04-01T16:24:22.170 回答