【问题标题】:StreamTokenizer - How to split every character into tokensStreamTokenizer - 如何将每个字符拆分为标记
【发布时间】:2020-03-15 05:38:32
【问题描述】:

简而言之:如何更改 StreamTokenizer,以便它将输入文件中的每个字符拆分为令牌。

例如,如果我有以下输入:

1023021023584

如何读取它以便将每个单独的字符保存到数组的特定索引中?

【问题讨论】:

    标签: java file-io delimiter


    【解决方案1】:

    要从文件中单独读取字符作为“令牌”,请使用Reader

    try (BufferedReader in = Files.newBufferedReader(Paths.get("test.txt"))) {
        for (int charOrEOF; (charOrEOF = in.read()) != -1; ) {
            String token = String.valueOf((char) charOrEOF);
            // Use token here
        }
    }
    

    为了完全支持补充平面中的 Unicode 字符,例如emojis,我们需要读取代理对:

    try (BufferedReader in = Files.newBufferedReader(Paths.get("test.txt"))) {
        for (int char1, char2; (char1 = in.read()) != -1; ) {
            String token = (Character.isHighSurrogate​((char) char1) && (char2 = in.read()) != -1)
                          ? String.valueOf(new char[] { (char) char1, (char) char2 })
                          : String.valueOf((char) char1));
            // Use token here
        }
    }
    

    【讨论】:

    • 对不起,我应该更具体。 StreamTokenizer 是一个封装了 bufferedreader 的 java io 类。默认情况下,它将输入流拆分为由空格分隔的标记。我想知道是否有一种方法可以更改,以便将流中的每个字符拆分为一个令牌。我熟悉 BufferedReader。感谢您的回复。
    • @Rihang 所以你想要“将流中的每个字符分割成一个标记”的代码吗? 维奥拉!这里是: 将每个字符拆分为一个标记的代码。 --- 您仍然没有在问题中说任何与您正在寻找的答案相矛盾的内容。
    【解决方案2】:

    你必须调用 StreamTokenizer.resetSyntax() 方法如下

    public static void main(String[] args) {
        try (FileReader fileReader = new FileReader("C:\\test.txt");){
            StreamTokenizer st = new StreamTokenizer(fileReader);
            st.resetSyntax();
            int token =0;
            while((token = st.nextToken()) != StreamTokenizer.TT_EOF) {
                if(st.ttype == StreamTokenizer.TT_NUMBER) {
                    System.out.println("Number: "+st.nval);
                } else if(st.ttype == StreamTokenizer.TT_WORD) {
                    System.out.println("Word: "+st.sval);
                }else {
                    System.out.println("Ordinary Char: "+(char)token);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-08-21
      • 2013-09-15
      • 1970-01-01
      • 2011-01-06
      • 2015-09-20
      • 2011-04-22
      • 1970-01-01
      • 2018-01-27
      相关资源
      最近更新 更多