首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在流结束后关闭文件?

如何在流结束后关闭文件?
EN

Stack Overflow用户
提问于 2016-01-20 19:14:56
回答 2查看 765关注 0票数 5

我有一个java.io.File序列流。我使用flatMapConcat来创建新的文件Source,如下所示:

代码语言:javascript
复制
def func(files: List[File]) =
  Source(files)
    .map(f => openFile(f))
    .flatMapConcat(f => Source.fromPublisher(SomePublisher(f)))
    .grouped(10)
    .via(SomeFlow)
    .runWith(Sink.ignore)

是否有一种简单的方法在流结束后关闭每个文件?SomePublisher()无法关闭它。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-21 14:32:01

所以我找到了一个很好的方法来解决我的问题,但是如果你有其他的方法,我也想看到它。

代码语言:javascript
复制
def someSource(file: File) = {
  val f = openFile(file)

  Source
    .fromPublisher(SomePublisher(f))
    .transform(() => new PushStage[?, ?] {
      override def onPush(elem: ?, ctx: Context[?]): SyncDirective = ctx.push(elem)

      override def postStop(): Unit = {
        f.close()
        super.postStop()
      }
    }
}

def func(files: List[File]) =
  Source(files)
    .flatMapConcat(someSource)
    .grouped(10)
    .via(SomeFlow)
    .runWith(Sink.ignore)
票数 2
EN

Stack Overflow用户

发布于 2016-01-21 11:01:46

因此,如果我正确地理解了您的意思,您将执行以下操作:对于创建数据库对象的每个文件,都会打开该文件。因此,由于您在代码中打开db连接,所以您负责关闭它。由于您正在处理有限的文件列表,您可以按顺序存储所有db连接,运行流并在流结束后关闭所有连接。

另一种方法是让您自己的发布者获得文件名,打开db连接,从它获得流,关闭db连接。第二个选项将允许您从无限的文件列表中流。

如果你想要我的代码片段,给我你的函数的完整源代码,我会更新它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34908531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档