我正在努力创建一个小命令行游戏来强化我在过去几个月里学到的一些东西。
我正在尝试创建一个名为readInput()的方法,该方法返回一个我可以反复调用的String。第一次它完美地工作,第二次它会导致IO.Exception。如果我删除语句bisr.close();它有效,但被教导关闭溪流,因为将它们打开是不好的做法。
有人可以指出我正确的方向,因为我用谷歌搜索但无济于事。
方法......
private String readInput()
{
String input = null;
BufferedReader bisr = null;
try
{
bisr = new BufferedReader(new InputStreamReader(System.in));
input = bisr.readLine();
}
catch (Exception e)
{
System.out.println("Error: " + e);
}
finally
{
try
{
bisr.close();
}
catch (Exception e)
{
System.out.println("Error:" + e);
}
return input;
}
}
答案 0 :(得分:7)
第一次完美运行,第二次引起IO.Exception
bisr.close()
也关闭基础输入流(在本例中为System.in
)。这就是连续读取将导致IOException的原因。
如果我删除语句bisr.close();它有效,但教会关闭溪流,因为将它们打开是不好的做法
在执行期间保持System.in
打开没问题。
如果您不想创建不必要的许多对象,可以创建一次BufferedReader,然后传递它。
对于这种特殊情况,我可能会选择
private String readInput() {
return new Scanner(System.in).nextLine();
}
答案 1 :(得分:7)
问题是,关闭BufferedReader
也会自动关闭隐式关闭InputStreamReader
的{{1}}。
第二次调用该方法时,System.in
已关闭,这意味着您将无法从中读取。
“始终关闭它”仅适用于您也打开过的资源!
答案 2 :(得分:0)
对于System.in,最好拥有一次创建的全局BufferedReader或Scanner。这是因为BufferedReader和Scanner可以读取多行缓冲性能,因此您可能会丢弃某些行或部分行。
public static void main(String... args) throws InterruptedException {
for(int i=0;i<5;i++) {
System.out.println("\nread "+readLine());
// give me time to write more than one line, no problem from a file.
Thread.sleep(1000);
}
}
public static String readLine() {
// can lose input.
return new Scanner(System.in).nextLine();
}
如果我快速输入关键字的数字1,2,3等。
1
read 1
2
3
4
read 2
5
6
7
read 4
8
9
0
read 7
-
=
read 0
如果我使用全局Scanner对象并执行相同的操作。
static final Scanner IN = new Scanner(System.in);
public static void main(String... args) throws InterruptedException {
for (int i = 0; i < 10; i++) {
System.out.println("\nread " + readLine());
// give me time to write more than one line, no problem from a file.
Thread.sleep(1000);
}
}
public static String readLine() {
return IN.nextLine();
}
打印
1
read 1
2
3
4
read 2
5
6
read 3
7
8
read 4
9
read 5
0
read 6
read 7
read 8
read 9
read 0