java流标记器

java流标记器,java,stringtokenizer,Java,Stringtokenizer,我正在使用方法quoteChar(“”)来处理字符串。 通常的转义序列(如“\n”和“\t”)在解析字符串时被识别并转换为单个字符。 有没有办法按原样获取字符串,也就是说,如果我有字符串: 你好\t你好 我想去 你好\t你好 而不是: 你好,世界 。 感谢查看StreamTokenizer源代码,字符串的转义行为似乎是硬编码的。我只能想出几种方法来解决这个问题: 取回字符串后重新对其进行转义。这里的问题是,它与文件中的内容不完全匹配-\t将被转换回,但\040将不会 在源读卡器和StreamTo

我正在使用方法
quoteChar(“”)
来处理字符串。 通常的转义序列(如“\n”和“\t”)在解析字符串时被识别并转换为单个字符。 有没有办法按原样获取字符串,也就是说,如果我有字符串:

你好\t你好

我想去

你好\t你好

而不是:

你好,世界


感谢查看
StreamTokenizer
源代码,字符串的转义行为似乎是硬编码的。我只能想出几种方法来解决这个问题:

  • 取回字符串后重新对其进行转义。这里的问题是,它与文件中的内容不完全匹配-\t将被转换回,但\040将不会
  • 在源
    读卡器
    StreamTokenizer
    之间插入您自己的
    读卡器
    。将为最后一个令牌读取的所有字符存储在缓冲区中。从该缓冲区的开始处修剪空白以获得“原始”令牌
  • 如果您的标记化规则足够简单,那么实现您自己的标记器

  • 这对我来说很有用:

    public class MyReader extends BufferedReader {
        // You can choose whatever replacement you'd like(one wont occur in your text)
        private static final char TAB_REPLACEMENT = '\u0000';
    
        public MyReader(Reader in) {
            super(in);
        }
    
        @Override
        public int read() throws IOException {
            int charVal = super.read();
            if (charVal == '\t') {
                return TAB_REPLACEMENT;
            }
            return charVal;
        }
    }
    
    然后通过以下方式创建标记器:

    myTokenizer = new StreamTokenizer(new MyReader(new FileReader(file)));
    
    把这辆新的跑车弄到手

    MyTokenizer.sval.replace(TAB_REPLACEMENT, '\t')
    
    找到“\n”时,将“\\n”添加到字符串中