gpt4 book ai didi

java - 使用 InputStream 的 Java 库的非阻塞 IO

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:19:55 25 4
gpt4 key购买 nike

我正在阅读关于非阻塞 I/O 的文章,因为我正在使用 Akka 和 Play,如果在我能读到的上下文中可以避免的话,阻塞是一个坏主意,但我无法让它工作连同我的用例:

  1. 通过网络获取文件(这里有使用 nio 的替代方案,但现在我正在使用 URL.openStream)
  2. 使用 BouncyCaSTLe 解密文件 (PGP)(这里我仅限于 InputStream)
  3. 使用标准 Java GZIP(仅限于 InputStream)解压缩文件
  4. 读取文件中的每一行,这是一个基于位置的平面文件,并转换为一个案例类(这里我对读取方法没有任何限制,现在是 scalax.io.Resource)
  5. 坚持使用 Slick/JDBC(不确定 JDBC 是否阻塞)

它现在基本上一直在使用 InputStreams。但是,为了学习和提高我的理解,我正在研究是否可以使用非阻塞 IO 来做到这一点。

我基本上想通过一个管道流式传输文件,我在管道中应用上面的每个步骤,并最终在不阻塞的情况下持久保存数据。

如果需要代码,我可以轻松提供,但我正在寻找一般级别的解决方案:当我依赖于使用 java.io 的库时我该怎么办?

最佳答案

我希望这对您的某些观点有所帮助:

1/2/3/4) Akka 可以很好地与使用 java.io.InputStreamjava.io.OutputStream 的库一起工作。请参阅此页面,特别是此部分:http://doc.akka.io/docs/akka/snapshot/scala/io.html

A ByteStringBuilder can be wrapped in a java.io.OutputStream via the asOutputStream method. Likewise, ByteIterator can we wrapped in a java.io.InputStream via asInputStream. Using these, akka.io applications can integrate legacy code based on java.io streams.

1) 你说通过网络获取一个文件。我猜是通过 HTTP?您可以查看异步 HTTP 库。那里有许多相当成熟的异步 HTTP 库。我喜欢用 Spray Client在 scala 中,因为它建立在 akka 之上,所以在 akka 环境中运行良好。它支持 GZIP,但不支持 PGP。

4) 另一种选择:文件是否小到可以存储在内存中?如果是这样,您不必担心异步,因为您不会执行任何 IO。您不会在等待 IO 时阻塞,而是会不断使用 CPU,因为内存很快。

5) JDBC 阻塞。您以 SQL 查询作为参数调用方法,返回类型是包含数据的结果集。该方法必须在执行 IO 时阻塞才能返回此数据。

有一些Java async database drivers ,不过我看过的好像都没有维护过,所以没用过。

别害怕。阅读 akka 文档的这一部分,了解如何处理 akka 环境中的阻塞库: http://doc.akka.io/docs/akka/snapshot/general/actor-systems.html#Blocking_Needs_Careful_Management

关于java - 使用 InputStream 的 Java 库的非阻塞 IO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13754313/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com