我正在编写一段代码来分割文件。 我想拆分平面文件(没关系,工作正常)和 xml 文件。 这个想法是根据要分割的文件数量进行分割: 我有一个文件,我想将其拆分为 x 个文件(x 是参数)。 我通过获取文件的大小并将大小除以要拆分的文件数来进行拆分。 然后,我的解决方案是使用 BufferedReader 并像使用它一样
while ((n = reader.read(buffer, 0, buffer.length)) != -1) {
{
主要问题是,对于 xml 文件,我不能只拆分它,但我必须基于由开始 xml 标记和结束 xml 标记分隔的 block 来拆分它:
<start tag>
bla bla xml stuff
</end tag>
所以我不能在中间切一 block 。因此,如果当我在一个 block 的一半时,我的新文件的大小大于我的最大值,我将必须读取直到标签末尾,然后开始下一个文件。
问题是我有各种各样的情况,并且搜索结束标记有点困难。 - 该 block 读取文本直到结束标记的中间 - 该 block 读取文本直到结束标记结束,之后不再有其他字符 - ETC 并同时进行循环并读取下一个 block 。 有时,一个 block 的结尾与下一个 block 的开头连接在一起,我有结束 xml 标记。 我希望你能明白。
我的问题是,是否有人有一些算法可以更准确地处理所有特殊情况?
这个想法是尽快分割文件。 我不想使用lib将文件视为xml文件,因为 block 的大小可以更小或很大,而且我不知道内存是否足够。或者有一些库没有全部加载到内存中?
非常感谢。
下面是我的 xml 文件的示例;
<?xml version="1.0" encoding="UTF-8" ?>
<myTag service="toto" version="1.5.18" >
<endOfPeriodTradeNotification version="1.5.18">
.............
</endOfPeriodTradeNotification>
<endOfPeriodTradeNotification version="1.5.18">
.............
</endOfPeriodTradeNotification>
<endOfPeriodTradeNotification version="1.5.18">
.............
</endOfPeriodTradeNotification>
<inventoryDate>2009-12-31</inventoryDate>
<!-- reporting date -->
<processingDate>2010-01-29T00:00:00</processingDate>
</myTag>
我忘记了一件事:我的xml文件可以全部写在第一行, 所以我无法猜测一行有一个标签。
最佳答案
尽管您已经声明您不想使用将其视为 XML 文件的库。您可能需要考虑使用 SAX。
使用 SAX,而不是 DOM,您对内存的担忧就会减轻,因为整个文件不会加载到内存中,但当您的应用程序读取文件并遇到 XML 标志(例如开始和结束标记)时,就会发生事件。
SAX 也相当快。
此快速入门指南应该有所帮助:http://www.saxproject.org/quickstart.html
关于Java分割xml文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2810826/