Java 带BufferedReaders和InputStreamReaders的IOException

Java 带BufferedReaders和InputStreamReaders的IOException,java,inputstreamreader,Java,Inputstreamreader,我正在修改,使用BufferedReaders时遇到了一些问题 因此,在我的mod中,我有一个名为FuncResource的类,在该类中,我定义了一种在使用项时执行自定义方法的方法。 在Resourcevanilla类中,我定义了多个这种类型的对象。例如,一个控制台对象可以让你改变游戏模式。 以下是我在console item类中使用的interact方法: public boolean interact(Tile tile, Level level, int x, int y, Playe

我正在修改,使用
BufferedReader
s时遇到了一些问题

因此,在我的mod中,我有一个名为
FuncResource
的类,在该类中,我定义了一种在使用项时执行自定义方法的方法。
Resource
vanilla类中,我定义了多个这种类型的对象。例如,一个控制台对象可以让你改变游戏模式。
以下是我在console item类中使用的
interact
方法:

public boolean interact(Tile tile, Level level, int x, int y, Player player, int direction)
{
    InputStreamReader isr = new InputStreamReader(System.in);

    BufferedReader reader = new BufferedReader(isr);

    String input = "";

    System.out.print("> ");

    try
    {
        input = reader.readLine();
        reader.close();
    }
    catch(IOException e)
    {
        System.out.println("Input error...  :/");
    }

    String[] commandList = input.split(" ");

    if(commandList[0].equals("gamemode"))
    {
        player.gamemode = Integer.parseInt(commandList[1]);
        return true;
    }

    return false;
}
现在问题来了:只需使用一次控制台项就可以了。我改变我的游戏模式。然而,当我每次使用它之后,它总是抛出一个
IOException
。每一次。

我做错什么了吗?我把输入搞砸了吗?请帮助-我已经阅读了Javadoc,但它们没有帮助,我是Java的业余爱好者。
如果你需要更多的信息,尽管问。

编辑:我听取了人们的建议,删除了
reader.close()代码。但是,我再次尝试,它打印了以下stacktrace:

java.io.IOException: Stream closed
    at java.io.BufferedInputStream.getBufIfOpen(BufferedInputStream.java:162)
    at java.io.BufferedInputStream.read(BufferedInputStream.java:325)
    at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:283)
    at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325)
    at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177)
    at java.io.InputStreamReader.read(InputStreamReader.java:184)
    at java.io.BufferedReader.fill(BufferedReader.java:154)
    at java.io.BufferedReader.readLine(BufferedReader.java:317)
    at java.io.BufferedReader.readLine(BufferedReader.java:382)
    at com.mojang.ld22.item.resource.funcitems.ConsoleItem.interact(ConsoleItem.java:27)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.mojang.ld22.item.resource.FuncResource.interactOn(FuncResource.java:31)
    at com.mojang.ld22.item.ResourceItem.interactOn(ResourceItem.java:53)
    at com.mojang.ld22.entity.Player.attack(Player.java:177)
    at com.mojang.ld22.entity.Player.tick(Player.java:118)
    at com.mojang.ld22.level.Level.tick(Level.java:274)
    at com.mojang.ld22.Game.tick(Game.java:221)
    at com.mojang.ld22.Game.run(Game.java:165)
    at java.lang.Thread.run(Thread.java:744)
不要关闭此读卡器,因为它包含应保持打开状态的
系统


不要关闭此读卡器,因为它包含
系统。在
中,系统应保持打开状态。

关闭读卡器将关闭底层流;正如您可以想象的那样,关闭System.in通常是不好的


一般来说,如果你打开了什么东西,就把它关上;但如果你没有,就不要。这里:不要

关闭阅读器将关闭底层流;正如您可以想象的那样,关闭System.in通常是不好的



一般来说,如果你打开了什么东西,就把它关上;但如果你没有,就不要。这里:不要

我不记得我做了什么,但我解决了。我已经删除了
阅读器.close()语句,它仍然不能正常工作,但只有一次它能正常工作。我不知道怎么做,也不知道为什么,但感谢所有帮助过我的人。

我不记得我做了什么,但我解决了它。我已经删除了
阅读器.close()语句,它仍然不能正常工作,但只有一次它能正常工作。我不知道如何或为什么,但感谢所有帮助过我的人。

你能发布指向导致错误的代码行的堆栈跟踪吗?它可能引发异常的原因很多。您是否考虑过使用类似于
e.printStackTrace()
的方法打印异常,例如HM。等一下,我会打印堆栈跟踪…打印堆栈跟踪。我不知道为什么它会犯这样的错误,尽管。。。为什么要关闭流?因为最终会有人提到我将继续并发布一条注释:D.只需使用它包装
系统。在
中,并按预期关闭
扫描仪
。您可以发布指向导致错误的代码行的堆栈跟踪吗?它可能引发异常的原因很多。您是否考虑过使用类似于
e.printStackTrace()
的方法打印异常,例如HM。等一下,我会打印堆栈跟踪…打印堆栈跟踪。我不知道为什么它会犯这样的错误,尽管。。。为什么流会被关闭?因为最终会有人提到我会继续并发表评论:D.只需将
系统包装在
中,并按预期关闭
扫描仪
。你是想编辑此代码吗?因为你们还在关闭系统。在这里。我引用它来评论它。当然,应该删除
reader.close()?因为你们还在关闭系统。在这里。我引用它来评论它。当然,应该删除
reader.close()
,以修复代码。感谢@fgb提供的有用建议。我尝试了你建议的方法,但没有成功,但突然成功了。谢谢我尝试了你的建议,但没有成功,但突然成功了。谢谢
try
{
    input = reader.readLine();
    reader.close();
}
catch(IOException e)
{
    System.out.println("Input error...  :/");
}