输入流, 标记(), 复位()

2022-09-03 07:17:12

方法和方法是如何准确工作的(在下面的代码中),一步一步?我试图编写自己的示例,但开始抛出错误的标记异常或类似情况,我无法理解在此代码中放置标记和重置方法的意义,因为我看不到与此或没有区别。mark()reset()

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

当到达 时,读取光标已经是之后,并设置了一个标记,用于知道跳回的位置。因此,当您检测到缺少 a 来关闭元素时,您将使用该方法手动打印并将读取光标向后移动(在放置标记的位置之后,使用调用)。在下次读取时,由于未设置变量,因此将打印字符。f.mark(32);&reset;&&mark(32)resetmarked

mark(32)表示在读取光标前进超过 32 个字符时自动删除标记。这可能是其他代码中的问题,即触发错误,因为标记已失效。


答案 2

请参阅 API 文档:

mark(int)

标记此输入流中的当前位置。对 reset 方法的后续调用将此流重新定位在最后标记的位置,以便后续读取重新读取相同的字节。

readlimit 参数告诉此输入流允许在标记位置失效之前读取该字节数。

此方法仅执行 in.mark(readlimit)。

reset()

将此流重新定位到上次在此输入流上调用 mark 方法时的位置。

此方法仅执行 in.reset()。

流标记旨在用于需要提前阅读以查看流中的内容的情况。通常,这最容易通过调用一些通用解析器来完成。如果流是解析处理的类型,它只是愉快地前进。如果流不是该类型,则解析器应在失败时抛出异常。如果这种情况发生在只读字节内,则允许外部代码重置流并尝试另一个解析器。


推荐