快速读取Java中的特定数据

时间:2014-10-20 09:15:59

标签: java io

我有这段代码:

System.setIn(new FileInputStream( System.getProperty("user.dir") + "/src/one.in"));
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

for (i = 0; i < ...; i++) {
      String line = reader.readLine();
      String firstLocation = line.substring(0, line.indexOf(' '));
      String mid = line.substring(line.indexOf(' '), line.lastIndexOf(' ')).trim();
      String secondLocation = line.substring(line.lastIndexOf(' ') + 1);
      ....
}

我阅读了许多形式的行:

A --875-> B
A <-854-- B
A --713-> B
A <-908-- B
A --925-> B
A <-894-- B
A --239-> B
A <-30-- B
A --802-> B

是否有最快的方式来阅读和处理这一行?我也尝试在一个行中读取所有行,并使用行尾字符分割,但它的工作速度更慢。

3 个答案:

答案 0 :(得分:1)

我知道最快的方法是使用StringTokenizer。然后你的代码看起来像这样:

System.setIn(new FileInputStream(System.getProperty("user.dir") "/src/one.in"));
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

while (reader.ready()) {
    final StringTokenizer tk = new StringTokenizer(reader.readLine()," ");
    String first = tk.nextToken();
    String second = tk.nextToken();
    String third = tk.nextToken();
    ...
}

我不会在这里检查是否有足够的令牌可用,因为你知道你输入String的结构,这也节省了时间。正如您所看到here,StringTokenizer比使用Patternsplit(...)方法更快。

答案 1 :(得分:0)

String[] parts = line.split(" ");
String firstLocation = parts[0];
String mid = parts[1];
String secondLocation = parts[2];

答案 2 :(得分:0)

最好是设计方法并将其保存为库(甚至作为IDE中的模板!) 例如,如果要从System.in读取整数,可以使用此函数

static int readInt(BufferedInputStream b) throws IOException {
    String s = "";
    int x = b.read();
    while (x < 48 || x > 57) {
        x = b.read();
    }
    while (x >= 48 && x <= 57) {
        s = s + (char) x;
        x = b.read();
    }
    return Integer.parseInt(s);
}

此方法将获取输入中的下一个可用Integer。 此方法忽略任何非数字字符。

例如,如果您的输入如下:

"    123    !!!@@b"

输出将完全

123

重要的是,这个方法在Scanner中扮演nextInt()的角色,但速度比前者快。