streamtokenizer如何在行尾同时是cr和lf或两者的组合的情况下工作?

vohkndzv  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(383)

我正在尝试使用streamtokenizer从文件中读取数据。当文件使用lf(\n)return时,它当前起作用。它不适用于crlf(\n\r)或仅适用于cr(\r)。有没有一种方法可以适用于所有三种情况?
也不能保证文件的格式是什么,因此它需要适用于所有3种格式。
目前我只能找到这一点,使之适用于以下三种情况之一:

public final static int TT_EOL = '\n';
qeeaahzv

qeeaahzv1#

streamtokenizer支持各种EOL。从医院的文件里 eolIsSignificant 方法:
确定是否将行尾视为标记。如果flag参数为true,则该标记器将行尾视为标记;nexttoken方法返回tt\u eol,并在读取行尾时将ttype字段设置为此值。
行是以回车符('\r')或换行符('\n')结尾的字符序列。此外,紧跟换行符的回车符被视为单个行尾标记。
如果标志为false,行尾字符将被视为空白,仅用于分隔标记。
换句话说,如果这个标志是真的(你没有提到这个),那么这些文档会说它可以正常工作。如果标志为false,它也可以正常工作:两者都是 \r 以及 \n 算作空白,如果“eolissignificant”处于禁用状态,则这些字符与空格没有什么区别。
不管您的问题是什么,它与streamtokenizer解析各种换行形式的能力无关。
请注意 TT_EOL 等于 \n 完全是巧合。各种各样的 TT_ 常量只是表示读入了哪种令牌;通常你会认为它的定义是:

public static final int TT_WORD = 1;
public static final int TT_NUMBER = 2;
public static final int TT_EOL = 3;
public static final int TT_EOF = 4;

但他们决定变得可爱,并将其定义为:

public static final int TT_WORD = -3;
public static final int TT_NUMBER = -2;
public static final int TT_EOL = 10;
public static final int TT_EOF = -1;

谁知道为什么。请注意 10 以及 '\n' 是完全相同的数字:它们都是数字10。 '\n' 只是一种奇怪的写作方式。
可能你的代码 ttype 然后,我不知道,把它写成一个字节,然后一个文本编辑器打开这个文件作为一个纯文本文件来解释 10 作为unix风格的行尾。
注:孤独者 \r 因为行尾没有出现。最后一个主要的操作系统是macos(在macosx之前)。这个版本在1997年前后——20多年前就不复存在了。

相关问题