我正在使用完成服务来告诉我一组文件何时已成功加载。 这是读取文件的方法:
public static LocalDateColumn readLocalDateColumn(String fileName, ColumnMetadata metadata) throws IOException {
LocalDateColumn dates = new LocalDateColumn(metadata);
assert(dates != null);
try (FileInputStream fis = new FileInputStream(fileName);
SnappyFramedInputStream sis = new SnappyFramedInputStream(fis, true);
DataInputStream dis = new DataInputStream(sis)) {
boolean EOF = false;
while (!EOF) {
try {
int cell = dis.readInt();
dates.add(cell);
} catch (EOFException e) {
EOF = true;
}
}
}
//System.out.println(dates);
return dates;
}
请注意,日期是在断言检查的第一个语句中分配的值。另请注意倒数第二行:注释掉的 print 语句。当此语句未被注释掉时,返回值永远不会为空。当它被注释掉时,它是空的,大约是在相同数据上运行的时间的 1/2。
帮助将不胜感激。
顺便说一句。使用 EOF 异常捕获来查找文件末尾看起来很难看,但 Snappy 需要它才能正确操作。我在其他代码中使用过它并且它总是工作得很好。FWIW,上面的代码是使用 CompletionService 调用的 它看起来像这样:
List<Column> columnList = new ArrayList<>();
try {
for (ColumnMetadata column : columnMetadata) {
readerCompletionService.submit(() -> {
columnList.add(readColumn(path + File.separator + column.getId(), column));
return null;
});
}
for (int i = 0; i < columnMetadata.size(); i++) {
Future future = readerCompletionService.take();
future.get();
}
for (Column c : columnList) {
columns.put(c.id(), c);
}
执行到最后一行的位置。即:
columns.put(c.id(), c);
c 有时为空。
最佳答案
您同时使用ArrayList
,但该集合不是线程安全的。您应该尝试使用线程安全集合,例如 CopyOnWriteArrayList
。
关于java - 使用 Java IO 读取文件时返回 "impossible"null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37910273/