Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java BufferedReader不会读取输入的最后一行_Java_Stringbuilder - Fatal编程技术网

Java BufferedReader不会读取输入的最后一行

Java BufferedReader不会读取输入的最后一行,java,stringbuilder,Java,Stringbuilder,我现在正在解决一个问题(java实践)。该问题需要确保所提供输入的括号顺序正确(此链接中的更多信息:)。我面临的问题是,我的bufferedReader不会读取我的最后一行输入。它进入最后一个循环,但在阅读之前似乎“暂停”。我能让它工作的唯一方法是,如果我按enter键,程序将最后一次通过input.readLine()并打印出我的字符串。这是我的密码: public static void main(String[] args) { try { BufferedRea

我现在正在解决一个问题(java实践)。该问题需要确保所提供输入的括号顺序正确(此链接中的更多信息:)。我面临的问题是,我的bufferedReader不会读取我的最后一行输入。它进入最后一个循环,但在阅读之前似乎“暂停”。我能让它工作的唯一方法是,如果我按enter键,程序将最后一次通过input.readLine()并打印出我的字符串。这是我的密码:

public static void main(String[] args)
{

    try
    {
    BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
    System.out.println("input data:");
    //First line is read to take in the number of lines for input will follow
    int data = Integer.parseInt(input.readLine());

    int i = 0;

    while(i < data)
    {
    //temp string builder to hold the wanted characters
    StringBuilder stringy = new StringBuilder();
    String line = input.readLine();
    //temp string builder holding the entire line
    StringBuilder sb = new StringBuilder(line);
        for(int j = 0; j < sb.length(); j++)
        {
            //loops through string builder & adds the wanted characters to stringy
            switch(sb.charAt(j)){
            case '(' : stringy.append(sb.charAt(j));
            break;

            case ')' : stringy.append(sb.charAt(j));
            break;

            case ']' : stringy.append(sb.charAt(j));
            break;

            case '[' : stringy.append(sb.charAt(j));
            break;

            case '{' : stringy.append(sb.charAt(j));
            break;

            case '}' : stringy.append(sb.charAt(j));
            break;
            }
        } 
        System.out.println(stringy);

        i++;
    }
    }catch(IOException x)
    {
        x.printStackTrace();
    }

}
publicstaticvoidmain(字符串[]args)
{
尝试
{
BufferedReader输入=新的BufferedReader(新的InputStreamReader(System.in));
System.out.println(“输入数据:”);
//读取第一行以获取随后输入的行数
int data=Integer.parseInt(input.readLine());
int i=0;
而(i<数据)
{
//临时字符串生成器以保存所需字符
StringBuilder stringy=新的StringBuilder();
String line=input.readLine();
//保存整行的临时字符串生成器
StringBuilder sb=新的StringBuilder(线);
对于(int j=0;j
如果我不够清楚,很抱歉。我试图在网上阅读,但人们似乎没有这个具体的问题。我不知道怎么做,但似乎在我最后一行输入之前添加了一行或其他内容。谢谢你的帮助,我真的很感谢

编辑: 对不起,我意识到我没有为程序提供任何输入数据。这里是:

4
(a+[b*c]-{d/3}) 
(a + [b * c) - 17]
((a * x) + [b] * y) + c
auf(zlo)men [gy<psy>] four{s}
4
(a+[b*c]-{d/3})
(a+[b*c)-17]
((a*x)+[b]*y)+c
奥夫(兹洛)人[gy]四{s}
只要将上述内容复制并粘贴到您的程序中,您就会看到问题摘要

该方法阻止I/O读取输入,直到在输入中找到行终止符。输入的最后一行不同于所有其他行,因为它的结尾没有行终止符。在终端中按enter键可添加所需的行终止符,但作为副作用,它也会导致terminal将光标向下移动一行,从而导致您注意到的行之间出现“空格”。这不是真正意外的行为,也不是代码中的错误,但您可以通过确保在输入的最后一行末尾有行终止符字符来“修复”它

细节 我可以复制您描述的行为。我编译代码,运行它,然后粘贴到示例输入中。正如您所说,它挂起在最后一行。然后我按enter键,这会导致它继续,但为什么这是必要的?在最后一个结果之前还有一个意外的间隔

> java Test
input data:
4
(a+[b*c]-{d/3}) 
(a + [b * c) - 17]
((a * x) + [b] * y) + c
auf(zlo)men [gy<psy>] four{s}([]{})
([)]
(()[])

()[]{}
我在一个Mac上测试,它使用一个控制字符LF(换行符)来表示新行。这在其他平台上可能不同。最值得注意的是,Windows使用一个由两个控制字符组成的序列:CR/LF(回车符/换行符).根据标准,LF的ASCII代码是0a,以十六进制表示。这在代码表中显示。回到我们的十六进制转储,我们可以看到4次出现0a字符,注意在最后一行的末尾没有0a字符

这看起来似乎是一个很有前途的理论。我们还可以做些什么来验证它呢?多亏了,我们可以查看许多常见JDK类的源代码实现,包括
BufferedReader
。让我们试着看看的实现。这是一个相当棘手的循环,但底线是它跟踪“行尾”在名为
eol
的变量中,正是这种情况导致它停止在
fill
方法中填充其内部缓冲区,而是向调用者返回字符串

charLoop:
    for (i = nextChar; i < nChars; i++) {
        c = cb[i];
        if ((c == '\n') || (c == '\r')) {
            eol = true;
            break charLoop;
        }
    }

    startChar = nextChar;
    nextChar = i;

    if (eol) {
        String str;
        if (s == null) {
            str = new String(cb, startChar, i - startChar);
        } else {
            s.append(cb, startChar, i - startChar);
            str = s.toString();
        }
        nextChar++;
        if (c == '\r') {
            skipLF = true;
        }
        return str;
    }
charLoop:
对于(i=nextChar;i
好的,现在我确信了!让我们通过重复最初的测试来检验假设,但是这次让我们确保在最后一行的末尾有一个行终止符。复制粘贴该版本的输入,我现在看到了这些结果

0000000: 340a 2861 2b5b 622a 635d 2d7b 642f 337d  4.(a+[b*c]-{d/3}
0000010: 2920 0a28 6120 2b20 5b62 202a 2063 2920  ) .(a + [b * c) 
0000020: 2d20 3137 5d0a 2828 6120 2a20 7829 202b  - 17].((a * x) +
0000030: 205b 625d 202a 2079 2920 2b20 630a 6175   [b] * y) + c.au
0000040: 6628 7a6c 6f29 6d65 6e20 5b67 793c 7073  f(zlo)men [gy<ps
0000050: 793e 5d20 666f 7572 7b73 7d              y>] four{s}
> java Test
input data:
4
(a+[b*c]-{d/3}) 
(a + [b * c) - 17]
((a * x) + [b] * y) + c
auf(zlo)men [gy<psy>] four{s}
([]{})
([)]
(()[])
()[]{}
>java测试
输入数据:
4.
(a+[b*c]-{d/3})
(a+[b*c)-17]
((a*x)+[b]*y)+c
奥夫(兹洛)人[gy]四{s}
([]{})
([)]
(()[])
()[]{}

更像是这样!

该程序似乎工作正常。例如,如果您在第一个
readLine()
(数据)中输入
5
,则它将向您询问5个新值以匹配括号。每次,您都必须按“回车”一旦提供了这5个输入。那么,问题是什么?它工作正常检查这个抱歉,我没有提供我一直在使用的输入信息。我想这可能与复制和粘贴输入到服务器区域有关。我意识到你最终得到了所有的输入,我猜
> java Test
input data:
4
(a+[b*c]-{d/3}) 
(a + [b * c) - 17]
((a * x) + [b] * y) + c
auf(zlo)men [gy<psy>] four{s}
([]{})
([)]
(()[])
()[]{}