为InputStreamReader定义此行为的规范在哪里?

时间:2012-12-23 16:58:00

标签: java

考虑到以下运动问题的代码,粗略地说明的规范在哪里:“在调用readTokens()时,等待用户按回车键然后继续执行。”

我不完全理解为什么我的代码有效,为什么程序会在显示“输入数据:”后暂停并等待回车?这种行为在哪里定义,如何改变?

import java.io.*;
import java.util.LinkedList;

public class StreamTokeTwo {

private int ttype = 0;
StreamTokenizer tokenizer = new StreamTokenizer(new BufferedReader(
        new InputStreamReader(System.in)));

private void setupTokenizer() {
    tokenizer.resetSyntax();
    tokenizer.wordChars(33, 126);
    tokenizer.whitespaceChars(0, 32);
    tokenizer.whitespaceChars(44,44);
    tokenizer.whitespaceChars(47,47);
    tokenizer.eolIsSignificant(true);
}

private String[] readTokens() {
    LinkedList<String> list = new LinkedList<String>();
    String[] array = null;

    do {
        try {
            ttype = tokenizer.nextToken();
        } catch (Exception e) {
            System.exit(1);
        }
        if (ttype == StreamTokenizer.TT_WORD) {
            list.add(tokenizer.sval);
        }
    } while (ttype != StreamTokenizer.TT_EOL);

    array = list.toArray(new String[0]);
    return array;
}

public static void main(String[] args) {
    StreamTokeTwo streamToke = new StreamTokeTwo();
    streamToke.setupTokenizer();

    for (int i = 0; i < 5; ++i) {
        System.out.print("Enter data: ");
        String[] array = streamToke.readTokens();
        for (String str : array) {
            System.out.print(str + " ");
        }
        System.out.println();
    }
}
}

2 个答案:

答案 0 :(得分:3)

等待键入行为是操作系统和shell的一项功能。他们将您的输入转换为JVM的标准输入,并决定什么构成文件结尾以及什么使数据可用于传递给正在读取其标准输入的程序。

就JVM而言,它只是要求来自标准输入的数据,如果没有可用的数据并且它不在文件末尾则会阻塞。如果标准输入是磁盘文件,它也会这样做。

答案 1 :(得分:1)

InputStreamReader具有阻止行为的声明暗示了这一点:在读取内容或发生错误之前,读取方法不会返回。