- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个 Java 进程,它使用 Java RandomAccessFile 读取给定文件,并根据文件内容进行一些处理。该文件是一个日志文件,由另一个 Java 进程更新。读取文件的 java 进程在另一台机器上,并具有 NFS 挂载设置以访问远程服务器中的文件。基本上,读取文件的进程将根据 RandomAccessFile 的文件长度和位置轮询文件中的更改,并为遇到的每个字节调用处理程序方法。问题是我有时会从 RandomAccessFile 读取方法返回 ASCII“NUL”字符
int charInt = read();
也就是说,charInt 在某些情况下返回 0,并在一段时间后返回有效字符。但是后来我在流读取 NULs 期间丢失了字符
我尝试使用 http://commons.apache.org/io/apidocs/org/apache/commons/io/input/Tailer.html我在哪里收到每一行的通知。但是在这些行中,我有时会注意到 ASCII NUL 字符。我也在 Java IO implementation of unix/linux "tail -f" 中进行了追踪 - 我的 java 进程是类似的,但后来我开始认为问题出在 NFS 挂载或尝试从 NFS 挂载读取时一些错误的 java IO。我从一个普通文件(不在 NFS 装载中)进行了一些测试读取,并有一个连续写入它的进程。所有这些测试都成功了。我还尝试了 java BufferedReader,因为文件流实际上是一个字符流,尽管我可以将其视为字节流。我仍然得到 NUL 字符。
不确定这是否重要 - NFS 挂载是只读 (ro) 挂载。感谢对此的任何帮助。谢谢。
我也尝试了以下方法:
FileWriter fileWriter;
try {
fileWriter = new FileWriter("<OUT_FILE>", true);
} catch (IOException e) {
throw new RuntimeException("Exception while creating file to write sent messages ", e);
}
BufferedWriter bufWriter = new BufferedWriter(fileWriter);
Runtime r = Runtime.getRuntime();
Process p = r.exec("tail -f <PATH_TO_IN_FILE>");
Scanner s = new Scanner(p.getInputStream());
while (s.hasNextLine()) {
String line = s.nextLine();
bufWriter.write(line);
bufWriter.write(System.getProperty("line.separator"));
bufWriter.flush();
}
bufWriter.close();
但我仍然得到 NUL 字符。在这里,我将读取的行写入文件,以便我可以比较 IN 文件和 OUT 文件。我看到有一次跳过了行(带有 NUL 字符)。所有其他行都比较好 - 所以从大约 13000 行中,我们看到大约 100 行不匹配。另外一件奇怪的事情是我跑得少了,我也可以在这里看到 NUL 字符,基本上是 ^C^@^@^@^@^@^@^@^@^@ 的形式^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ ^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ ^@^@^@^@^@^@^@^@然后是有效行。在错过这些行的时候我注意到的另一件事是,文件在写入过程中更新得非常快,所以基本上一条 xml 消息在 20110729 13:44:06.070097 写入文件,然后在 20110729 13 写入下一条消息:44:06.100007。第二个 xml 消息中缺少行。更多发现:我们正在读取文件的文件路径位于共享 NAS 中。
最佳答案
我意识到这个问题现在已有一年多了,但我会添加我所知道的,以防其他有这个问题的人像我一样偶然发现它。
这个问题中描述的 NUL 字符是由于异步写入正在读取的文件而出现的。更具体地说,来自远程文件写入器的数据包乱序到达,NAS 缓冲区提交了一个稍后的数据包,并用 NUL 字符填充未接收数据的区域。当收到丢失的数据包时,NAS 缓冲区会提交它,覆盖那些空字符。
在我们第一次遇到这种情况的应用程序中,我们正在逐行读取文件,并跟踪成功读取的最后一个行号(因此我们可以随时停止并从我们停止的地方重新开始)。我们处理这个问题的临时解决方案是在每次读取时专门检查“\0”,当遇到它时,关闭文件,等待 1 秒并重新打开文件,排队到我们停止的地方。通常,当我们再次读取该行时,实际文本已经提交。
虽然关闭并重新打开文件看起来很戏剧化,但不这样做就无法恢复。您不能标记/重置 BufferedReader 来解决它,因为一旦字符被读入读取器的缓冲区,它们将不会从文件中重新读取,只会在您每次尝试再次读取时反省。
获取底层 FileChannel 以及读取和设置 position() 也会失败,因为您在文件中的位置包括您可能尚未看到的读入缓冲区的字符,并且您最终将跳过那些看不见的数据。
我们正在测试一个解决方案,我们扩展了 InputStreamReader 类并覆盖了 read(char[], int, int) 方法以使用文件 channel 在每次读取之前获取位置,调用父类(super class)的 read 方法,检查\0 并在找到时重置文件 channel 位置,返回 0 作为读取的字符数。
关于Java InputStream 读取方法为 NFS 安装位置中的文件返回 ASCII 'NUL' 字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6814404/
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
在编码时,我问了自己这个问题: 这样更快吗: if(false) return true; else return false; 比这个? if(false) return true; return
如何在逻辑条件下进行“返回”? 在这样的情况下这会很有用 checkConfig() || return false; var iNeedThis=doSomething() || return fa
这是我的正则表达式 demo 如问题所述: 如果第一个数字是 1 则返回 1 但如果是 145 则返回 145 但如果是 133 则返回 133 样本数据a: K'8134567 K'81345678
在代码高尔夫问答部分查看谜题和答案时,我遇到了 this solution返回 1 的最长和最晦涩的方法 引用答案, int foo(void) { return! 0; } int bar(
我想在下面返回 JSON。 { "name": "jackie" } postman 给我错误。说明 Unexpected 'n' 这里是 Spring Boot 的新手。 1日龄。有没有正确的方法来
只要“is”返回 True,“==”不应该返回 True 吗? In [101]: np.NAN is np.nan is np.NaN Out[101]: True In [102]: np.NAN
我需要获取所有在 6 号或 7 号房间或根本不在任何房间的学生的详细信息。如果他们在其他房间,简单地说,我不希望有那个记录。 我的架构是: students(roll_no, name,class,.
我有一个表单,我将它发送到 php 以通过 ajax 插入到 mysql 数据库中。一切顺利,php 返回 "true" 值,但在 ajax 中它显示 false 消息。 在这里你可以查看php代码:
我在 Kotlin 中遇到了一个非常奇怪的无法解释的值比较问题,以下代码打印 假 data class Foo ( val a: Byte ) fun main() { val NUM
请注意,这并非特定于 Protractor。问题在于 Angular 2 的内置 Testability service Protractor 碰巧使用。 Protractor 调用 Testabil
在调试窗口中,以下表达式均返回 1。 Application.WorksheetFunction.CountA(Cells(4 + (i - 1) * rows_per_record, 28) & "
我在本地使用 jsonplaceholder ( http://jsonplaceholder.typicode.com/)。我正在通过 extjs rest 代理测试我的 GET 和 POST 调用
这是 Postman 为成功调用我的页面而提供的(修改后的)代码段。 var client = new RestClient("http://sub.example.com/wp-json/wp/v2
这个问题在这里已经有了答案: What to do with mysqli problems? Errors like mysqli_fetch_array(): Argument #1 must
我想我对 C 命令行参数有点生疏。我查看了我的一些旧代码,但无论这个版本是什么,都会出现段错误。 运行方式是 ./foo -n num(其中 num 是用户在命令行中输入的数字) 但不知何故它不起作用
我已经编写了一个类来处理命名管道连接,如果我创建了一个实例,关闭它,然后尝试创建另一个实例,调用 CreateFile() 返回 INVALID_HANDLE_VALUE,并且 GetLastErro
即使 is_writable() 返回 true,我也无法写入文件。当然,该文件存在并且显然是可读的。这是代码: $file = "data"; echo file_get_contents($fil
下面代码中的变量 $response 为 NULL,尽管它应该是 SOAP 请求的值。 (潮汐列表)。当我调用 $client->__getLastResponse() 时,我从 SOAP 服务获得了
我一直在网上的不同论坛上搜索答案,但似乎没有与我的情况相符的... 我正在使用 Windows 7,VS2010。 我有一个使用定时器来调用任务栏刷新功能的应用程序。在该任务栏函数中包含对 LoadI
我是一名优秀的程序员,十分优秀!