Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/29.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_Concurrency_Io_Random Access - Fatal编程技术网

Java 在写入文件时读取文件

Java 在写入文件时读取文件,java,concurrency,io,random-access,Java,Concurrency,Io,Random Access,我必须读取tomcat日志文件,在一段时间后,例如:一小时后,我将再次读取该文件,以查找新添加的内容,因此我创建RandomAccessFile来记录我完成的最后一个帖子,并使用BufferedReader.readLine方法 然而,我发现有时我无法阅读文件的整行内容 例如,tomcat试图编写以下内容,仅举一个例子: 192.168.0.0 localhost/index.html 此时此刻,当我阅读时,我可能会得到以下结果: 192.168.0 localhost/index.html 或

我必须读取tomcat日志文件,在一段时间后,例如:一小时后,我将再次读取该文件,以查找新添加的内容,因此我创建RandomAccessFile来记录我完成的最后一个帖子,并使用BufferedReader.readLine方法

然而,我发现有时我无法阅读文件的整行内容

例如,tomcat试图编写以下内容,仅举一个例子:

192.168.0.0 localhost/index.html

此时此刻,当我阅读时,我可能会得到以下结果:

192.168.0 localhost/index.html

192.168.0.0 localhost/index.html

也就是说,如果这一行正在写,我的读者会读到一个未完成的行

因此,我想知道有什么办法来决定正在阅读的这一行是否已经完成

这是核心代码:

raf = new RandomAccessFile(file, "r");
raf.seek(pos);
while ((line = raf.readLine()) != null) {
    System.out.println(line);
}
pos = raf.getFilePointer();
raf.close();
我已经尝试过了添加以下内容:

raf = new RandomAccessFile(file, "r");
raf.seek(pos);
while ((line = raf.readLine()) != null) {
    if(line.chartAt(line.length()-1)=='\n'){
        System.out.println(line);
    } else
        raf.seek(pos); //roll back to the last position

}
pos = raf.getFilePointer();
raf.close();
但是它不起作用


有什么想法吗?

readLine使用换行符。您不能使用它来确定是否有完整的行。您需要一次读取一个字节,然后自己解析该行


此外,当您获得有效行时,您不会在该位置上移动。

readLine会删除下线字符,因此您不会看到它。从EOF和EOL的角度来看,EOF和EOL之间没有区别,这在您的案例中是令人不安的。除了Peter的解决方案外,您还可以在读取该行并检查它是否为EOL后尝试返回一个字节。但要注意使用的行尾样式。

可能总是跳过最后一行?字节b;而b=raf.readByte!=-1{//如何检查这个字节是否是EOL?}另外,我从readByte中得到了一个字节,但行分隔符是一个字符串:system.getPropertyline.separator;如何比较?@hguser,您不应该假设输入的新行与系统默认值匹配。相反,您应该允许\r\n或\r\n