【问题标题】:Is it possible to put a string array into buffered Reader?是否可以将字符串数组放入缓冲的 Reader 中?
【发布时间】:2018-08-31 14:52:45
【问题描述】:

我目前正在做一个项目,该项目需要我设置一个分布式网络模拟器,我让它从文件中获取输出并使用缓冲阅读器解析每一行,如下所示,但我现在想使用一个预定义的数组并让我的 bufferedReader 从中获取输入,而不是我在网上查找了一些解决方案来帮助我将这个数组放入缓冲的 Reader 但似乎没有工作。

在运行和终止代码时我没有收到任何错误,但似乎在某些时候陷入了无限循环,我认为它是使用数组的新缓冲读取器段。这背后的想法是使该过程比重写许多段以适应数组解析更简单,而是通过将数组放在缓冲的 Reader 中找到一种更简单的方法,但事实证明这很困难,我可能不得不求助于更改。我已经测试了数组是否被正确初始化,这不是问题,所以要考虑的事情少了。

**Previous code:**
 private void parseFile(String fileName) throws IOException {
        System.out.println("Parsing Array");
        Path path = Paths.get(fileName);
        try (BufferedReader br = Files.newBufferedReader(path)) {
            String line = null;
            line = br.readLine(); // Skip first line
            while ((line = br.readLine()) != null) {
                parseLine(line);
            }
        } catch (IOException x) {
            System.err.format("IOException: %s%n", x);
        }
    }

在线建议是使用带有缓冲读取器的输入流,但这似乎根本不起作用,因为它覆盖了数组,任何关于我可以用于缓冲读取器段的建议都会很重要.

上面的 Array 方法只是创建在方法之前调用的数组的 void,因此我认为应该初始化数组,如果有人可以查看并可能让我知道我哪里出错以及可能出现的问题太棒了,如果不是,我很感谢您抽出时间阅读本文,感谢您的宝贵时间。

New Code Attempt:
//Creating array to parse.
private void createArray(){
    myStringArray[0] = "Node_id Neighbours";
    myStringArray[1] = "1 2 10";
    myStringArray[2] = "2 3 1";
    myStringArray[3] = "3 4 2";
    myStringArray[4] = "4 5 3";
    myStringArray[5] = "5 6 4";
    myStringArray[6] = "6 7 5";
    myStringArray[7] = "7 8 6";
    myStringArray[8] = "8 9 7";
    myStringArray[9] = "9 10 8";
    myStringArray[10] = "10 1 9";
    myStringArray[11] = "ELECT 1 2 3 4 5 6 7 8 9";
}

private void parseArray() throws IOException {
    //InputStreamReader isr = new InputStreamReader(System.in);
    System.out.println("Parsing Array");

    // try (BufferedReader br = Files.newBufferedReader(path))
    try (BufferedReader br = new BufferedReader(isr)) {
        for(int i=0;i<12;i++)
        {
            String line = null;
            line = br.readLine(); // Skip first line
            while ((myStringArray[i] = br.readLine()) != null) {
                parseLine(line);
            }
        }
    } catch (IOException x) {
        System.err.format("IOException: %s%n", x);
    }
}

Answer: 你不能用缓冲阅读器做到这一点。如果这对任何人有任何用处,我都会这样修复它。非常感谢@L.Spillner 的解释和回答。

代码修复:

    private void parseArray() throws IOException {
    System.out.println("Parsing Array");

    for(int i=1;i<12;i++) //First row ignored.
        {
            String line = null;
            line = myStringArray[i];
            //Begin parsing process of each entity.
            parseLine(line);

        }
}

【问题讨论】:

  • 我还是有点困惑,您将传入的字符串分配给数组中的特定字段,然后尝试解析您试图跳过的行。这就是我的意思:while((myStringArray[i] = br.readLine()) != null){parseLine(line);}。您所做的是,您已将所有内容存储到数组中,因此使用来自控制台的输入覆盖其中的任何数据(因为 isr 是和 stdin/System.in 的 InputStream Reader)
  • @L.Spillner 我明白你的意思,InputStream 只是在线推荐一种将数组放入阅读器的方法,我将摆脱输入流并进行更多研究,非常感谢您的帮助!
  • 好吧,出于某种原因,我认为您现在还没有理解BufferedReader。如果我错了,请纠正我,但您想数组放入BufferedReader?如果是这样,答案很简单。你不能。查看javadoc 以获取更准确的信息。简而言之:BufferedReader 的唯一目的是从Reader 中读取字符。读者本身只是处理字符InputStreams的抽象结构。
  • @L.Spillner 是的,这是主要目标,我想找到一种方法让 bufferedReader 获取数组,但如果我不能,那也没关系!非常感谢您的帮助。

标签: java arrays bufferedreader


【解决方案1】:

让我们以对问题的准确答案开始。

您不能将任何内容直接放入BufferedReader尤其是当它是某种数据结构(如数组)时。

BufferedReader 的目的是处理 I/O 操作,更准确地说是输入操作。根据javadocBufferedReaderReader 作为参数。 Reader 是一个抽象类,其中包含处理字符 InputStreams 的“工具”。

BufferedReaderreadLine() 方法的工作方式是:到达InputStream 的任何字符都存储在缓冲区中,直到\n(换行/换行)或\r(回车)到达。当这两个特殊字符之一出现时,缓冲区被解释为字符串并返回给调用。

【讨论】:

    【解决方案2】:

    答案是你不能。感谢大家的反馈,并通过遍历数组并将每个项目分配给行来解决问题。

    【讨论】:

    • 如果有人想要完整的模拟器代码,请随时询问,我会提供课程链接。
    猜你喜欢
    • 2018-05-02
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-14
    相关资源
    最近更新 更多