用Java读取大型XML文件的最快方法

Moh*_*ana 1 java xml information-retrieval data-mining xml-parsing

我正在研究一个java项目来优化现有代码.目前我正在使用BufferedReader/FileInputStream在Java中将XML文件的内容读取为String.

但我的问题是,有没有更快的方式来读取XML内容.SAX/DOM比BufferedReader/FileInputStream快吗?

需要有关上述问题的帮助.

提前致谢.

sen*_*inp 5

我认为你在其他问题中显示的代码比类似DOM的解析器更快,这肯定需要更多的内存和可能的一些计算才能完整地重建文档.您可能想要分析代码.

如果你使用javax XMLStreamReader,我也认为你的代码可以为流处理做一些调整,我觉得这对很多任务很有帮助.据Oracle称,该类是"......旨在成为读取XML数据的最低级别和最有效的方式".

以下是我的代码摘录,其中我解析了作为公共数据转储分发的StackOverflow用户XML文件:

// the input file location
private static final String fileLocation = "/media/My Book/Stack/users.xml";

// the target elements
private static final String USERS_ELEMENT = "users";
private static final String ROW_ELEMENT = "row";

// get the XML file handler
//
FileInputStream fileInputStream = new FileInputStream(fileLocation);
XMLStreamReader xmlStreamReader = XMLInputFactory.newInstance().createXMLStreamReader(
    fileInputStream);

// reading the data
//
while (xmlStreamReader.hasNext()) {

  int eventCode = xmlStreamReader.next();

  // this triggers _users records_ logic
  //
  if ((XMLStreamConstants.START_ELEMENT == eventCode)
      && xmlStreamReader.getLocalName().equalsIgnoreCase(USERS_ELEMENT)) {

    // read and parse the user data rows
    //
    while (xmlStreamReader.hasNext()) {

      eventCode = xmlStreamReader.next();

      // this breaks _users record_ reading logic
      //
      if ((XMLStreamConstants.END_ELEMENT == eventCode)
          && xmlStreamReader.getLocalName().equalsIgnoreCase(USERS_ELEMENT)) {
        break;
      }
      else {

        if ((XMLStreamConstants.START_ELEMENT == eventCode)
            && xmlStreamReader.getLocalName().equalsIgnoreCase(ROW_ELEMENT)) {

          // extract the user data
          //
          User user = new User();
          int attributesCount = xmlStreamReader.getAttributeCount();
          for (int i = 0; i < attributesCount; i++) {
            user.setAttribute(xmlStreamReader.getAttributeLocalName(i),
                xmlStreamReader.getAttributeValue(i));
          }
          // all other user record-related logic
          //

        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

用户文件格式非常简单,与您的Bank.xml文件类似:

<users>
  <row Id="1567200" Reputation="1" CreationDate="2012-07-31T23:57:57.770" DisplayName="XXX" EmailHash="XXX" LastAccessDate="2012-08-01T00:55:12.953" Views="0" UpVotes="0" DownVotes="0" />
  ...
</users>
Run Code Online (Sandbox Code Playgroud)