如果你有一个java.io.InputStream对象,你应该如何处理该对象并产生一个String?
假设我有一个InputStream包含文本数据,并且我想将其转换为a String,所以例如我可以将其写入日志文件.
采取InputStream并将其转换为最简单的方法是String什么?
public String convertStreamToString(InputStream is) {
// ???
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试JTextArea使用正则表达式拆分文本以拆分字符串\n然而,这不起作用,我也试过\r\n|\r|n和许多其他正则表达式的组合.码:
public void insertUpdate(DocumentEvent e) {
String split[], docStr = null;
Document textAreaDoc = (Document)e.getDocument();
try {
docStr = textAreaDoc.getText(textAreaDoc.getStartPosition().getOffset(), textAreaDoc.getEndPosition().getOffset());
} catch (BadLocationException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
split = docStr.split("\\n");
}
Run Code Online (Sandbox Code Playgroud) 尝试使用java.util.Scanner中的nextLine()方法时遇到了麻烦.
这是我尝试过的:
import java.util.Scanner;
class TestRevised {
public void menu() {
Scanner scanner = new Scanner(System.in);
System.out.print("Enter a sentence:\t");
String sentence = scanner.nextLine();
System.out.print("Enter an index:\t");
int index = scanner.nextInt();
System.out.println("\nYour sentence:\t" + sentence);
System.out.println("Your index:\t" + index);
}
}
Run Code Online (Sandbox Code Playgroud)
示例#1:此示例按预期工作.String sentence = scanner.nextLine();在继续之前,该行等待输入输入System.out.print("Enter an index:\t");.
这会产生输出:
Enter a sentence: Hello.
Enter an index: 0
Your sentence: Hello.
Your index: 0
Run Code Online (Sandbox Code Playgroud)
// Example #2
import java.util.Scanner;
class Test {
public void menu() {
Scanner scanner …Run Code Online (Sandbox Code Playgroud) 当我尝试使用Scanner以下方法获取用户输入时,我遇到了一个问题:
import java.util.Scanner;
public class Main
{
public static Scanner input = new Scanner(System.in);
public static void main(String[] args)
{
System.out.print("Insert a number: ");
int number = input.nextInt();
System.out.print("Text1: ");
String text1 = input.nextLine();
System.out.print("Text2: ");
String text2 = input.nextLine();
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
Insert a number: 55
Text1: Text2: Hi there!
Run Code Online (Sandbox Code Playgroud)
如您所见,该程序已跳过String text1 = input.nextLine();.这里有什么问题?以及如何解决这个问题?
如何在Java中使用控制台中的用户获得简单的键盘输入(整数)?我用这些java.io.*东西完成了这个,但它说它已被弃用了.
我现在应该怎么做?
嗨,我是新手Java,我想知道在控制台中读取用户输入的最佳选择是什么,据我所知,有3种方法可以做到:
Console console = System.console();BufferedReader input = new BufferedReader(new InputStreamReader(System.in));Scanner reader = new Scanner(System.in);我应该选择哪一个?为什么那个而不是其他的?
我正在System.in使用一个用户输入java.util.Scanner.我需要验证以下内容的输入:
最好的方法是什么?
我正在编写一个简单的程序,提示用户输入一些学生,然后要求用户输入每个学生的姓名和分数,以确定哪个学生的分数最高.
我编写了程序代码并编译.第一行要求一些学生并等待输入.第二行应该是要求学生姓名并等待输入,然后第三行应该打印ans询问该学生的分数,并等待输入但是在第二行打印后,立即调用第三行(第二行是等不及输入)然后在尝试在第三行之后输入所请求的信息时出现运行时错误.
如何调整代码以便在打印第三行之前打印第二行并等待输入字符串?
import java.util.Scanner;
public class HighestScore {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("Enter the number of students: ");
int numOfStudents = input.nextInt();
System.out.print("Enter a student's name: ");
String student1 = input.nextLine();
System.out.print("Enter that student's score: ");
int score1 = input.nextInt();
for (int i = 0; i <= numOfStudents - 1; i++) {
System.out.println("Enter a student's name: ");
String student = input.nextLine();
System.out.println("Enter that student's score: ");
int score = input.nextInt();
if (score …Run Code Online (Sandbox Code Playgroud) 这是一个可以用作重复目标的规范问题/答案.这些要求基于每天发布的最常见问题,可根据需要添加.它们都需要相同的基本代码结构才能进入每个场景,并且它们通常彼此依赖.
扫描仪看起来像一个"简单"的类,这是第一个错误的地方.它并不简单,它具有各种非明显的副作用和异常行为,以非常微妙的方式打破了最小惊讶原则.
所以这对于这个课程来说似乎有些过分,但洋葱错误和问题的剥离都很简单,但由于它们的相互作用和副作用,它们非常复杂.这就是为什么每天在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允许您编写代码更具弹性和可维护性.真实世界的软件使用标准化的文件格式解析器和文档格式,而不是独立分配中给出的特殊输入格式.
在Eclipse中运行以下操作最初导致Scanner无法识别控制台中的回车,从而有效阻止了进一步的输入:
price = sc.nextFloat();
Run Code Online (Sandbox Code Playgroud)
在代码之前添加此行会导致Scanner接受0,23(法语表示法)作为浮点数:
Locale.setDefault(Locale.US);
Run Code Online (Sandbox Code Playgroud)
这很可能是由于Windows XP Pro(法语/比利时语)中的区域设置.当代码再次运行时,仍然接受0,23并输入0.23会导致它抛出一个java.util.InputMismatchException.
有关为什么会发生这种情况的任何解释?还有一个解决方法或我应该使用Float#parseFloat?
编辑:这演示了Scanner如何使用不同的语言环境(在开头取消注释其中一行).
import java.util.Locale;
import java.util.Scanner;
public class NexFloatTest {
public static void main(String[] args) {
//Locale.setDefault(Locale.US);
//Locale.setDefault(Locale.FRANCE);
// Gives fr_BE on this system
System.out.println(Locale.getDefault());
float price;
String uSDecimal = "0.23";
String frenchDecimal = "0,23";
Scanner sc = new Scanner(uSDecimal);
try{
price = sc.nextFloat();
System.out.println(price);
} catch (java.util.InputMismatchException e){
e.printStackTrace();
}
try{
sc = new Scanner(frenchDecimal);
price = sc.nextFloat();
System.out.println(price);
} catch (java.util.InputMismatchException e){
e.printStackTrace();
}
System.out.println("Switching …Run Code Online (Sandbox Code Playgroud)