我正在尝试制作一个简单的方法gulp-open
,从readIn()
读取内容。 (不能使用Console,因为System.in
在Eclipse中运行时返回null)。我的想法是根据需要调用System.console()
,就像这样
readIn
以下是 classs Foo{
public static void(String[] arg){
String first = readIn("First, please");
System.out.println(first);
String second = readIn("Second, please");
System.out.println(second);
}
}
的最简单形式:
readIn()
如果我省略 static String readIn(String prompt){
System.out.println(prompt + ": ");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = br.readLine();
br.close(); // PROBLEM STATEMENT
return line;
}
语句就可以了 - 我可以反复拨打br.close()
。但是,如果我按照我应该关闭readIn
,那么只有第一个呼叫才有效。第二次电话会议br
。正如预期的那样,IOException: Stream closed
中的try-with-resources会发生同样的事情:
readIn
static String readIn(String prompt){
System.out.println(prompt + ": ");
String line;
try(
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in)) )
{
line = br.readLine();
}
return line;
}
代替Scanner(System.in)
也会发生同样的事情。从文件中读取时不会发生这种情况。
如果在BufferedReader
的每次通话中都设置了新的BufferedReader
或Scanner
,则会关闭哪个流?这是关于readIn
关闭“底层可读/可关闭”(System.in)的东西吗?可以重新开放吗?试着理解,谢谢。
答案 0 :(得分:0)
public class MyIME
extends InputMethodService
implements KeyboardView.OnKeyboardActionListener {
:
:
private Timer timerLongPress = null;
:
:
@Override
public void onCreate() {
super.onCreate();
:
:
timerLongPress = new Timer();
:
:
}
@Override
public void onRelease(final int primaryCode) {
:
:
timerLongPress.cancel();
:
:
}
@Override
public void onPress(final int primaryCode) {
:
:
timerLongPress.cancel();
:
:
timerLongPress = new Timer();
timerLongPress.schedule(new TimerTask() {
@Override
public void run() {
try {
Handler uiHandler = new Handler(Looper.getMainLooper());
Runnable runnable = new Runnable() {
@Override
public void run() {
try {
MyIME.this.onKeyLongPress(primaryCode);
} catch (Exception e) {
Log.e(MyIME.class.getSimpleName(), "uiHandler.run: " + e.getMessage(), e);
}
}
};
uiHandler.post(runnable);
} catch (Exception e) {
Log.e(MyIME.class.getSimpleName(), "Timer.run: " + e.getMessage(), e);
}
}
}, ViewConfiguration.getLongPressTimeout());
:
:
}
public void onKeyLongPress(int keyCode) {
// Process long-click here
}
也会关闭系统输入流br.close();
,因此除非重新启动JVM,否则无法使用它。
您可以对System.in
BufferedReader
实例
也不要害羞混合电话:
System.in
它们与不同的流有关,所以不应该有任何问题。