做词法分析时需要回溯,c语言中可使用 fseek 配合文件指针自由移动。
Java 字符流中似乎只有 mark 和 reset 方法配合使用才能回退。
然后在 StackOverflow 上一个问题 Can I peek on a BufferedReader?
其中一个回答提到了 PushbackReader 这个类,有 read 和 unread 方法可以配合使用。
简单地试了一下,源代码:
public static void main(String[] args) throws IOException { BufferedReader reader = (new BufferedReader(new FileReader("Test.txt"))); // 使用 PushbackReader 读取字符 PushbackReader pr = new PushbackReader(reader); char c = (char)pr.read(); System.out.println("read first char: " + c); // 把读取的字符放回 pr.unread((int)c); System.out.println("unread:" + c); // 再次读取 System.out.println("read again first char is " + (char) pr.read()); }Test文本内容:
123控制台输出:
>> read first char: 1 >> unread:1 >> read again first char is 1-------------------------------------------------
后来觉得这样写起程序来还是太麻烦了
直接用 String.toCharArray() 把 文件内容 直接转成 字符数组,然后在用一个下标变量配合使用吧......
————————————————————————————————————————
其实还可以用一个类包装了一下:
其中peek() 方法只取出值来,但不增加pos的值。
/** * 一个简单的Token流。是把一个Tokens列表进行了封装。 * Token 请根据自己的需要来定义 */ public class TokenReader{ public List<Token> tokens = null; public int pos = 0; public TokenReader(List<Token> tokens) { this.tokens = tokens; } /** * 返回Token流中下一个Token,并从流中取出。 如果流已经为空,返回null; */ public Token read() { if (pos < tokens.size()) { return tokens.get(pos++); } return null; } /** * 返回Token流中下一个Token,但不从流中取出。 如果流已经为空,返回null; */ public Token peek() { if (pos < tokens.size()) { return tokens.get(pos); } return null; } /** * Token流回退一步。恢复原来的Token。 */ public void unread() { if (pos > 0) { pos--; } } /** * 获取Token流当前的读取位置。 * @return */ public int getPosition() { return pos; } /** * 设置Token流当前的读取位置 * @param position */ public void setPosition(int position) { if (position >=0 && position < tokens.size()){ pos = position; } } }