2010-08-31 36 views
5

tôi đang đọc tất cả các ký tự vào luồng. Tôi đang đọc nó với inputStream.read. Đây là luồng đầu vào java.io.Reader. Làm cách nào để bỏ qua các ký tự đặc biệt như @ khi đọc vào bộ đệm.Xóa hoặc bỏ qua ký tự từ người đọc

đang

private final void FillBuff() throws java.io.IOException 
    { 
    int i; 
    if (maxNextCharInd == 4096) 
     maxNextCharInd = nextCharInd = 0; 

    try { 
     if ((i = inputStream.read(nextCharBuf, maxNextCharInd, 
              4096 - maxNextCharInd)) == -1) 
     { 
      inputStream.close(); 
      throw new java.io.IOException(); 
     } 
     else 
      maxNextCharInd += i; 
     return; 
    } 
    catch(java.io.IOException e) { 
     if (bufpos != 0) 
     { 
      --bufpos; 
      backup(0); 
     } 
     else 
     { 
      bufline[bufpos] = line; 
      bufcolumn[bufpos] = column; 
     } 
     throw e; 
    } 
    } 

Trả lời

0

Bạn có thể thực hiện một inputstream riêng có nguồn gốc từ InputStream. Sau đó ghi đè lên các phương thức đọc để chúng lọc một ký tự đặc biệt ra khỏi luồng.

+0

InputStreams đọc byte, không phải ký tự. Ý bạn là Reader. –

+0

oh. lấy làm tiếc. tất nhiên - ý tôi là lớp Reader. –

0
private final void FillBuff() throws java.io.IOException 
{ 
int i; 
if (maxNextCharInd == 4096) 
    maxNextCharInd = nextCharInd = 0; 

try { 
    Reader filterReader = new FilterReader(inputStream) { 
     public int read() { 
      do { 
       result = super.read(); 
      } while (specialCharacter(result)); 
      return result; 
     } 
    }; 
    if ((i = filterReader.read(nextCharBuf, maxNextCharInd, 
             4096 - maxNextCharInd)) == -1) 
    { 
     inputStream.close(); 
     throw new java.io.IOException(); 
    } 
    else 
     maxNextCharInd += i; 
    return; 
} 
catch(java.io.IOException e) { 
    if (bufpos != 0) 
    { 
     --bufpos; 
     backup(0); 
    } 
    else 
    { 
     bufline[bufpos] = line; 
     bufcolumn[bufpos] = column; 
    } 
    throw e; 
} 
} 
+0

hi, loại kết quả là gì? – bombac

+0

và phương pháp đặc biệtCharacter là gì? – bombac

7

Bạn có thể sử dụng tùy chỉnh FilterReader.

class YourFilterReader extends FilterReader{ 
    @Override 
    public int read() throws IOException{ 
     int read; 
     do{ 
      read = super.read(); 
     } while(read == '@'); 

     return read; 
    } 

    @Override 
    public int read(char[] cbuf, int off, int len) throws IOException{ 
     int read = super.read(cbuf, off, len); 

     if (read == -1) { 
      return -1; 
     } 

     int pos = off - 1; 
     for (int readPos = off; readPos < off + read; readPos++) { 
      if (read == '@') { 
       continue; 
      } else { 
       pos++; 
      } 

      if (pos < readPos) { 
       cbuf[pos] = cbuf[readPos]; 
      } 
     } 
     return pos - off + 1; 
    } 
} 

Resources:

Trên cùng một chủ đề:

+0

Đúng, một Người trang trí mới là con đường để đi. – atamanroman

+0

Chỉ cần lưu ý. Trong phương thức thứ hai, các đối số bị thiếu. ;) –

+0

@ codeing.mof, cảm ơn, nó đã được sửa. –

4

Tất cả những độc giả, nhà văn và suối thực hiện chức năng Decorator mẫu . Mỗi trang trí thêm hành vi và chức năng bổ sung vào triển khai cơ bản.

Một giải pháp cho bạn yêu cầu có thể là một FilterReader:

public class FilterReader implements Readable, Closeable { 
    private Set<Character> blacklist = new HashSet<Character>(); 
    private Reader reader;  

    public FilterReader(Reader reader) { 
    this.reader = reader; 
    } 

    public void addFilter(char filtered) { 
    blacklist.add(filtered); 
    } 

    @Override 
    public void close() throws IOException {reader.close();} 

    @Override 
    public int read(char[] charBuf) { 
    char[] temp = new char[charBuf.length]; 
    int charsRead = reader.read(temp); 
    int index = -1; 
    if (!(charsRead == -1)) { 
     for (char c:temp) { 
     if (!blacklist.contains(c)) { 
      charBuf[index] = c; 
      index++; 
     } 
     } 
    } 
    return index; 
    } 

} 

Note - lớp java.io.FilterReader là một trang trí với zero chức năng. Bạn có thể mở rộng nó hoặc chỉ cần bỏ qua nó và tạo trang trí của riêng bạn (mà tôi thích trong trường hợp này).

+0

Với phương thức 'read (char [])', tôi nghĩ bạn nên tiếp tục đọc cho đến khi 'charBuf' đầy. Việc triển khai của bạn chỉ đọc các phần tử hợp lệ trong các phần tử 'charbuf.length' tiếp theo. Nice thực hiện tổng thể với 'Set' - có lẽ tôi muốn bao gồm một constructor khác với tham số' Set' - nhưng điều đó không thực sự quan trọng ở đây. –

+0

Tôi sẽ mở rộng 'java.io.FilterReader', nó có thể hữu ích để giữ cho lớp của bạn như là một Reader, và rõ ràng nói rằng đó là một người đọc tạo ra để lọc một dòng ký tự đầu vào. Và đa hình vẫn sẽ có sẵn. Và trong trường hợp của bạn, bạn không thể đóng gói lớp học của bạn vào một Reader khác, bởi vì nó không phải là một Reader khác. –

+0

Yikes - 'Reader' không phải là giao diện mà là lớp trừu tượng. Đã thay đổi việc triển khai ... –

Các vấn đề liên quan