使用Java将大于2GB的文件读入内存

usr*_*ΛΩΝ 7 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();
            }
Run Code Online (Sandbox Code Playgroud)

对于性能调整,变量in不得来自磁盘.我有很多 RAM.

rol*_*lfl 5

StAX2的重点在于您无需将文件读入内存.您可以只提供源,并让StAX StreamReader根据需要提取数据.

您没有在问题中显示哪些额外限制?

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

// 4 meg buffer on the stream
InputStream buffered = new BufferedInputStream(schemaInputStream, 1024 * 1024 * 4);
Run Code Online (Sandbox Code Playgroud)

在Java中解决这个问题的另一种方法是创建一个RAMDisk,并将文件存储在该文件上,这样就可以从Java中解决问题,在这个问题上,你的基本限制是只能Integer.MAX_VALUE在单个数组中只有少于几个值.

  • 我不是性能测试,我需要找到瓶颈.我明确地**请求做这个测试:将整个文件加载到内存中,验证它并为我的老板提供时间. (2认同)

bma*_*ies 3

使用NIO将文件读取到一个巨大的ByteBuffer中,然后创建一个读取ByteBuffer的流类。开源中存在一些这样的内容。