Java 如何从字符串中读取数据(相当于字符串流)

Java How to Read Data From a String (stringstream equivalent)

假设我有一个具有以下格式的字符串(称之为 s):

[String] [String] [double] [int]

例如, “是詹姆斯 3.5 2” 我想将这些数据读入单独的变量(字符串、字符串、双精度和整数)

请注意,我来自 C++ 背景。在 C++ 中,我会做类似下面的事情:

std::istringstream iss{s};   // create a stream to the string

std::string first, second; 
double third = 0.0;
int fourth = 0;
iss >> first >> second >> third >> fourth;  // read data

在Java中,我想出了下面的代码:

String[] sa = s.split(" ");
        
String first = sa[0], second = sa[1];
double third = Double.parseDouble(sa[2]);
int fourth = Integer.parseInt(sa[3]);

但是,我将不得不对许多不同的输入执行此操作,因此我想使用最有效和最快的方法来执行此操作。

问题:

正如评论中提到的那样,如果这是来自键盘(或实际上来自输入流),您可以使用 Scanner class 来实现。但是,对于键盘以外​​的输入源,我不会使用 Scanner 而是使用其他一些方法来解析字符串。例如,如果从文件中读取行,您可能希望改用 Reader。对于这个答案,我假设输入源是键盘。

使用扫描仪获取输入

Scanner scanner = new Scanner(System.in);
System.out.print("Provide your input: ");
String input = scanner.nextLine();
input.close();

将字符串分解为标记

这里有几个选项。一种是通过使用白色 space 作为分隔符将输入拆分为子字符串:

String[] words = input.split("\s");

如果保证这些子串的顺序,可以直接赋值给变量(不是最优雅的方案——但可读)

String first = words[0];
String second = words[1];
double third = words[2];
int fourth = words[3];

或者,你可以直接使用String#substring(int) and/or String#substring(int, int) 方法提取子串,并测试获取的子串是否为数字(double 或 int),或者只是只是一个字符串。

像这样尝试。 Scanner的构造函数可以将字符串作为数据源。

Scanner scan = new Scanner("12 34 55 88");
while (scan.hasNext()) {
   System.out.println(scan.nextInt());  
}

打印

12
34
55
88