Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Java读取大型XML文件的最快方法_Java_Xml_Xml Parsing_Data Mining_Information Retrieval - Fatal编程技术网

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

用Java读取大型XML文件的最快方法,java,xml,xml-parsing,data-mining,information-retrieval,Java,Xml,Xml Parsing,Data Mining,Information Retrieval,我正在做一个java项目来优化现有代码。目前,我使用BufferedReader/FileInputStream在Java中以字符串形式读取XML文件的内容 但我的问题是,有没有更快的方法读取XML内容。SAX/DOM比BufferedReader/FileInputStream快 需要有关上述问题的帮助 提前感谢。有不同的解析器选项可用 考虑使用流解析器,因为DOM可能变得相当大。即推或拉解析器 XML解析器并不一定很慢。考虑你的网页浏览器。它一直在进行XML解析,并且非常努力地对语法错误保持

我正在做一个java项目来优化现有代码。目前,我使用BufferedReader/FileInputStream在Java中以字符串形式读取XML文件的内容

但我的问题是,有没有更快的方法读取XML内容。SAX/DOM比BufferedReader/FileInputStream快

需要有关上述问题的帮助


提前感谢。

有不同的解析器选项可用

考虑使用流解析器,因为DOM可能变得相当大。即推或拉解析器


XML解析器并不一定很慢。考虑你的网页浏览器。它一直在进行XML解析,并且非常努力地对语法错误保持健壮性。通常,内存是更大的问题。

有不同的解析器选项可用

考虑使用流解析器,因为DOM可能变得相当大。即推或拉解析器


XML解析器并不一定很慢。考虑你的网页浏览器。它一直在进行XML解析,并且非常努力地对语法错误保持健壮性。通常,内存是一个更大的问题。

我认为在另一个问题中显示的代码比类似DOM的解析器要快,后者肯定需要更多内存,可能需要一些计算才能完整地重建文档。不过,您可能需要分析代码

我还认为,如果您使用javaxxmlstreamreader,您的代码可以在流式处理中美化一点,我发现这对许多任务都很有帮助。那个班是。。。是读取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
          //

        }
      }
    }
  }
}

我认为,在另一个问题中显示的代码比类似DOM的解析器要快,后者肯定需要更多内存,并且可能需要一些计算才能完整地重建文档。不过,您可能需要分析代码

我还认为,如果您使用javaxxmlstreamreader,您的代码可以在流式处理中美化一点,我发现这对许多任务都很有帮助。那个班是。。。是读取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
          //

        }
      }
    }
  }
}

不知道你到底是什么意思。。。使用BufferedReader/FileInputStream读取文件将获得字节,但不是作为XML文档。。。SAX/DOM解析将读取文件,然后将XML解析为更有用的结构。一般来说,SAX解析器比DOM解析器快。在给应用程序施加压力并使用探查器之后,应用程序的这一部分是否被视为瓶颈?如果是,那么与其将XML文件作为字符串读取然后解析它,我想最好使用SAX解析器,因为它比DOM快,Charset.forNameUTF-8。其中filename是XML文件,b有整个XML文件数据。现在我逐行解析数据,提取特定字段并打印它。我正在寻找解析XML文档的最快方法,应该比使用BufferedReader更快。请帮忙做这件事regard@Mohana没有什么比读取原始流更快的了,当然,除非您的解析代码很慢,而且您没有发布该代码,那么我们怎么能说呢?-现在,您自己读取和解析XML是。。。。。有问题。你的代码能正确处理所有的怪癖吗?最好使用内置的解析器,例如SAX或StAX,但不要使用DOM,因为在大型XML文件上会耗尽内存。。。使用BufferedReader/FileInputStream读取文件将获得字节,但不是作为XML文档。。。SAX/DOM解析将读取文件,然后将XML解析为更有用的结构。一般来说,SAX解析器比DOM解析器快。在给应用程序施加压力并使用探查器之后,应用程序的这一部分是否被视为瓶颈?如果是,那么与其将XML文件作为字符串读取然后解析它,我想最好使用SAX解析器,因为它比DOM快,Charset.forNameUTF-8。其中filename是XML文件,b有整个XML文件数据。现在我逐行解析数据,提取特定字段并打印它。我正在寻找解析XML文档的最快方法,应该比使用BufferedReader更快。请帮忙做这件事regard@Mohana没有什么比读取原始流更快的了,当然,除非您的解析代码很慢,而且您没有发布该代码,那么我们怎么能说呢?-现在,您自己读取和解析XML是。。。。。有问题。你的代码能正确处理所有的怪癖吗?最好使用内置解析器,例如SAX或StAX,但不要使用DOM,因为这样会耗尽内存 n个大型XML文件。