java - 在Java中将大于2GB的文件读入内存

标签 java io

由于 ByteArrayInputStream 限制为 2GB,是否有任何替代解决方案允许我将 2.3GB(可能更大)文件的全部内容存储到 InputStream由 Stax2 读取?

当前代码:

            XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance();
            XMLStreamReader xmlStreamReader = xmlInputFactory.createXMLStreamReader(in); //ByteArrayInputStream????
            try
            {
                SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");

                Schema schema = factory.newSchema(new StreamSource(schemaInputStream));
                Validator validator = schema.newValidator();
                validator.validate(new StAXSource(xmlStreamReader));

            }

            finally
            {
                xmlStreamReader.close();
            }

对于性能调整,变量 in 不得来自磁盘。我有足够的内存。

最佳答案

StAX2 的全部要点是您不需要将文件读入内存。您可以只提供源,让 StAX StreamReader 根据需要提取数据。

您还有哪些未在问题中显示的其他限制条件?

如果你有很多内存,并且你想获得良好的性能,只需用一个大字节缓冲区包装你的 InputStream,让缓冲区为你做缓冲:

// 4 meg buffer on the stream
InputStream buffered = new BufferedInputStream(schemaInputStream, 1024 * 1024 * 4);

在 Java 中解决这个问题的另一种方法是创建一个 RAMDisk,并将文件存储在上面,这将消除 Java 中的问题,Java 的基本限制是您只能拥有小于 Integer 的值。单个数组中的 MAX_VALUE 个值。

关于java - 在Java中将大于2GB的文件读入内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26140002/

相关文章:

java - 使用 POI Java 提取 Word 文档表格单元格中的内容

java - 将多个字符串保存到一个字符串中

java - 扫描仪在使用 next() 或 nextFoo() 后跳过 nextLine()?

c# - 如何使用最少的锁定访问文件

java - 将 frontend-maven-plugin 从 maven 迁移到 gradle

java - 哪个 XPath 表达式找到具有给定命名空间声明的元素集?

java - 将控制台数据输出写入文本文件

Ruby IO 无法按预期在 Windows 上工作,随机卡在 put 和 read 上

io - 使用 MPI-IO 编写 Fortran 格式的文件

ruby - 像使用 Ajax 一样使用 Ruby 调用异步方法