I am trying to read a from the input using BufferedReader. It works the first time but the second time it is ran I get an exception.
john@fekete:~/devel/java/pricecalc$ java frontend.CUI
> gsdfgd
Invalid command!
> I/O Error getting string: java.io.IOException: Stream closed
I/O Error: java.io.IOException: java.io.IOException: Stream closed
> I/O Error getting string: java.io.IOException: Stream closed
I/O Error: java.io.IOException: java.io.IOException: Stream closed
> I/O Error getting string: java.io.IOException: Stream closed
It just keeps running with that in a loop. I must have missed something.
public static void main(String args[]) {
if (args.length == 0) {
while (!exit) {
try {
exit = processLine(commandLine());
} catch (IOException e) {
System.out.println("I/O Error: " + e);
}
}
System.out.println("Bye!");
} else if (args.length == 1) {
String line = new String(args[0]);
processLine(line);
} else {
String line = new String(args[0]);
for (String np : args) {
line = new String(line + " " + np);
}
processLine(line);
}
}
static private String commandLine() throws IOException {
String str = new String();
try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
System.out.print("> ");
str = new String(br.readLine());
str = str.trim();
} catch (IOException e) {
System.out.println("I/O Error getting string: "+ str + " " + e);
throw new IOException(e);
}
return str;
}
It really all seems to be about commandLine() not working so I've just included that and main.
Yes, you're closing the stream here:
That try-with-resources statement will close the
BufferedReader
at the end of the block, which will close theInputStreamReader
, which will closeSystem.in
.You don't want to do that in this case, so just use:
It's still possible that this won't quite behave as you want though, as the
BufferedReader
could potentially consume (and buffer) more data. You'd be better off creating theBufferedReader
once (in the calling code) and passing it to the method.Oh, and I suggest you get rid of this:
There's no need for it at all. This would be better:
But even then, it's a pointless assignment. Likewise you don't need to create a new String from the one returned by
readLine()
. Just use:... within the
try
block. Also, there's no point in loggingstr
within thecatch
block, as it's going to be empty - theIOException
will only be thrown when reading the line...