Zugrunde liegenden stream zurückgegeben null bytes
Schreibe ich momentan meine eigenen Brainfuck-interpreter in Java und weil ich will, dass es in der Lage sein zu Lesen von code aus Dateien, die ich schrieb ein BFInputStream
- Filter, die unnötigen Symbole aus. Es sieht wie folgt aus:
import java.io.FilterInputStream;
import java.io.InputStream;
import java.io.IOException;
public class BFInputStream extends FilterInputStream {
public BFInputStream(InputStream in) {
super(in);
}
public int read() throws IOException {
while(true) {
int i = super.read();
//keep LF for line number checking.
if(i == -1 || i == 10 ||( i >= 43 && i <= 46) || i == 60 || i == 62 || i == 91 || i == 93)
return i;
}
}
public int read(byte[] b, int off, int len) throws IOException {
if(off < 0 || len < 0 || len > b.length - off) throw new IndexOutOfBoundsException();
for(int i=0; i<len; i++) {
int j = read();
if(j < 1) return i;
b[off+i] = (byte)j;
}
return len;
}
}
Mein Interpreter verwendet LineNumberReader
<-InputStreamReader
<-BFInputStream
<-FileInputStream
die Datei zu Lesen. Aber jedesmal, wenn er erreicht das Ende der Datei wirft:
java.io.IOException: Zugrunde liegende input-stream zurückgegeben, null bytes
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:268) at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306) at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158) at java.io.InputStreamReader.read(InputStreamReader.java:167) at java.io.BufferedReader.fill(BufferedReader.java:136) at java.io.BufferedReader.read(BufferedReader.java:157) at java.io.LineNumberReader.read(LineNumberReader.java:108) at Interpreter.run(Interpreter.java:101) at Interpreter.main(Interpreter.java:180)
Dolmetscher.java:101 enthält einen call-to BFInputStream.read()
.
Ich bin mir nicht sicher, ob ich verstehe Ausnahme richtig. Ich denke, dass der stream wieder keine bytes an alle (wegen timeout). Ich denke, wenn es einen großen Teil von nicht-BF-Zeichen dann, dass möglich sein könnte, aber am Ende der Datei? FileInputStream
und daher FilterInputStream
und BFInputStream
sollte -1 zurückgeben.
Was ist falsch an meinem code?
Du musst angemeldet sein, um einen Kommentar abzugeben.
if (j < 1)
sollteif (j < 0)
, denn EOF ist gekennzeichnet durch-1
. Auch, Ihre Methode kehrt nie zurück -1 bei EOF.Die korrekte Umsetzung würde wie folgt Aussehen:
j
byte funktioniert es perfekt, vielen Dank. Ich habe einfach vergessen hinzufügen das Kontrollkästchen für die -1. Aber ich habe keine Ahnung, wie die 1 statt eine 0 haben.if(j < 1)
stattif(j < 0)
.Naja, hab gleich ein bisschen was vor, aber mit File, FileReader/Writer und BufferReader/Writer.
Ich gebe die code-Zeile, die ich als Richtlinien.. versuchen Sie es
Für das Lesen aus einer Datei
Für das Schreiben in eine Datei: