java - 使用 Java IO 读取文件时返回 "impossible"null

标签 java multithreading io

我正在使用完成服务来告诉我一组文件何时已成功加载。 这是读取文件的方法:

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/

相关文章:

java - 如何在 LINUX shell 上用 Java 编译多个类文件?

java - 在java中处理套接字

python - 从 QThread 生成并插入到 QTreeWidget 中的 QWidget 的正确父子关系

java - 对于接收外部事件以更新 GUI 元素的 SWT View (ViewPart),推荐的方法是什么?

java - 扫描仪在使用 next() 或 nextFoo() 后跳过 nextLine()?

java - 用于绘制圆的 While 循环

java - 安全连接失败

f# - 良好的 F# 异步 IO 示例

java - 如何在 Eclipse 调试器中查看 Java 字符串?

python - 如何在 Python 中打印命令?