java - 并发处理 IO 流
问题描述
通常,要从资源目录中的文件中读取内容,我们可以通过打开输入流来完成。
this.getClass().getClassLoader().getResourceAsStream("yourJsonFile.json");
这在同步调用时效果很好。在同时处理的情况下,它会抛出带有以下消息的 I/O 异常。
Too many open files
at sun.nio.fs.UnixException.translateToIOException(UnixException.java:91)
at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)
at sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:214)
at java.nio.file.Files.newByteChannel(Files.java:361)
at java.nio.file.Files.newByteChannel(Files.java:407)
at java.nio.file.spi.FileSystemProvider.newInputStream(FileSystemProvider.java:384)
at java.nio.file.Files.newInputStream(Files.java:152)
at java.nio.file.Files.newBufferedReader(Files.java:2784)
at java.nio.file.Files.lines(Files.java:3744)
at java.nio.file.Files.lines(Files.java:3785)
为了使其更全面,假设我们正在使用 InputStream 读取文件,并在从文件中读取所有行后立即关闭它。在这种情况下,读取文件时打开一个 I/O 端口。但是,当并发调用发生时,它会尝试一次打开多个端口。这不仅会阻碍程序的进度,还会影响性能,因为 I/O 操作在时间消耗方面略高一些。
为了解决这种情况,我们可以通过将 IO 流封装到兼容的数据结构中来缓存它,HashMap 可能是理想的。有一个可以返回 HashMap 的方法。现在,每当我们需要读取文件时,我们需要做的就是调用此方法以使您的文件内容随时可供您使用。
这是目前处理这种情况的方法之一。
还有其他可能更有效的方法吗?
解决方案
推荐阅读
- angular - 使用 Angular 9 中未涵盖的 setTimeout 测试用例加载服务?
- asp.net - ASP.NET 应用程序的标准安装目录
- mongodb - 如何在document.find()mongodb中获取所有带有null的空值以及现有值
- flutter - Flutter 将日期时间选择器限制为 AM 或 PM 选择
- google-chrome - 如何在 Android 版本代码中更改 Chromium 中的默认搜索引擎?
- notepad++ - 将文本文件中的所有数字除以 2
- python - 如果存在特定单词,则从括号中删除文本
- node.js - 安装 fiber@2.0.2 时出错
- css-grid - 如何创建这样的 CSS 网格?
- flutter - 在回调中从 AndroidAlarmManager oneShotAt 获取 id