Java 如何读取多行输入

Java 如何读取多行输入,java,Java,我试图像复制过去的输入一样读取多行输入,但我无法在循环停止读取时结束。这是我的密码: import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String input =null; while(sc.hasNext()) {

我试图像复制过去的输入一样读取多行输入,但我无法在循环停止读取时结束
。这是我的密码:

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String input =null;
        while(sc.hasNext()) {
            input=sc.next();

        }
        String [] split = input.split(" ");
        for(int i = 0;i<split.length;i++) {
            for(int j = split[i].length()-1;j>=0;j--) {
                System.out.print(split[i].charAt(j));
            }
            System.out.print(" ");
        }
        sc.close();
    }

}
import java.util.Scanner;
公共班机{
公共静态void main(字符串[]args){
扫描仪sc=新的扫描仪(System.in);
字符串输入=null;
while(sc.hasNext()){
输入=sc.next();
}
String[]split=input.split(“”);
对于(int i=0;i=0;j--){
系统输出打印(拆分[i].charAt(j));
}
系统输出打印(“”);
}
sc.close();
}
}

使用缓冲区读取器类,这样您就可以同时获取多个输入


使用缓冲区读取器类,这样您就可以同时获取多个输入


因为您使用的是
while
循环,只要指定的条件为真/满足,它就会通过代码块循环/执行

在这里,您正在检查退出循环的任何条件。此方法可能会在等待输入扫描时阻塞,并且扫描仪不会超过任何输入

我看到的另一个差距是,您一次又一次地将输入重新分配给
input
var,而没有在接受下一行之前执行任何操作

您可以在此处更清楚地了解退出while循环:


因此,为了回答您的问题,您必须为while循环提供一些检查/退出条件,以便在循环中验证和退出。

因为您使用的是
while
循环,只要指定的条件为真/满足,它就会在代码块中循环/执行

在这里,您正在检查退出循环的任何条件。此方法可能会在等待输入扫描时阻塞,并且扫描仪不会超过任何输入

我看到的另一个差距是,您一次又一次地将输入重新分配给
input
var,而没有在接受下一行之前执行任何操作

您可以在此处更清楚地了解退出while循环:

因此,为了回答您的问题,您必须为while循环提供一些检查/退出条件,以便在循环中验证和退出。

方法将查看是否有内容可阅读。为此,它可能会阻塞并等待使用的
InputStream
,如中所述:

public boolean hasNext()

如果此扫描仪的输入中有另一个令牌,则返回true在等待输入扫描时,此方法可能会阻塞。扫描仪不会超过任何输入

InputStream
结束时,它将从
hasNext()
调用返回并返回
false
,因为没有要读取的令牌(并且数据/字节的源已关闭)。但是,由于您是通过
系统从键盘读取的。
中没有“结束”输入,因为您仍然可以在应用程序中输入新文本,而
while()
循环将读取这些文本

有几种解决方案:

  • 根据启动java应用程序的方式,可以按CTRL-D显式关闭所谓的“STDIN”流,该流“附加”到键盘输入。这样,流
    系统.in
    将结束,无法读取更多数据。这也由
    扫描器
    s
    hasNext()
    方法检测,该方法将在该点返回
    false

  • 您可以调用java应用程序,通过文件或其他命令为“STDIN”流提供数据。例如:
    echo“data”| java Main
    java Main
    (取决于您使用的终端/控制台)

  • 在内容中添加结束标记并查找它。当您在数据中放置一个类似于
    “MY_text_END”
    的文本并查找它时,您可以使用一个简单的
    equals()
    检查
    while()
    循环内部,当您看到标记
    “MY_text_END”
    时停止读取

  • hasNext()
    方法将查看是否有要读取的内容。为此,它可能会阻塞并等待使用的
    InputStream
    ,如中所述:

    public boolean hasNext()

    如果此扫描仪的输入中有另一个令牌,则返回true在等待输入扫描时,此方法可能会阻塞。扫描仪不会超过任何输入

    InputStream
    结束时,它将从
    hasNext()
    调用返回并返回
    false
    ,因为没有要读取的令牌(并且数据/字节的源已关闭)。但是,由于您是通过
    系统从键盘读取的。
    中没有“结束”输入,因为您仍然可以在应用程序中输入新文本,而
    while()
    循环将读取这些文本

    有几种解决方案:

  • 根据启动java应用程序的方式,可以按CTRL-D显式关闭所谓的“STDIN”流,该流“附加”到键盘输入。这样,流
    系统.in
    将结束,无法读取更多数据。这也由
    扫描器
    s
    hasNext()
    方法检测,该方法将在该点返回
    false

  • 您可以调用java应用程序,通过文件或其他命令为“STDIN”流提供数据。例如:
    echo“data”| java Main
    java Main
    (取决于您使用的终端/控制台)

  • 在内容中添加结束标记并查找它。当您在数据中放置一个类似于
    “MY_text_END”
    的文本并查找它时,您可以使用一个简单的
    equals()
    检查
    while()
    循环内部,当您看到标记
    “MY_text_END”
    时停止读取


  • 首先谢谢你的帮助,我已经
        Scanner sc = new Scanner(System.in);
        String input = null;
    
        while(sc.hasNext() && !(input = sc.next()).equals("exit")) {
            System.out.println(input);
        }
    
        sc.close();