当前位置: 首页 > 知识库问答 >
问题:

使用BufferedReader将文件内容存储在Integer的ArrayList中

全宪
2023-03-14

我想存储以下格式的文本文件的内容:

第一行包含两个整数,比如n和k,用空白分隔。

下面的行包含n个整数(n可以很大)(我希望将其存储在ArrayList中)

通过在网上搜索Java的文件处理方式,我了解到了BufferedReader是处理大输入的首选方式,因为它更快(与扫描器相比),也了解了如何处理。我的尝试如下:

public static void main(String[] args) throws IOException {
        StringBuilder t = new StringBuilder();
        try(BufferedReader br = Files.newBufferedReader(Paths.get("./interview1.txt"))) {
            t.append(br.readLine());
            String[] firstLine = new String[2];
            firstLine = t.toString().split(" ");
            int n = Integer.parseInt(firstLine[0]);
           // System.out.println(n);
            int k = Integer.parseInt(firstLine[1]);
           // System.out.println(k);
            String line;
            List<Integer> list = new ArrayList<>(n);
            while((line = br.readLine()) != null){
                String[] thisLine = line.split(" ");
                for(int i = 0; i < thisLine.length; i++){
                   // System.out.print(thisLine[i] + " ");
                   list.add(Integer.valueOf(thisLine[i]));
                }
            }
        } catch (Exception e) {
            System.err.format("IOException: %s%n", e);
        }

因为我知道第一行只包含2个数字,所以我读取该行,将其转换为大小为2的字符串数组,然后将两个整数分开。到现在为止一切都很好。

进入while循环之后,问题就来了。在尝试将内容html" target="_blank">添加到列表中时,我不断收到java.lang.NumberFormatException(据我所知,这意味着我试图将一个不包含可解析int的字符串转换为整数)。

取消对for循环中第一行的注释将导致以下输出:

3 4 2 1 6 7 1 2 2 3 (extra random 2 towards the end??)

当前使用的文件内容:

10 5
3 4 2 1 6 7 1 2 3

我做错了什么?

共有1个答案

诸新霁
2023-03-14

您似乎可以使用java.nio,因此我建议尽可能多地使用它的特性,并去掉BufferedReader:

我的示例文件numbers.txt如下所示:

1 2 14 55 165
2
3 4  5  6    7
4

6
7 8 9 10 11 12 13 14 15 16 17

您可以读取它并将数字存储在列表 中的每一行的单独的列表 中,或者只将您在该文件中读取的所有数字存储在单个列表 中。检查以下代码及其注释:

public static void main(String[] args) {
    // provide the path to the file
    Path pathToFile = Paths.get("Y:\\our\\path\\to\\numbers.txt");
    // provide a list of lists of numbers
    List<List<Integer>> numbersInLines = new ArrayList<>();
    // or provide a single list of integers
    List<Integer> allNumbers = new ArrayList<>();

    // try reading the file, you may want to check if it exists and is valid before
    try {
        Files.lines(pathToFile).forEach(line -> {
            // provide a list for the numbers of each line
            List<Integer> realNumbers = new ArrayList<>();
            // split the line by an arbitrary amount of whitespaces
            String[] lineElements = line.trim().split("\\s+");
            // convert them to integers and store them in the list of integers
            for (String lineElement : lineElements) {
                // check if there is an empty String
                if (!"".equals(lineElement)) {
                    // add it to the list of the current line
                    realNumbers.add(Integer.valueOf(lineElement));
                    // and / or add it to the list of all numbers
                    allNumbers.add(Integer.valueOf(lineElement));
                }
            }
            // store the list of numbers of the current line in the list of lists
            numbersInLines.add(realNumbers);
        });
    } catch (IOException e) {
        e.printStackTrace();
    }

    // print each line list
    numbersInLines.forEach(lineNumbers -> {
        lineNumbers.forEach(System.out::print);
        System.out.println();
    });

    // and / or print all the numbers in a single line, separated by a whitespace
    allNumbers.forEach(number -> System.out.print(number + " "));
}

输出结果如下:

121455165
2
34567
4

6
7891011121314151617
1 2 14 55 165 2 3 4 5 6 7 4 6 7 8 9 10 11 12 13 14 15 16 17 
 类似资料:
  • 我必须写一个程序: 提示用户输入输入文件的名称, 从输入文件中读取数据,并将有关汽车的信息存储在汽车对象数组列表中, 将数组列表中未排序的数据打印到屏幕上,如下所示: 我想不出前三步该怎么做。 我也有两个类,与这个项目,并将添加他们,如果需要/需要。因此,基本上只需要帮助了解如何从用户那里读取文本文件,将文本文件的内容添加到ArrayList中,并以格式化的方式打印出ArrayList的内容(我的

  • 假设序列化。bin是一个充满单词的文件,在序列化时是ArrayList 我希望能够反序列化“serialise.bin”文件并将内容存储在ArrayList中

  • 问题内容: 我的hangman程序有问题。我真的认为我需要做的事超出了我对Java的了解。这是我的代码 我能够使程序读取文件,然后打印到屏幕上,但是我不知道如何将文件中的单词存储到数组中。我一点都没有进步,所以请尝试并做到透彻。 问题答案: 您需要将读取的行保存在一个对象中,并将其分配给数组的某个字段。例如: 这会将值赋给数组的第一个字段。

  • 本文向大家介绍.NET中如何将文本文件的内容存储到DataSet,包括了.NET中如何将文本文件的内容存储到DataSet的使用技巧和注意事项,需要的朋友参考一下 前言 项目中对文本文件的操作比较简单,但是如果需要将文本文件的内容写入系统的缓存中,操作起来,会稍微的繁琐一些。现在总结一个较为通用的方法,将文本文件的内容缓存进入DataSet数据集中。下面话不多说了,我们直接来看示例代码吧。 示例代

  • 问题内容: 总而言之,我现在面临着将文本文件中的内容存储到数组中的想法。情况就像,文本文件内容: 我希望将它们逐行存储到数组中,这可能吗?我期望的是这样的: 我已经尝试过类似的方法,但似乎对我不起作用。如果有人可以帮助我,真的非常感谢。 代码是: 问题答案: 我建议使用处理动态大小的,而数组将需要预先定义的大小,您可能不知道。您始终可以将列表转回数组。

  • 这是一个简单的问题。但是我不能调试它。我有类“Adding.java”,它将一些数据添加到ArrayList 另一个类“WriteFile.java”创建了一个xml文件 当我执行此操作时,我得到以下输出 等等但我希望最终输出是这种形式的 “for”循环在“list”元素上迭代有什么问题吗。感谢您的帮助。提前感谢