【问题标题】:Java - splitting files by newlineJava - 按换行符分割文件
【发布时间】:2021-02-23 17:16:44
【问题描述】:

如何通过换行符分割文件?我试图通过 line.split("\\r?\\n") 进行拆分 - 但是当我尝试打印第 0 个索引时,当我只期望第一行时,我得到了整个文件内容。但是,如果我尝试在索引 0 处打印结果,我会得到整个文件内容,而我希望只得到第一行。


FileInputStream file = new FileInputStream("file.rcp");
BufferedReader reader = new BufferedReader(new InputStreamReader(file));
String line = reader.readLine();

 while (line != null) {
            String [] split = line.split("\\r?\\n");
            String name = split[0]; // test to see if name will print the first line only
            System.out.println(name);
            line = reader.readLine();
        }

文件格式

Food name - gyros
author - some name
Cusine type - greek
Directions - some directions
Ingredients - some ingredients

【问题讨论】:

  • @Abra 我添加了一个示例 rcp 文件,它只是另一种文件扩展名类型,类似于 txt 文件

标签: java arrays string file split


【解决方案1】:

文档,即readline() 的javadoc,说:

返回一个包含行内容的字符串,不包括任何行终止符

这意味着line.split("\\r?\\n")new String[] { line } 相同,即完全没用。

如果要将整个文件作为行数组读入内存,只需调用Files.readAllLines()

List<String> linesList = Files.readAllLines(Paths.get("file.rcp"));
String[] linesArray = linesList.toArray(new String[0]);

【讨论】:

  • 我已经读过文件,所以我看不到Files.readAllLines()的意义。我也不想将我的文件读入一个行数组,我想读入我的文件然后拆分每一行直到单独的变量
  • @sjw037 readLine() 一次只读取一行,这意味着输入已经“拆分”成行,无需调用split()。 --- 不,你还没有读过文件,问题中的代码正在读取文件,这个答案向你展示了如何用 1 行代码而不是 9 行来做到这一点在问题代码中,也写错了,因为它在读取文件后没有正确关闭文件。 --- 或者你反对学习更好的做事方式?
  • 啊我知道我没有意识到readLine() 已经“拆分”了行,我也关闭了文件它只是没有包含在示例中。但是当我回到我的 PC @Andreas 时,我会对其进行测试。
  • @sjw037 你确实关闭了文件?但是你正确地做到了吗?使用 try-with-resources,或者至少使用 try-finally?
  • 是的,我用 try-catch-finally 块关闭了它
【解决方案2】:

您根本不需要拆分任何字符串。您可以简单地读取一行并将其添加到 List&lt;String&gt;(如果行数已知,则添加到数组)。

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Main {
    public static void main(String[] args) throws IOException {
        FileInputStream file = new FileInputStream("file.rcp");
        List<String> list = new ArrayList<>();

        try (BufferedReader reader = new BufferedReader(new InputStreamReader(file))) {
            String line = reader.readLine();
            while (line != null) {
                list.add(line);
                line = reader.readLine();
            }
        }

        System.out.println(list);

        // An array out of the list
        String[] arr = list.toArray(new String[0]);
        System.out.println(Arrays.toString(arr));
    }
}

输出:

[Food name - gyros, author - some name, Cusine type - greek, Directions - some directions, Ingredients - some ingredients]
[Food name - gyros, author - some name, Cusine type - greek, Directions - some directions, Ingredients - some ingredients]

如果您已经将文件的内容读入了某个字符串(例如,String fileContent,如下所示),您可以简单地将字符串拆分为\r?\n,这将产生一个String[]

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) throws IOException {
        String fileContent = new String(Files.readAllBytes(Paths.get("file.rcp")));
        // Java11 onwards
        // String fileContent = Files.readString(Path.of("file.rcp"));

        String[] arr = fileContent.split("\\r?\\n");
        System.out.println(Arrays.toString(arr));
    }
}

输出:

[Food name - gyros, author - some name, Cusine type - greek, Directions - some directions, Ingredients - some ingredients]

【讨论】:

  • 不释放资源。非常糟糕的例子。请不要在这里教授糟糕的编码实践。 --- 此外,当前 8 行代码可以通过简单的调用 Files.readAllLines() 来完成时,为什么要这样做?
  • 你错了,Files.readAllLines() 在 Java 7 中有。
  • 仅供参考: split("\\r?\\n") 最好写成split("\\R"),其中正则表达式模式\R 表示“任何Unicode 换行序列,都相当于\u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029] "
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-06
  • 1970-01-01
  • 2010-09-21
  • 1970-01-01
  • 2013-07-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多