我正在使用这些Scanner方法nextInt()并nextLine()阅读输入.
它看起来像这样:
System.out.println("Enter numerical value");
int option;
option = input.nextInt(); // Read numerical value from input
System.out.println("Enter 1st string");
String string1 = input.nextLine(); // Read 1st string (this is skipped)
System.out.println("Enter 2nd string");
String string2 = input.nextLine(); // Read 2nd string (this appears right after reading numerical value)
Run Code Online (Sandbox Code Playgroud)
问题是输入数值后,第一个input.nextLine()被跳过而第二个input.nextLine()被执行,所以我的输出如下所示:
Enter numerical value
3 // This is my input
Enter 1st string // The program is supposed to stop here and …Run Code Online (Sandbox Code Playgroud) 我试图将一个简单的文本文件读入一个字符串.当然,通常的方法是获取输入流并使用readLine()进行迭代并将内容读入String.
在过去做过数百次之后,我只是想知道如何在最少的代码行中做到这一点?是不是像java这样的东西String fileContents = XXX.readFile(myFile/*File*/)......而是看起来像这样简单的东西?
我知道像Apache Commons IO这样的库提供了这样的简化,甚至我可以编写一个简单的Util类来实现这一点.但我想知道的是 - 这是一个如此频繁的操作,每个人都需要为什么Java不提供这么简单的功能呢?是不是真的有一个方法可以使用某些默认或指定的编码将文件读入字符串?
我正在尝试使一个小程序更强大,我需要一些帮助.
Scanner kb = new Scanner(System.in);
int num1;
int num2 = 0;
System.out.print("Enter number 1: ");
num1 = kb.nextInt();
while(num2 < num1) {
System.out.print("Enter number 2: ");
num2 = kb.nextInt();
}
Run Code Online (Sandbox Code Playgroud)
2号必须大于1号
此外,我希望程序自动检查并忽略用户是否输入字符而不是数字.因为现在当用户输入例如r而不是数字时,程序就会退出.
我希望有以下字符串
!cmd 45 90 "An argument" Another AndAnother "Another one in quotes"
Run Code Online (Sandbox Code Playgroud)
成为以下阵列
{ "!cmd", "45", "90", "An argument", "Another", "AndAnother", "Another one in quotes" }
Run Code Online (Sandbox Code Playgroud)
我试过了
new StringTokenizer(cmd, "\"")
Run Code Online (Sandbox Code Playgroud)
但这将返回"另一个"和"和另一个"另一个和另一个"这不是预期的效果.
谢谢.
编辑:我再次改变了这个例子,这次我认为它解释了最好的情况,尽管它与第二个例子没有什么不同.
我有一个Tab-delimited字符串(表示一个表),传递给我的方法.当我将它打印到命令行时,它看起来像一个包含行的表:
http://i.stack.imgur.com/2fAyq.gif
命令窗口已正确缓冲.我的想法是每行之前或之后肯定有一个新的行字符.
我的问题是我想将传入的字符串拆分为表示表格行的单个字符串.到目前为止,我有:
private static final String newLine = System.getProperty("line.separator").toString();
private static final String tab = "\t";
private static String[] rows;
...
rows = tabDelimitedTable.split(newLine); //problem is here
System.out.println();
System.out.println("################### start debug ####################");
System.out.println((tabDelimitedTable.contains(newLine)) ? "True" : "False");
System.out.println("#################### end debug###################");
System.out.println();
Run Code Online (Sandbox Code Playgroud)
输出:
################### start debug ####################
False
#################### end debug###################
Run Code Online (Sandbox Code Playgroud)
显然,字符串中有一些东西告诉操作系统开始新的一行.然而它显然不包含换行符.
在Windows XP SP3上运行最新的JDK.
有任何想法吗?
这是一个可以用作重复目标的规范问题/答案.这些要求基于每天发布的最常见问题,可根据需要添加.它们都需要相同的基本代码结构才能进入每个场景,并且它们通常彼此依赖.
扫描仪看起来像一个"简单"的类,这是第一个错误的地方.它并不简单,它具有各种非明显的副作用和异常行为,以非常微妙的方式打破了最小惊讶原则.
所以这对于这个课程来说似乎有些过分,但洋葱错误和问题的剥离都很简单,但由于它们的相互作用和副作用,它们非常复杂.这就是为什么每天在Stack Overflow上有很多关于它的问题.
大多数Scanner问题包括尝试不止一次这些事情.
我希望能够让我的程序在每次上一次输入后自动等待下一个输入.
我想知道如何检测退出命令并在输入该命令时结束我的程序.
我想知道如何以不区分大小写的方式匹配exit命令的多个命令.
我希望能够匹配正则表达式模式以及内置基元.例如,如何匹配看似日期(2014/10/18)的内容?
我想知道如何匹配可能不容易用正则表达式匹配实现的东西 - 例如,URL(http://google.com).
在Java世界中,Scanner是一个特殊情况,它是一个非常挑剔的课程,教师不应该给新学生使用说明.在大多数情况下,教师甚至不知道如何正确使用它.如果在专业的生产规范中使用它几乎没有,所以它对学生的价值是非常值得怀疑的.
使用Scanner意味着这个问题和答案提到的所有其他事情.Scanner关于如何解决这些常见问题并不仅仅是因为它Scanner几乎在所有Scanner出错的问题中始终存在共病问题.它永远不仅仅是关于next()vsnextLine(),这只是该类实现的挑剔的一个症状,在问题询问中的代码发布中总会存在其他问题Scanner.
答案显示了Scanner在StackOverflow上使用和询问的99%的案例的完整,惯用的实现.
特别是在初学者代码中.如果您认为这个答案过于复杂,那么Scanner请先告诉新学生使用的教师,然后再解释其复杂性,怪癖,非明显副作用及其行为的特点.
Scanner关于最小惊讶原则的重要性以及为什么一致的行为和语义在命名方法和方法论证中很重要,这是一个很好的教学时刻.
您可能永远不会真正看到
Scanner在专业/商业业务应用程序中使用,因为它所做的一切都是通过其他方式做得更好.真实世界的软件必须比Scanner允许您编写代码更具弹性和可维护性.真实世界的软件使用标准化的文件格式解析器和文档格式,而不是独立分配中给出的特殊输入格式.
这是一些示例代码:
import java.util.Scanner;
class In
{
public static void main (String[]arg)
{
Scanner in = new Scanner (System.in) ;
System.out.println ("how many are invading?") ;
int a = in.nextInt() ;
System.out.println (a) ;
}
}
Run Code Online (Sandbox Code Playgroud)
如果我运行该程序并给它一个int喜欢4,那么一切都很顺利.
另一方面,如果我回答too many它并不嘲笑我有趣的笑话.相反,我得到了这个(如预期的那样):
Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Scanner.java:819)
at java.util.Scanner.next(Scanner.java:1431)
at java.util.Scanner.nextInt(Scanner.java:2040)
at java.util.Scanner.nextInt(Scanner.java:2000)
at In.main(In.java:9)
Run Code Online (Sandbox Code Playgroud)
有没有办法让它忽略不是整数的条目或重新提示"有多少是入侵?" 我想知道如何做到这两点.
我正在使用缓冲读取器从文本文件中一次抓取一行.我也试图使用跟踪整数从文本文件中获取行号.不幸的是BufferedReader正在跳过空行(只有/ n或回车).
有没有更好的方法来解决这个问题?会使用扫描仪吗?
示例代码:
int lineNumber = 0;
while ((s = br.readLine()) != null) {
this.charSequence.add(s, ++lineNumber);
}
Run Code Online (Sandbox Code Playgroud)