问题标签 [filechannel]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
6 回答
8481 浏览

java - 使用 Bytebuffers 和 NIO 时如何避免 OutOfMemoryError?

我正在使用ByteBuffers并将FileChannels二进制数据写入文件。当为大文件或连续为多个文件执行此操作时,我得到一个OutOfMemoryError例外。我在其他地方读到过,Bytebuffers与 NIO 一起使用是坏的,应该避免。你们中是否有人已经遇到过此类问题并找到了一种解决方案,可以有效地将大量二进制数据保存在 java 文件中?

jvm选项-XX:MaxDirectMemorySize是要走的路吗?

0 投票
6 回答
14066 浏览

java - 使用 FileChannel 和 ByteArrays 读取 ASCII 文件

我有以下代码:

但是字符会显示在?这与使用 Unicode 字符的 Java 有关吗?我该如何纠正?

0 投票
1 回答
983 浏览

java - RandomAccessFile.close() 是否在内部调用 FileChannel.force()?

作为事务的一部分,我正在使用 RandomAccessFile 对文件执行一些写入操作。在提交事务之前,我想绝对确定数据已写入磁盘。调用force(boolean)RAFFileChannel似乎提供了这种保证,但是当我关闭文件时它是隐式调用的,还是我必须手动调用它?

force()此外,是否有人对实际执行的操作以及可以信任的程度有任何见解?操作系统是否有可能报告数据已写入磁盘,而实际上它仍位于某个缓存中?这个 OS/HDD/文件系统在多大程度上是依赖的?

0 投票
2 回答
1547 浏览

java - Java 的 FileChannel 的内存版本

我正在对我正在使用的库进行一些更改。为了减少内存使用,库将其临时数据写入磁盘而不是将其保存在内存中。但是,对于我的使用场景,将其保存在内存中会更有效。它也有一些并发问题,因为它的临时文件具有常量名称,因此不能在不同的线程中同时运行(因为线程会破坏彼此的数据)。

因此,我需要更改库,以便将所有数据保存在内存中。我最初并没有编写这个库,因此我对对代码进行大刀阔斧的改变不是很舒服。因此,我希望通过尽可能少的重构来做到这一点。写入磁盘的代码非常简单。这是一个(有些简化的)示例:

块的读取非常相似(即它使用从 RandomAccessFile 获得的 FileChannel)。

感觉最简单的解决方案是如果我可以使用 FileChannel 的一些实现,它映射到内存中的一个位置而不是文件。我知道我可以使用 FileChannel 的映射方法将文件映射到内存中的某个位置。然而,情况恰恰相反。这给了我一个文件的“内存API”。我想要一个针对一些内存的 FileChannel 接口。有没有可用的实现?

0 投票
5 回答
658 浏览

java - 任何加速从 Java FileChannel 随机读取的代码提示?

我有一个大型(3Gb)二进制文件,我在为聚类数据编写的迭代算法期间随机访问(或多或少)。每次迭代都会从文件中读取大约 50 万次,并写入大约 10 万次新值。

我像这样创建 FileChannel ...

然后我使用一个双倍大小的私有 ByteBuffer 来读取它

我的阅读代码看起来像这样

我这样写...

我的代码迭代所花费的时间大致随着读取次数线性增加。我已经对周围的代码进行了一些优化,以尽量减少读取次数,但我认为这是必要的核心集,而不会从根本上改变算法的工作方式,我现在想避免这种情况。

所以我的问题是,读/写代码或 JVM 配置中是否有任何东西可以加快读取速度?我意识到我可以改变硬件,但在我这样做之前,我想确保我已经从问题中挤出了每一滴软件汁液。

提前致谢

0 投票
2 回答
6762 浏览

java - 从 FileChannel 读取 GZIP 文件 (Java NIO)

我需要读取/解压给定 FileChannel 的 .gz 文件。

我已经尝试过使用 GZIPInputStream 提取 GZIP 档案,但这不会占用 FileChannel。我无权访问从中获取 FileChannel 的原始 FileInputStream。

如果有人能告诉我从 FileChannel 读取 GZIP 的好方法(或至少任何方法),我将不胜感激。

改编自Sun Oracle 论坛上的一个问题。

0 投票
1 回答
621 浏览

java - 尝试同时读取时 Java 滚动文件创建失败

我正在使用 java.util 日志记录类来创建滚动文件附加程序。我想创建一个日志阅读器,在将数据写入它们时从这些日志中读取。

滚动日志附加程序代码本身可以正常工作。但是,一旦我启动阅读器线程,就不会创建新文件,即如果将滚动日志附加程序设置为使用 5 个文件,它将创建 1og.0、log.1、log.2 等等,但如果阅读器线程启动,那么它只会create log.0 不创建其他文件。我在 java logging 和 log4j 中都注意到了这一点。

我正在使用 nio 读取日志阅读器。所以我的疑问是,在同一个文件上创建另一个 FileChannel 会产生一些问题吗?还是我在这里错过了一些导致问题的基本 nio 东西。

这是代码..

0 投票
1 回答
5223 浏览

java - FileChannel#force 和缓冲

我现在想澄清一下,并在 FileOutputStream 和 FileChannel 之间画一些相似之处。

因此,首先,使用标准 Java io 编写文件的最有效方法似乎是使用用 BufferedOutputStream 包装的 FileOutputStream。因为它会在内部缓冲区溢出时自动刷新。能够进行单次写入(单字节、浮点数等)以及数组写入很方便,而且不用担心速度。你永远不应该忘记的唯一一件事就是关闭它(执行最后的刷新)。使用 BufferedOutputStream 包装器的好处是显而易见的,每个人都必须拥有(我希望如此)。

现在关于 FileChannel。FileChannel 有 force 方法,相当于 FileOutputStream 中的 flush,不是吗?并且 javadocs 清楚地说,您应该使用它来确保您已对目标文件进行了更改。但是,如果没有“BufferedFileChannel”包装器,我不明白何时以及为什么要使用它。换句话说,FileChannel 的缓冲在哪里?它是否像 BufferedOutputStream 一样自动隐藏在 FileChannel 本身中?如果不是,那我到底为什么需要强制方法,因为没有什么可以强制的(使用 write 方法后所有更改都已应用于文件),我是否必须自己实现缓冲?

0 投票
1 回答
659 浏览

java - 在动态增加的文件中查找文件

我正在尝试在本地保存在线流,然后从本地节点分发流。

程序流程:

对 url 的第一个请求 url-test 创建了一个写入器线程,该线程开始使用文件名 url-file 写入文件系统。对该 url 的所有后续请求 url-test 都从本地文件系统处理。

作家线程

现在对于下一个请求,我需要读取本地保存的文件 url-file,然后移动到其中最后保存的位置。我正在使用 cv 对象的 totalBytes 属性,它为我提供了编写器线程保存的总字节数。

我没有看到任何输出,在文件中寻找的最佳方法是什么,该文件正在被另一个线程更新。

编辑:我希望编写器线程继续写入文件,并且任何请求的响应都应该从那个时间实例开始。简而言之,在文件通道中设置位置时,我的编写器线程仍在写入文件。即使我将文件通道位置设置为 25% 少说inc.position(totalBytes - (long) 0.25 * totalBytes)我仍然看不到输出。

0 投票
1 回答
3465 浏览

java - 使用 FileChannels 在 Java 中连接大文件的效率更高的方法是什么

我想找出我想出的在 Java 中连接我的文本文件的两种方法中哪种方法更好。如果有人有一些见解,他们可以分享内核级别发生的事情,解释这些写入 FileChannel 的方法之间的区别,我将不胜感激。

根据我从文档和其他 Stack Overflow 对话中了解到的情况,allocateDirect 在驱动器上分配空间,并且主要避免使用 RAM。我担心如果 File infile 很大,比如 1GB,使用 allocateDirect 创建的 ByteBuffer 可能会溢出或不被分配。在开发我们的软件时,我保证文件不会大于 2 GB;但未来有可能达到 10 或 20GB。

我观察到 transferFrom 循环永远不会多次通过循环......所以它似乎一次成功地写入了整个 infile;但我没有用大于 60MB 的文件对其进行测试。我还是循环了,因为文档指定不能保证一次写多少。在我的系统上,由于 transferFrom 只能接受 int32 作为其计数参数,我将无法一次指定超过 2GB 的传输...再次,内核专业知识将帮助我理解。

在此先感谢您的帮助!!

使用 ByteBuffer

使用 trasferTo(或 transferFrom)