我目前正在使用Java編寫我自己的Brainfuck解釋器,因爲我希望它能夠從文件中讀取代碼,我寫了一個BFInputStream
過濾不必要的符號。它看起來像這樣:基礎流返回零字節
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;
}
}
我的翻譯使用LineNumberReader
< - InputStreamReader
< - BFInputStream
< - FileInputStream
讀取文件。但每次到達它拋出該文件的末尾:
產生java.io.IOException:基本輸入流返回零個字節
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)
Interpreter.java:101包含BFInputStream.read()
通話。
我不確定是否正確理解異常。我認爲這個流完全沒有返回字節(因爲超時)。我想如果有非常多的非BF字符,那麼這可能是可能的,但在文件的末尾? FileInputStream
因此FilterInputStream
和BFInputStream
應該返回-1。
我的代碼有什麼問題?
Exept,你忘了鑄造'j'字節它完美的工作,謝謝。我只是忘了添加-1的檢查。但我不知道如何1而不是0到達那裏。 – IchBinKeinBaum
@IchBinKeinBaum:如果您在第一次迭代中獲得EOF,則您的代碼會生成0。 – axtavt
是的,我注意到了。我的意思是我不知道爲什麼我寫'if(j <1)'而不是'if(j <0)'。 – IchBinKeinBaum