Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否有Java流输入库保留行尾字符?_Java_Inputstream_Bufferedreader_Line Endings - Fatal编程技术网

是否有Java流输入库保留行尾字符?

是否有Java流输入库保留行尾字符?,java,inputstream,bufferedreader,line-endings,Java,Inputstream,Bufferedreader,Line Endings,我希望一次遍历一行文本文件,对内容进行操作,并将结果流到一个单独的文件中。BufferedReader.readLine()的教科书案例 但是:我需要将我的行与换行符粘在一起,如果原始文件没有适合我平台的“正确”换行符(Linux上的DOS文件或反之亦然),该怎么办?我想我可以在溪流中向前看一看,看看我发现了什么样的行尾,尽管这真的很粗糙 但是:假设我的输入文件没有尾随的换行符。我想保持现状。现在,在阅读每一行之前,我需要先看一眼下一行的结尾。在这一点上,我为什么要使用一个提供readLine(

我希望一次遍历一行文本文件,对内容进行操作,并将结果流到一个单独的文件中。
BufferedReader.readLine()
的教科书案例

但是:我需要将我的行与换行符粘在一起,如果原始文件没有适合我平台的“正确”换行符(Linux上的DOS文件或反之亦然),该怎么办?我想我可以在溪流中向前看一看,看看我发现了什么样的行尾,尽管这真的很粗糙

但是:假设我的输入文件没有尾随的换行符。我想保持现状。现在,在阅读每一行之前,我需要先看一眼下一行的结尾。在这一点上,我为什么要使用一个提供
readLine()
的类呢


这似乎是一个应该解决的问题。是否有一个库(或者更好的核心Java7类!)可以让我调用类似于
readLine()
的方法,该方法从流中返回一行文本,且EOL字符保持不变?

更新:

但是:我需要将我的行与换行符粘在一起,如果原始文件没有适合我平台的“正确”换行符(Linux上的DOS文件或反之亦然),该怎么办?我想我可以在溪流中向前看一看,看看我发现了什么样的行尾,尽管这真的很粗糙

可以使用指定的字符集创建BufferedReader。因此,如果文件异常,则必须提供文件的字符集

有没有一个库(或者更好的,核心Java7类!)可以 让我调用一个类似于readLine()的方法,该方法返回一行 流中的文本,下线字符是否完整

如果要读取文件,必须知道它是什么字符集。如果您知道它是什么字符集,那么您不需要EOL字符“完整”,因为您可以自己添加它


发件人:

读一行文字。一行被认为是由换行符('\n')、回车符('\r')或紧接着换行符的回车符中的任意一个终止的

返回: 包含行内容的字符串,不包括任何行终止字符,如果已到达流的结尾,则为null

因此,
BufferedReader.readLine
不返回任何行终止字符。如果要保留这些字符,可以改用该方法

int size = 1000; // size of file

BufferedReader br = new BufferedReader(new FileReader("file.txt"));
char[] buf = new char[size];
br.read(buf, 0, size);

这只是一个简单的示例,但是如果文件有行终止,那么它将显示在缓冲区中。

您应该使用StreamTokenizer来获得对输入pasring的更详细控制


这里有一个实现,它逐字符读取字符,直到找到行终止符。传入的读取器必须支持
mark()
,因此如果您的读取器不支持,请将其包装在
BufferedReader

public static String readLineWithTerm(Reader reader) throws IOException {
    if (! reader.markSupported()) {
        throw new IllegalArgumentException("reader must support mark()");
    }

    int code;
    StringBuilder line = new StringBuilder();

    while ((code = reader.read()) != -1) {
        char ch = (char) code;

        line.append(ch);

        if (ch == '\n') {
            break;
        } else if (ch == '\r') {
            reader.mark(1);
            ch = (char) reader.read();

            if (ch == '\n') {
                line.append(ch);
            } else {
                reader.reset();
            }

            break;
        }
    }

    return (line.length() == 0 ? null : line.toString());
}

看起来我必须反复阅读这行中的每一个“单词”,这几乎和像@ktm5124那样一块一块地阅读一样痛苦。我真的想要一个界面,每次只给我一行,包括结尾。看起来我可能需要构建自己的…我想上次我做了你正在做的事情,我最终将整个文件作为字符串读取,然后在其上使用StringTokenizer(支持返回分隔符)。我现在没有这个选项--它不是一个文件,而是另一个框架交给我的输入流。我可以将整个流读入内存,但我不能保证它不会是多GB的。如果可能的话,我真的需要以工作流的方式工作:(我想你可以一次读入一个“块”,然后通过StringTokenizer运行每一块。这可能会有点混乱,但可能不会太糟糕。我可以,但我必须处理在“块”中不装配整个标记/行的情况),在这一点上,我基本上是在写我首先要求的原始逻辑:(也许我需要澄清操作,但我理解BufferedReader中的方法不能满足我的需要。我的意思是,也许在Guava中有一个Apache Commons库或其他更灵活的东西?Ted走上了正确的道路(如下)但我不认为我可以将StreamTokenizer扭曲成返回整行代码作为标记(当然我希望被证明是错误的)。你需要更仔细地重新阅读我的帖子。我在BufferedReader中为你提供了一个方法,可以满足你的需要。你完全不需要第三方库来读取文件中的每个字符。这是一个基本的I/O操作,可以用每种语言实现。我的意思是,
read()
方法只是图片的一部分。当然,我可以填充缓冲区,但是我必须找到缓冲区中的行结尾,加载更多数据…现在当我到达缓冲区的末尾时会发生什么?我需要加载更多…但是如果一行超过1000个字符呢?等等。现在我基本上正在重新实现整个
读取行逻辑我自己。这不是那么难或什么的,我只是不想为自己发现所有的边缘案例。这就是为什么我一直要求一个库…我更新了我的帖子来回答你的一些问题。但我仍然不完全理解你的问题。这是一个微不足道的I/O操作,不需要第三方库ry.行尾与字符集无关。DOS/Windows(
\r\n
)行尾和Linux/Unix(
\n
)行尾都是完全有效的ASCII/UTF-8/无论什么。问题是,我不知道在什么平台上(DOS vs Windows)我想这或多或少和我最终不得不构建的实现是一样的。仍然感到困惑的是,似乎没有其他人需要这个!