2012-06-06 75 views
-1

我目前正在使用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因此FilterInputStreamBFInputStream應該返回-1。

我的代碼有什麼問題?

回答

2

if (j < 1)應該是if (j < 0),因爲EOF由-1表示。另外,你的方法在EOF中不會返回-1。

的正確實施應該是這樣的:

public int read(byte[] b, int off, int len) throws IOException { 
    if(off < 0 || len <= 0 || len > b.length - off) throw new IndexOutOfBoundsException();   
    int i = 0; 
    while (i < len) { 
     int j = read(); 
     if (j < 0) break; // Stop reading at EOF 
     b[off + i] = (byte) j; 
     i++; 
    } 
    if (i == 0) return -1; // If we get EOF with no data, return it to the caller 
    else return i; 
} 
+0

Exept,你忘了鑄造'j'字節它完美的工作,謝謝。我只是忘了添加-1的檢查。但我不知道如何1而不是0到達那裏。 – IchBinKeinBaum

+0

@IchBinKeinBaum:如果您在第一次迭代中獲得EOF,則您的代碼會生成0。 – axtavt

+0

是的,我注意到了。我的意思是我不知道爲什麼我寫'if(j <1)'而不是'if(j <0)'。 – IchBinKeinBaum

1

好做同樣有點事之前,但使用文件,的FileReader /作家和BufferReader /作家。 我給你的代碼片斷我作爲指導使用..嘗試它

從文件

File f = new File("my.txt"); 
FileReader fr = new FileReader(f); 
BufferedReader br = new BufferedReader(fr); 

String s = null; 

while ((br=readLine())!=null) { 

// Do whatever u want to do with the content of the file. 

} 

br.close(); 

閱讀寫入文件:

Boolean isDone = true; 
Scanner scan = new Scanner(System.in); 
File f = new File("my.txt"); 
FileWriter fr = new FileWriter(f); 
BufferedWriter br = new BufferedWriter(fr); 

while (b) { 

    if (!b) { 

br.write(new Scanner(System.in).nextLine()); 

} 


}