java - BufferedReader.lines() 方法在 Windows 上锁定
问题描述
我有调用 BufferedReader.lines() 的代码。
EIPLogManager2.getServerLogger().info("Got header row: " + headerRow); //TODO delete this
List<String> allBatches = reader.lines()
.skip(forkCount > 0 ? forkCount * forkSize : 0)
.limit(transactionsRemaining.get() * forkSize)
.collect(Collectors.toList());
EIPLogManager2.getServerLogger().info("Got all batches. Size: " + allBatches.size()); //TODO delete this
让我解释一下这段代码的行为:
在我的 Mac 上运行它。完美运行。
在 Windows 上运行它。标题行日志条目打印出来,但 Got all batches 日志条目永远不会。它似乎在流中冻结。
transactionsRemaining.get() 调用是针对 AtomicInteger。
我不知道为什么在 Windows 上会发生这种情况。这没有道理。我已经在 JRE 8 和 JRE 11 中看到了这种行为。
解决方案
好吧,我傻了。因此 forkSize 和 transactionsRemaining 变量由用户输入设置。用户已将 transactionsRemaining 设置为 1,000,000,000,因此 limit() 的数学运算产生的值大于 Integer.MAX_VALUE。然后抛出了一个 IllegalArgumentException,我想我没有任何东西可以向我报告该异常。
现在问题已解决。
推荐阅读
- c++ - 如何使用 UML 类图实现从父类派生的类对象类型
- api - 为什么我无法在使用 Platform of Trust 提供的 Insomnia 工作区创建的 MyWorld Standard 数字身份中进行可视化?
- amazon-web-services - AWS S3 错误“策略具有无效资源”
- react-native - 使用现有的 React Native 项目实现 Sentry
- angular - 用 RouterLink 替换字符串
- mysql - 我声明变量的方式有什么问题,因为我不断收到语法 1064?
- php - 使用 array_merge 将多个数组合并为一个时的问题
- google-cloud-platform - gcloud - 找出子网中的免费 ip 数量
- postgresql - Book The Art of PostgreSQL 自学 不懂横向连接是什么意思?
- vue.js - 使用新版本自动更新 Vue 站点/PWA