【问题标题】:IOException with BufferedReaders and InputStreamReaders带有 BufferedReaders 和 InputStreamReaders 的 IOException
【发布时间】:2014-01-20 02:13:42
【问题描述】:

我正在修改Minicraft,但在使用BufferedReaders 时遇到了一些麻烦。

所以在我的 mod 中,我有一个名为 FuncResource 的类,我在其中定义了一种在使用项目时执行自定义方法的方法。
Resource vanilla 类中,我定义了多个这种类型的对象。例如,可以让您更改游戏模式的控制台对象。
这是我在控制台项类中使用的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。每一次。

难道我做错了什么?我是否以某种方式弄乱了输入?请帮助 - 我已经阅读了 JavaDocs,但他们没有帮助,而且我是 Java 的业余爱好者。
如果您需要更多信息,请询问。

编辑:我听取了人们的建议并删除了reader.close(); 代码。但是,我又试了一次,它打印了这个堆栈跟踪:

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)

【问题讨论】:

  • 您能否发布指向导致错误的代码行的堆栈跟踪?
  • 它可能抛出异常的原因有很多。您是否考虑过使用 e.printStackTrace() 之类的东西实际打印异常
  • 嗯。一秒钟,我将打印堆栈跟踪...
  • 打印堆栈跟踪。我不知道为什么它在地球上会抛出那个错误,但是......为什么要关闭流?
  • 既然最终有人会提到CloseShieldInputStream,我会继续发表评论:D。只需用它包裹System.in 并按预期关闭Scanner

标签: java inputstreamreader


【解决方案1】:
try
{
    input = reader.readLine();
    reader.close();
}
catch(IOException e)
{
    System.out.println("Input error...  :/");
}

不要关闭此阅读器,因为它包含应该保持打开状态的System.in

【讨论】:

  • 您的意思是编辑此代码吗?因为你仍然在这里关闭 System.in。
  • 我引用它来评论它。当然,reader.close() 应该被移除来修复代码。
  • 感谢@fgb 提供的有用建议。
【解决方案2】:

关闭阅读器将关闭底层流;正如您可以想象的那样,关闭 System.in 通常很糟糕。

作为一般规则,如果您打开了某些东西,请关闭它;但如果你没有,不要。这里:不要'。

【讨论】:

  • 我尝试了您的建议,但没有奏效,但突然就奏效了。谢谢!
【解决方案3】:

我不记得我做了什么,但我解决了它。我删除了reader.close(); 语句,但它仍然无法正常工作,但只有一次它可以正常工作。我不知道如何或为什么,但感谢所有帮助过的人。

【讨论】:

    猜你喜欢
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-03
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    相关资源
    最近更新 更多