2012-11-02 33 views
11

Phương thức mark()reset() hoạt động chính xác như thế nào (trong mã bên dưới), từng bước? Tôi cố gắng viết ví dụ của riêng mình nhưng bắt đầu ném ngoại lệ sai hoặc tương tự như vậy, và tôi không thể hiểu được điểm đặt dấu và đặt lại phương thức trong mã này là gì bởi vì tôi không thấy sự khác biệt với điều này hay không.InputStream, đánh dấu(), đặt lại()

import java.io.*; 

class BufferedInputStreamDemo { 
    public static void main(String args[]) { 
     String s = "© is a copyright symbol, " 
       + "however &copy isn't.\n"; 
     byte buf[] = s.getBytes(); 

     ByteArrayInputStream in = new ByteArrayInputStream(buf); 
     int c; 
     boolean marked = false; 

     //try_with_resources 
     try (BufferedInputStream f = new BufferedInputStream(in)) { 
      while ((c = f.read()) != -1) { 
       switch (c) { 
        case '&': 
         if (!marked) { 
          f.mark(32); 
          marked = true; 
         } else { 
          marked = false; 
         } 
         break; 
        case ';': 
         if (marked) { 
          marked = false; 
          System.out.print("(c)"); 
         } else 
          System.out.print((char) c); 
         break; 
        case ' ': 
         if (marked) { 
          marked = false; 
          f.reset(); 
          System.out.print("&"); 
         } else 
          System.out.print((char) c); 
         break; 
        default: 
         if (!marked) 
          System.out.print((char) c); 
         break; 
       } 
      } 
     } catch (IOException e) { 
      System.out.println("I/O Error: " + e); 
     } 
    } 
} 
+1

Ngoại lệ nào đang được ném? Bạn có theo dõi ngăn xếp không? Xin vui lòng, cụ thể hơn về câu hỏi của bạn. – Lion

+0

Trường hợp ngoại lệ được ném là 'Lỗi I/O: java.io.IOException: Đặt lại thành dấu không hợp lệ', nhưng tôi đã viết ngoại lệ đó đang được ném vào một ví dụ khác. Chủ yếu là tôi hỏi những gì là đánh dấu (32) và thiết lập lại làm trong ** ví dụ này **. – ashur

+0

@ user1165499 Xem câu trả lời của tôi để biết chi tiết về cách mã này hoạt động và những gì tôi nghi ngờ vấn đề là, trong ví dụ khác của bạn. – dan

Trả lời

6

Khi f.mark(32); là đạt ed con trỏ đã đọc sau & và điểm đánh dấu được đặt cho reset để biết vị trí cần quay lại. Vì vậy, khi bạn phát hiện thấy thiếu ; để đóng phần tử, bạn đang in theo cách thủ công & và di chuyển con trỏ phải quay lại (sau & nơi dấu được đặt, sử dụng phương thức mark(32)), sử dụng phương thức reset. Trong lần đọc tiếp theo, vì biến số marked của bạn không được đặt, nó sẽ in các ký tự.

mark(32) có nghĩa là tự động xóa điểm đánh dấu nếu con trỏ đã đọc của bạn tăng thêm 32 ký tự. Đây có thể là vấn đề trong mã khác của bạn, điều này đang kích hoạt lỗi, vì điểm đánh dấu đã bị vô hiệu hóa.

4

Xem tài liệu API:

mark(int)

Marks the current position in this input stream. A subsequent call to the reset method repositions this stream at the last marked position so that subsequent reads re-read the same bytes.

The readlimit argument tells this input stream to allow that many bytes to be read before the mark position gets invalidated.

This method simply performs in.mark(readlimit).

reset()

Repositions this stream to the position at the time the mark method was last called on this input stream.

This method simply performs in.reset().

Stream marks are intended to be used in situations where you need to read ahead a little to see what's in the stream. Often this is most easily done by invoking some general parser. If the stream is of the type handled by the parse, it just chugs along happily. If the stream is not of that type, the parser should toss an exception when it fails. If this happens within readlimit bytes, it allows the outer code to reset the stream and try another parser.

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