繁体   English   中英

Java | InputStreamReader(System.in) – 它没有读取最后一行

[英]Java | InputStreamReader(System.in) – it is not reading last line

一直在尝试解决这个问题。 长话短说,它没有读取my input最后一行

我想要它做什么......读取文件并退出。

而已。 它在file ( example: .txt ) ,但是当涉及到System.in时,代码不起作用,很烦人。 什么时候应该很容易。

这是要重新创建的代码和照片!

    StringBuilder strBuilder = new StringBuilder();
    String line;

    // for the last line to "end", I have to do \n! ... but how...?

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    while((line = br.readLine()) != null) {
        System.out.println(line);
        strBuilder.append(line);
    }

    // Does not reach code
    System.out.println(strBuilder.toString());


我知道readLine()终止于\n\r ...在这种情况下, 4 fourth line之后没有换行符,所以我尝试使用.br.isEmpty().br.isBlank来“看到”在4 fourth line之后没有更多的行......但我想我错过了一些东西。

( copy and paste this info into the console without a line break after 4 fourth line )

在此处输入图像描述

1 first line
2 second line
3 third line
4 fourth line



你会得到这个

在此处输入图像描述

如果您在控制台中按ENTER (因为您输入的是 "\n" ),您得到4 fourth line打印出来,但这不是我所期望的。

目前,它不会终止。 它不会读取用户输入的最后一行。 它将处于一个循环中。

请帮忙:)

readline()将读取输入直到换行符或文件结尾(以先到者为准)。

如果你做得正确,即你 pipe 你的文件到你的 java 程序的标准输入,它应该工作。 像这样: cat myfile.txt | java MyClass cat myfile.txt | java MyClassjava MyClass < myfile.txt 如果您使用FileInputStream代替System.in ,它也将起作用。

问题仅在于您手动从控制台输入输入时。 在这种情况下, BufferedReader无法知道您的输入何时完成,因此它会一直等到换行符或文件结尾。 在 Linux 中,您可以简单地按Ctrl-D要求控制台关闭 java 程序的标准输入。

在 eclipse 中粘贴输入,然后单击其他窗格/窗口,然后单击控制台并按CTRL + Z将其作为 null 行并退出
在 windows 的命令提示符下,您必须按新行上的组合并按 Enter。

否则,您必须设置条件,例如该行是否为空白。 您必须按 Enter 输入空白行才能退出。

StringBuilder strBuilder = new StringBuilder();
        String line;

        // for the last line to "end", I have to do \n! ... but how...?

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        while((line = br.readLine()) != null && !line.isBlank()) {
            System.out.println(line);
            strBuilder.append(line);
        }

        // Does not reach code
        System.out.println("Printing result:" + strBuilder.toString());

Output:

1 first line
2 second line
3 third line
4 fourth line1 first line
2 second line
3 third line

4 fourth line

Printing result:1 first line2 second line3 third line4 fourth line

所以把它放在 rest 上,我相信这可能是一个错误的评估。 下面的代码按预期工作,正如你们所有人所说,代码工作正常。 无需对此进行进一步调查!

public static void main(String[] args) throws IOException {

    StringBuilder strBuilder = new StringBuilder();
    BufferedReader readFile;

    try {
          readFile = new BufferedReader(new FileReader("/src/z_hackerRank_problems/z_IOfile.txt"));
          String contentLine;
          while ((contentLine = readFile.readLine()) != null) {
              strBuilder.append(contentLine).append(" ");
          }
    } catch (IOException ioException) {
        ioException.printStackTrace();
    }
    printHistogram(strBuilder.toString());

}
// z_IOfile.txt | notice '4 fourth line', no line breaks, no "\n" but code still iterates through
1 first line
2 second line
3 third line
4 fourth line

使用 FileReader,它工作得很好。 使用 InputStreamReader(System.in)... 没那么多!




TLDR;

  • 代码应该通读所有行,但是使用InputStreamReader(System.in) ,如果没有"\n " | 它不能识别行尾字符/序列 "\r" | 执行停止循环的命令

  • 正如在这个线程中所说,HackerRank 评估可能需要进行一些修改,因为它可能是一个错误的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM