XML解組基準:JAXB,STAx,Woodstox

介紹

上周末,我開始考慮如何以一種資源友好的方式處理大量XML數據。我要解決的主要問題是如何以塊的形式處理大型XML文件,同時提供上游/下游系統,需要處理一些數據。

當然,我已經使用JAXB技術已有幾年了。 使用JAXB的主要優點是可以加快產品上市時間; 如果擁有XML模式,則可以使用工具自動自動生成相應的Java域模型類(Eclipse Indigo,各種工具中的Maven jaxb插件,ant任務,僅舉幾例)。 然后,JAXB API提供Marshaller和Unmarshaller來編寫/讀取XML數據,從而映射Java域模型。

當JAXB的思想作為我的問題解決方案,我suddendlly意識到,JAXB保存在內存中的XML架構的整體客觀 ,所以一個顯而易見的問題是:“如何將我們的基礎設施應對大型XML文件(例如,在我的情況與一些元素> 100,000)是否要使用JAXB?”。 我可以簡單地生成一個大的XML文件,然后為其創建一個客戶端,并了解有關內存消耗的信息。

眾所周知,在Java中主要有兩種處理XML數據的方法:DOM和SAX。 使用DOM,XML文檔以樹的形式表示在內存中。 如果需要對樹節點進行點選訪問,或者需要編寫簡短的XML文檔,則DOM很有用。 另一方面,是一種事件驅動技術SAX,該技術當時將整個文檔解析為一個XML元素,并且對于每個XML重要事件,將回調“推”到Java客戶端,然后該Java客戶端處理它們(例如START_DOCUMENT,START_ELEMENT,END_ELEMENT等)。 由于SAX不會將整個文檔帶入內存,而是將類似游標的方法應用于XML處理,因此它不會消耗大量內存。 SAX的缺點是它會處理整個文檔的開始到結束; 這可能不一定是大型XML文檔所需要的。 例如,在我的場景中,我希望能夠傳遞給下游系統XML元素(但可用),但同時也許我一次只希望傳遞100個元素,實現某種分頁解。 從內存消耗的角度來看,DOM似乎過于苛刻,而SAX似乎可以滿足我的需求。

我記得讀過一些有關STax的知識,它是一種Java技術,它在實現RAM友好性的同時提供了拉XML元素 (而不是推送XML元素,例如SAX)的能力。 然后,我研究了該技術,并決定STax可能是我想要的折衷方案。 但是我想保留JAXB提供的簡單編程模型,所以我確實需要將兩者結合起來。 在調查STax時,我遇到了Woodstox。 這個開源項目有望成為比許多其他工具更快的XML解析器,因此我決定也將其包含在我的基準測試中。 現在,我具有創建基準的所有元素,以便在處理大型XML文檔時為我提供內存消耗和處理速度指標。

基準計劃

為了創建基準,我需要執行以下操作:

  • 創建一個定義我的域模型的XML模式。 這將是JAXB創建Java域模型的輸入
  • 創建代表該模型的三個大型XML文件,分別具有10,000 / 100,000 / 1,000,000元素
  • 有一個純JAXB客戶端,它將完全在內存中解組大型XML文件
  • 有一個STax / JAXB客戶端,它將SAX技術的低內存消耗與JAXB提供的簡便編程模型結合在一起
  • 擁有一個具有與STax / JAXB客戶端相同特性的Woodstox / JAXB客戶端(簡而言之,我只是想更改底層的解析器,看看是否可以提高性能)
  • 記錄內存消耗和處理速度(例如,每個解決方案以多快的速度使XML塊作為JAXB域模型類在內存中可用)
  • 因為我們知道,一張圖片可以說一千個單詞,所以可以圖形方式顯示結果。

域模型XML模式

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
targetNamespace="http://uk.co.jemos.integration.xml/large-file" 
xmlns:tns="http://uk.co.jemos.integration.xml/large-file" 
elementFormDefault="qualified"><complexType name="PersonType"><sequence><element name="firstName" type="string"></element><element name="lastName" type="string"></element><element name="address1" type="string"></element><element name="address2" type="string"></element><element name="postCode" type="string"></element><element name="city" type="string"></element><element name="country" type="string"></element></sequence><attribute name="active" type="boolean" use="required" /></complexType><complexType name="PersonsType"><sequence><element name="person" type="tns:PersonType"                   maxOccurs="unbounded" minOccurs="1"></element></sequence></complexType><element name="persons" type="tns:PersonsType"></element>
</schema>

我決定建立一個相對簡單的域模型,用XML元素代表人物及其姓名和地址。 我還想記錄一個人是否活躍。

使用JAXB創建Java模型

我是Maven的粉絲,并將其用作構建系統的默認工具。 這是我為此小基準定義的POM:

<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>uk.co.jemos.tests.xml</groupId><artifactId>large-xml-parser</artifactId><version>1.0.0-SNAPSHOT</version><packaging>jar</packaging><name>large-xml-parser</name><url>http://www.jemos.co.uk</url><properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.3.2</version><configuration><source>1.6</source><target>1.6</target></configuration></plugin><plugin><groupId>org.jvnet.jaxb2.maven2</groupId><artifactId>maven-jaxb2-plugin</artifactId><version>0.7.5</version><executions><execution><goals><goal>generate</goal></goals></execution></executions><configuration><schemaDirectory>${basedir}/src/main/resources</schemaDirectory><includeSchemas><includeSchema>**/*.xsd</includeSchema></includeSchemas><extension>true</extension><args><arg>-enableIntrospection</arg><arg>-XtoString</arg><arg>-Xequals</arg><arg>-XhashCode</arg></args><removeOldOutput>true</removeOldOutput><verbose>true</verbose><plugins><plugin><groupId>org.jvnet.jaxb2_commons</groupId><artifactId>jaxb2-basics</artifactId><version>0.6.1</version></plugin></plugins></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>2.3.1</version><configuration><archive><manifest><addClasspath>true</addClasspath><mainClass>uk.co.jemos.tests.xml.XmlPullBenchmarker</mainClass></manifest></archive></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId><version>2.2</version><configuration><outputDirectory>${project.build.directory}/site/downloads</outputDirectory><descriptors><descriptor>src/main/assembly/project.xml</descriptor><descriptor>src/main/assembly/bin.xml</descriptor></descriptors></configuration></plugin></plugins></build><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.5</version><scope>test</scope></dependency><dependency><groupId>uk.co.jemos.podam</groupId><artifactId>podam</artifactId><version>2.3.11.RELEASE</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.0.1</version></dependency><!-- XML binding stuff --><dependency><groupId>com.sun.xml.bind</groupId><artifactId>jaxb-impl</artifactId><version>2.1.3</version></dependency><dependency><groupId>org.jvnet.jaxb2_commons</groupId><artifactId>jaxb2-basics-runtime</artifactId><version>0.6.0</version></dependency><dependency><groupId>org.codehaus.woodstox</groupId><artifactId>stax2-api</artifactId><version>3.0.3</version></dependency></dependencies>
</project>

關于此pom.xml的幾點注意事項。

  • 我使用Java 6,因為從版本6開始,Java包含了JAXB,DOM,SAX和STax的所有XML庫。
  • 為了從XSD架構自動生成域模型類,我使用了出色的maven-jaxb2-plugin,它除其他外還允許獲得具有toString,equals和hashcode支持的POJO。

我還聲明了jar插件,以為基準創建可執行的jar,并聲明程序集插件以分發基準的可執行版本。 基準測試的代碼附在本文后,因此,如果您要自己構建并運行它,只需解壓縮項目文件,打開命令行并運行:

$ mvn全新安裝程序:

此命令會將* -bin。*文件放入目標/站點/下載文件夾中。 解壓縮您的首選項并運行基準測試(-Dcreate.xml = true將生成XML文件。如果您已經擁有這些文件(例如,第一次運行之后),則不要傳遞它:

$ java -jar -Dcreate.xml = true large-xml-parser-1.0.0-SNAPSHOT.jar

創建測試數據

為了創建測試數據,我使用了PODAM (一種Java工具,用數據自動填充POJO和JavaBean)。 代碼很簡單:

JAXBContext context = JAXBContext.newInstance("xml.integration.jemos.co.uk.large_file");Marshaller marshaller = context.createMarshaller();marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");PersonsType personsType = new ObjectFactory().createPersonsType();List<PersonType> persons = personsType.getPerson();PodamFactory factory = new PodamFactoryImpl();for (int i = 0; i < nbrElements; i++) {persons.add(factory.manufacturePojo(PersonType.class));}JAXBElement<PersonsType> toWrite = new ObjectFactory().createPersons(personsType);File file = new File(fileName);BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file), 4096);try {marshaller.marshal(toWrite, bos);bos.flush();} finally {IOUtils.closeQuietly(bos);}

XmlPullBenchmarker在?/ xml-benchmark下生成三個大??型XML文件:

  • large-person-10000.xml(大約3M)
  • large-person-100000.xml(大約30M)
  • large-person-1000000.xml(大約300M)

每個文件如下所示:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<persons xmlns="http://uk.co.jemos.integration.xml/large-file"><person active="false"><firstName>Ult6yn0D7L</firstName><lastName>U8DJoUTlK2</lastName><address1>DxwlpOw6X3</address1><address2>O4GGvxIMo7</address2><postCode>Io7Kuz0xmz</postCode><city>lMIY1uqKXs</city><country>ZhTukbtwti</country></person><person active="false"><firstName>gBc7KeX9Tn</firstName><lastName>kxmWNLPREp</lastName><address1>9BIBS1m5GR</address1><address2>hmtqpXjcpW</address2><postCode>bHpF1rRldM</postCode><city>YDJJillYrw</city><country>xgsTDJcfjc</country></person>[..etc]
</persons>

每個文件包含10,000 / 100,000 / 1,000,000 <person>元素。

運行環境

我在三種不同的環境中嘗試了基準測試器:

  • Ubuntu 10(64位)在Windows 7 Ultimate 上作為虛擬機運行 ,具有CPU i5、750 @ 2.67GHz和2.66GHz,8GB RAM,其中4GB專用于VM。 JVM:1.6.0_25,熱點
  • Windows 7 Ultimate ,用于托管上述VM,因此具有相同的處理器。 JVM,1.6.0_24,熱點
  • Ubuntu 10、32 ,3GB RAM,雙核。 JVM,1.6.0_24,OpenJDK

XML解組

為了解組代碼,我使用了三種不同的策略:

  • 純JAXB
  • STAX + JAXB
  • 伍德斯托克斯+ JAXB

純JAXB解組

我用來使用JAXB解組大型XML文件的代碼如下:

private void readLargeFileWithJaxb(File file, int nbrRecords) throws Exception {JAXBContext ucontext = JAXBContext.newInstance("xml.integration.jemos.co.uk.large_file");Unmarshaller unmarshaller = ucontext.createUnmarshaller();BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));long start = System.currentTimeMillis();long memstart = Runtime.getRuntime().freeMemory();long memend = 0L;try {JAXBElement<PersonsType> root = (JAXBElement<PersonsType>) unmarshaller.unmarshal(bis);root.getValue().getPerson().size();memend = Runtime.getRuntime().freeMemory();long end = System.currentTimeMillis();LOG.info("JAXB (" + nbrRecords + "): - Total Memory used: " + (memstart - memend));LOG.info("JAXB (" + nbrRecords + "): Time taken in ms: " + (end - start));} finally {IOUtils.closeQuietly(bis);}
}

該代碼使用單線解組每個XML文件:

JAXBElement<PersonsType> root = (JAXBElement<PersonsType>) unmarshaller.unmarshal(bis);

我還訪問了基礎PersonType集合的大小以“接觸”內存數據。 順便說一句,調試該應用程序顯示,在這行代碼之后,所有10,000個元素確實在內存中可用。

JAXB + STax

使用STax,我只需要使用XMLStreamReader,遍歷所有<person>元素,然后依次將每個元素傳遞給JAXB,以將其解組為PersonType域模型對象。 代碼如下:

// set up a StAX reader
XMLInputFactory xmlif = XMLInputFactory.newInstance();
XMLStreamReader xmlr = xmlif.createXMLStreamReader(new FileReader(file));
JAXBContext ucontext = JAXBContext.newInstance(PersonType.class);
Unmarshaller unmarshaller = ucontext.createUnmarshaller();
long start = System.currentTimeMillis();
long memstart = Runtime.getRuntime().freeMemory();
long memend = 0L;try {xmlr.nextTag();xmlr.require(XMLStreamConstants.START_ELEMENT, null, "persons");xmlr.nextTag();while (xmlr.getEventType() == XMLStreamConstants.START_ELEMENT) {JAXBElement<PersonType> pt = unmarshaller.unmarshal(xmlr,PersonType.class);if (xmlr.getEventType() == XMLStreamConstants.CHARACTERS) {xmlr.next();}}memend = Runtime.getRuntime().freeMemory();long end = System.currentTimeMillis();LOG.info("STax - (" + nbrRecords + "): - Total memory used: " + (memstart - memend));LOG.info("STax - (" + nbrRecords + "): Time taken in ms: " + (end - start));} finally {xmlr.close();}
}

請注意,這次創建上下文時,我必須指定它用于PersonType對象,并且在調用JAXB編組時,我還必須傳遞所需的返回類類型,并帶有:

JAXBElement<PersonType> pt = unmarshaller.unmarshal(xmlr, PersonType.class);

請注意,我對對象不做任何事情,只是創建它,以通過不引入任何不必要的步驟來使基準保持真實和可能。

JAXB + Woodstox

對于Woodstox,此方法與STax所使用的方法非常相似。 實際上,Woodstox提供了與STax2兼容的API,所以我要做的就是提供正確的工廠,然后……砰! 我讓伍德斯托克斯在掩護下工作。

private void readLargeXmlWithFasterStax(File file, int nbrRecords)throws FactoryConfigurationError, XMLStreamException,FileNotFoundException, JAXBException {// set up a Woodstox readerXMLInputFactory xmlif = XMLInputFactory2.newInstance();XMLStreamReader xmlr = xmlif.createXMLStreamReader(new FileReader(file));JAXBContext ucontext = JAXBContext.newInstance(PersonType.class);Unmarshaller unmarshaller = ucontext.createUnmarshaller();long start = System.currentTimeMillis();long memstart = Runtime.getRuntime().freeMemory();long memend = 0L;try {xmlr.nextTag();xmlr.require(XMLStreamConstants.START_ELEMENT, null, "persons");xmlr.nextTag();while (xmlr.getEventType() == XMLStreamConstants.START_ELEMENT) {JAXBElement<PersonType> pt = unmarshaller.unmarshal(xmlr,PersonType.class);if (xmlr.getEventType() == XMLStreamConstants.CHARACTERS) {xmlr.next();}}memend = Runtime.getRuntime().freeMemory();long end = System.currentTimeMillis();LOG.info("Woodstox - (" + nbrRecords + "): Total memory used: " + (memstart - memend));LOG.info("Woodstox - (" + nbrRecords + "): Time taken in ms: " + (end - start));} finally {xmlr.close();}
}

請注意以下行:

XMLInputFactory xmlif = XMLInputFactory2.newInstance();

我在哪里傳遞STax2 XMLInputFactory。 這使用Woodstox實現。

主循環

一旦文件就位(通過傳遞-Dcreate.xml = true獲得此文件),主文件將執行以下操作:

System.gc();
System.gc();for (int i = 0; i < 10; i++) {main.readLargeFileWithJaxb(new File(OUTPUT_FOLDER + File.separatorChar + "large-person-10000.xml"), 10000);main.readLargeFileWithJaxb(new File(OUTPUT_FOLDER + File.separatorChar + "large-person-100000.xml"), 100000);main.readLargeFileWithJaxb(new File(OUTPUT_FOLDER + File.separatorChar + "large-person-1000000.xml"), 1000000);main.readLargeXmlWithStax(new File(OUTPUT_FOLDER + File.separatorChar + "large-person-10000.xml"), 10000);main.readLargeXmlWithStax(new File(OUTPUT_FOLDER + File.separatorChar + "large-person-100000.xml"), 100000);main.readLargeXmlWithStax(new File(OUTPUT_FOLDER + File.separatorChar + "large-person-1000000.xml"), 1000000);main.readLargeXmlWithFasterStax(new File(OUTPUT_FOLDER + File.separatorChar + "large-person-10000.xml"), 10000);main.readLargeXmlWithFasterStax(new File(OUTPUT_FOLDER + File.separatorChar + "large-person-100000.xml"), 100000);main.readLargeXmlWithFasterStax(new File(OUTPUT_FOLDER + File.separatorChar + "large-person-1000000.xml"), 1000000);
}

它邀請GC運行,盡管我們知道這是由GC線程決定的。 然后,它將每個策略執行10次,以標準化 RAM和CPU消耗。 然后通過十次運行的平均值來收集最終數據。

內存消耗的基準測試結果

以下是一些圖表,這些圖表顯示了在解組10,000 / 100,000 / 1,000,000文件時不同運行環境下的內存消耗。

您可能會注意到,與STax相關的策略的內存消耗通常顯示為負值。 這意味著在解組所有元素之后比在解組循環開始時有更多的空閑內存。 反過來,這表明GC使用STax運行的次數比使用JAXB運行的次數多得多。 如果有人考慮,這是合乎邏輯的。 由于使用STax時,我們不會將所有對象都保留在內存中,因此有更多對象可用于垃圾回收。 在這種特殊情況下,我相信在while循環中創建的PersonType對象符合GC的條件,并進入年輕一代區域,然后被GC回收。 但是,這應該對性能產生最小的影響,因為我們知道從年輕一代空間聲明對象非常有效。

10,000個XML元素的摘要

100,000個XML元素的摘要

1,000,000個XML元素的摘要

處理速度的基準結果

10,000個元素的結果

100,000個元素的結果

1,000,000個元素的結果

結論

在所有三種不同環境下的結果,盡管有所不同,但都告訴我們相同的故事:

  • 如果您正在尋找性能(例如XML解組速度),請選擇JAXB
  • 如果您正在尋找內存不足的使用(并準備犧牲一些性能速度),請使用STax。

我個人的看法是,我不會選擇Woodstox,但是我會選擇JAXB(如果我需要處理能力并且可以負擔得起RAM)或STax(如果我不需要最高速度并且基礎設施資源不足) )。 這兩種技術都是Java標準,并且是從Java 6開始的JDK的一部分。

資源基準測試器源代碼

  • 郵編版本: 下載Large-xml-parser-1.0.0-SNAPSHOT-project
  • tar.gz版本: 下載Large-xml-parser-1.0.0-SNAPSHOT-project.tar
  • tar.bz2版本: 下載Large-xml-parser-1.0.0-SNAPSHOT-project.tar

標桿可執行文件:

  • 郵編版本: 下載Large-xml-parser-1.0.0-SNAPSHOT-bin
  • tar.gz版本: 下載Large-xml-parser-1.0.0-SNAPSHOT-bin.tar
  • tar.bz2版本: 下載Large-xml-parser-1.0.0-SNAPSHOT-bin.tar

數據文件:

  • Ubuntu 64位VM運行環境: 下載Stax-vs-jaxb-ubuntu-64-vm
  • Ubuntu 32位運行環境: 下載Stax-vs-jaxb-ubuntu-32位
  • Windows 7 Ultimate運行環境: 下載Stax-vs-jaxb-windows7

參考: Java中的XML解組基準測試: Marco Tedone博客博客上的JCG合作伙伴 Marco Tedone的JAXB vs STax vs Woodstox 。


翻譯自: https://www.javacodegeeks.com/2012/05/xml-unmarshalling-benchmark-jaxb-vs.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372488.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372488.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372488.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ArcGIS空間分析工具

1. 3D分析 1.1. 3D Features toolset 工具 工具 描述 3D Features toolset &#xff08;3D 要素工具集&#xff09; Add Z Information 添加 Z 信息 添加關于具有 Z 值的要素類中的要素的高程屬性的信息。 Buffer 3D 3D 緩沖 圍繞點或線創建三維緩沖區以生成球形或圓柱形的多面…

SHELL編程中如果路徑名遇到括號

linux中&#xff0c;如果文件名中帶括號&#xff0c;應先對括號處理&#xff0c;在“(”和“&#xff09;”前加上“\”。Bracket_Handle給出了處理方法&#xff1a;sub Bracket_Handle { my ($tmp_name) _; $tmp_name ~ s/\(/\\\(/g; # ( > \( $tmp_name ~ s/\)/…

計算機科學家和心理學家合作,生物智能與人工智能之間的合作

李飛飛帶領的斯坦福“以人為本AI研究院”發表文章&#xff0c;探討人工智能、神經科學、心理學和認知科學&#xff0c;以及數學、物理和社會科學等學科過去是怎樣、以及未來將如何共同合作&#xff0c;追求對理解和創造智能系統的探索。最初的類人智能出現在幾百萬年前的非洲大…

JavaOne 2012 – 2400小時! 一些建議

您可能已經看到JavaOne 2012 Content Catalog在線。 計劃委員會經過數周的艱苦工作&#xff0c;對每個提案進行了分類&#xff0c;審查&#xff0c;評分和討論&#xff0c;我們終于為您設置了&#xff08;希望如此&#xff09;有趣的組合。 整整105天或2400個小時&#xff0c;我…

C語言

自定義函數 &#xff08;1&#xff09;在函數使用之前定義函數 &#xff08;2&#xff09;先聲明這個函數&#xff0c;然后使用&#xff0c;使用的代碼后面定義這個函數 include <stdio.h> void syahello(){ println("helloo"); }int main(){ sayhello(); // 調…

【Centos】yum 安裝mariaDB

[dream361za ~]$ sudo yum search mariadb #查找需安裝的包 mariadb-libs.x86_64 : The shared libraries required for MariaDB/MySQL clients #mariadb客戶端 mariadb-server.x86_64 : The MariaDB server and related files #mariadb服務 [dream361za ~]$ sudo yum instal…

對口升學計算機組裝與維護,對口升學信息技術(計算機)類2017年專業課考試大綱...

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓山西省中等職業學校對口升學考試大綱信息技術類專業本考試大綱是以國家中等職業學校計算機專業教學指導方案為依據&#xff0c;以中等職業教育國家規劃教材《物理(電工電子類)》(李廣華、郝翠蘭主編&#xff0c;電子工業出版社)、《…

網頁性能優化(初窺)

面試的時候經常會被問到的有關于前端性能優化這一塊的問題&#xff0c;扯扯個人的理解 第一條&#xff1a;減少 HTTP 次數的請求 80%的最終用戶響應時間花在前端程序上&#xff0c;而其大部分時間則花在各種頁面元素&#xff0c; 如圖像、 樣式表、 腳本和 Flash 等&#xff0c…

STM32F10x_硬件I2C主從通信(輪詢發送,中斷接收)

Ⅰ、寫在前面 關注我分享文章的朋友應該知道我在前面講述過&#xff08;軟件、硬件&#xff09;I2C主機控制從機EEPROM的例子。在I2C通信主機控制程序是比較常見的一種&#xff0c;可以說在實際項目中&#xff0c;很多應用都會使用到I2C通信。但在實際項目中作為I2C從機的應用相…

JavaFX 2:創建登錄表單

在本教程中&#xff0c;我將使用JavaFX 2和CSS設計漂亮的Login Form 。 它是經典的登錄表單&#xff0c;帶有用戶名和密碼以及登錄按鈕。 為了遵循本教程&#xff0c;我強烈建議您查看以下這些教程&#xff1a; Eclipse IDE中的JavaFX 2入門 JavaFX 2&#xff1a;HBox JavaFX…

c html導出成word,html轉word-html如何轉換成WORD

1、打開HTML文件&#xff0c;點擊菜單欄文件→使用MicrosoftOfficeWord編輯&#xff0c;之后系統會自動打開Word并顯示HTML文件的內容&#xff0c;這是保存即可。2、如果找不到“使用MicrosoftOfficeWord編輯”的話&#xff0c;點擊菜單欄工具→Internet選項→程序→HTML編輯器…

怎么解決tomcat占用8080端口問題

怎么解決tomcat占用8080端口問題 相信很多朋友都遇到過這樣的問題吧&#xff0c;tomcat死機了&#xff0c;重啟eclipse之后&#xff0c;發現Several ports (8080, 8009) required by Tomcat v6.0 Server at localhost are already in use.The server may already be running in…

ADO Recordset 對象鏈接

http://baike.baidu.com/link?url4Xdc46R8M5uj-BbOGaH761N5oDEYlGQJFeR2WbPwx1iQBusAUKU3qbWcHZCMmayatj9nzxPW7HdPToL6roD3Y_ 轉載于:https://www.cnblogs.com/loanhicks/p/5788451.html

mvc4 html.beginform,MVC4 Html.BeginForm在Internet Explorer中提交按鈕 9不工

我已經寫在ASP.NET MVC4 /剃刀的形式。 該表格后很完善在Firefox和Chrome&#xff0c;但由于某種原因在Internet Explorer 10和11&#xff0c;“提交”按鈕沒有反應。 (Internet Explorer 9的作品也不錯)。這是我的看法形式的樣子&#xff1a;using (Html.BeginForm("MyAc…

頁面傳值的方法 和JSON與字符串和對象之間的轉換

json數據解析 就是將json轉換為數組或對象 json數據序列化 就是將數組或對象轉化為json轉載于:https://www.cnblogs.com/yaomengli/p/6678709.html

JasperReports JSF插件用例系列

這是文章系列的切入點&#xff0c;在該系列文章中&#xff0c;我將嘗試介紹JasperReport JSF Plugin的一些用例&#xff0c; JasperReport JSF Plugin是一種工具&#xff0c;旨在輕松地將為JasperReports設計的業務報告集成到JSF應用程序中。 該系列中描述的所有示例都可以從Ja…

回歸分析

一元線性回歸模型&#xff1a; 一元線性回歸分析的主要任務是&#xff1a; 解得&#xff1a; 三、檢驗、預測與控制&#xff1a; 1&#xff09;F檢驗法&#xff1a; 2&#xff09;t檢驗法 3&#xff09;r檢驗法 3預測&#xff1a; 四、可線性化的一元非線性回歸&#xff08;曲線…

與傳統的計算機硬件系統相比,計算機一級名詞解釋

目前微型機中普遍采用的字符編碼是ASCII碼。它是用7位二進制數對127個字符進行編碼&#xff0c;其中前32個是一些不可打印的控制符號。多媒體系統由主機硬件系統、多媒體數字化外部設備和多媒體軟件三部分組成。機器語言和匯編語言都是"低級"的語言&#xff0c;而高級…

ubuntu安裝jdk1.8

sudo add-apt-repository ppa:webupd8team/javasudo apt-get updatesudo apt-get install oracle-java8-installer 轉載于:https://www.cnblogs.com/czwangzheng/p/5793488.html

【java】對象變成垃圾被垃圾回收器gc收回前執行的操作:Object類的protected void finalize() throws Throwable...

1 package 對象被回收前執行的操作;2 class A{3 Override4 protected void finalize() throws Throwable {5 System.out.println("在對象變成垃圾被gc收回前執行的操作。");6 }7 }8 public class Test_finalize {9 public static void main(…