久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術文章
文章詳情頁

基于Java 開發QuickTime 程序

瀏覽:3日期:2024-06-16 13:09:31
內容: 摘要:QuickTime 視頻文件播放程序如今已經發展和成長15年了,在添加新特性的同時也保持了極好的向后兼容性:1990年在系統6或7上制造的QuickTime movie2005年仍然能在Mac 操作系統X 10.3.7上播放。這是因為QuickTime 的共享代碼片段的組件系統可被發現和被動態的調用。QuickTime 所需要用來播放movie的大部分是一個組件:理解文件格式的代碼;使在文件中使用的音頻,視頻,或其他編解碼器減壓的代碼;處理流媒體協議的代碼;等等。舊的組件簡單的維護,新的組件向QuickTime 添加了更多的功能。當QuickTime 的一個新版本增加了對新的格式或編解碼器的支持,或當用戶自己安裝了新的特性,一個運行良好的應用程序將會自動增加這些新的特性。并且,幸運地,組件為Java 程序員做好了準備,他們可以使用適合于Java 應用編程接口的QuickTime 。在這篇來自《適用于JAVA的QuickTime :開發者的寶典》,Chris Adamson 指出怎么寫這樣一個性質良好的應用程序。第四章:用組件工作介紹了組件的類型和子類型的識別模式并指出如何導出一個QuickTime movie到固定格式,或運行時能找到的任何格式。它說明了如何導入導出圖形,并提供了顯示所有已安裝組件的一個實用程序。版權聲明:任何獲得Matrix授權的網站,轉載時請務必保留以下作者信息和鏈接作者:Chris Adamson;Amydeng(作者的blog:http://blog.matrix.org.cn/page/Amydeng)譯文:http://www.matrix.org.cn/resource/article/44/44269_Java+QuickTime.html關鍵字:Java;QuickTime用組件工作 當QuickTime1990年問世的時候,它能夠播放一張郵票大小的movie——僅僅在價值7000美圓的硬盤上。它使用音頻和視頻的編解碼器,盡管這些編解碼器今天仍然被支持,但已被用戶淘汰很久了。然而,從 Apple 視頻到Cinepak 視頻再到MPEG-4,是一個平滑的變換。這是由于一個特別的標準化設計——QuickTime 里大部分繁重的任務都是由組件或共享的動態代碼執行。組件提供了如下的支持:導入導出圖片和movie格式,執行圖片和聲音的壓縮和解壓縮,訪問系統資源及更多其它功能。QuickTime安裝程序提供了很多組件,這些組件具備許多有效的特性,而用戶也可以自己從Apple或者第三方添加其他組件進來,這些組件能夠提供更多的功能,如支持更多的多媒體格式。 API里組件并不處于中心位置——畢竟,在開始的幾章里已經設法完全避免提到它們。當我們需要打開文件并將它們轉換為movie,解壓縮和解釋數據,保存它們到硬盤等等時,這個時候我們QuickTime做正確的事情。當需要的時候,QuickTime為了必需的功能瀏覽它的組件目錄并得到它所需要的東西。 但是有些時候開發者為了指出什么是可用的,或者為了指定特定地行為,或者需要更直接地使用組件。這個時候, 找出運行時可用的工具是一個強有力的方法。指定組件類型 QuickTime里,組件由類型和子類型來識別,類型指定了功能范圍,子類型是該功能的一個特定實現。例如,有一個“movie 導出器類型,代表可以導出一部movie到非QuickTime格式的組件。它用子類型確定適合AVI(Video for windows 的多媒體文件格式),MPEG-4的導出器, 這些標識符是32比特的整型值,但它們不列舉你可能期望來自JAVA的常數。通常地,32比特被分成是4個8比特的ASCII 字符來讀取,組成一個簡短的,易讀的名字。這些在本地API包里定義為OSTypes類型,但是當與有意義的值組裝到一起時,它們被稱為“四字符代碼,來自本地FOUR_CHAR_CODE函數,該函數為一個字符串返回一個OSType類型。這經常簡稱為 FCC或4CC。 這種模式采納了C程序員的觀點。例如,為一部movie定義4CC需要一個好的,簡單的短語,就像在本地頁眉文件Movies.h 中所見的一樣: MovieResourceType = 'moov' 然而,由于Java的更先進的文本處理方法,在Java中用4CCs 處理要困難的多。因為,Unicode的應用意味著每個 Java字符是2個比特,這說明我們需要額外的幫助來將Java字符轉化為4CC。我們如何做呢? 幸運地,QTUtils類提供了2個方法:toOSType()和fromOSType()。例4-1展示了這些方法,將一個Java 字符串轉化為一個4CC 表示,并從它的4CC 表示轉化回來。Example 4-1. Converting to and from FOUR_CHAR_CODEs package com.oreilly.qtjnotebook.ch04;import quicktime.util.QTUtils;public class FourCharCodeTest extends Object { public static void main (String[] args) { if (args.length < 1) { System.out.println ('Usage: FourCharCodeTest '); return; } System.out.println (args[0])int fcc = QTUtils.toOSType (args[0]); System.out.println (fcc); System.out.println (Integer.toHexString (fcc)); String fccString = QTUtils.fromOSType(fcc); System.out.println (fccString); }}main()函數從命令行取得一個String ,把它轉換成一個4CC,打印出4CC的十進制和十六進制值,然后把它轉換回一個String 。用moov 作實驗時,導出如下: 剛剛發生了什么?這些有用的方法提供了一些好的,老式的bit-munging來做它們的轉換。toOSType()以一個String 為依據,取每個字符的低8位并把它們放在所返回整型值的適當位置。換句話說,第一個字符的低8為代替了整數的開始8位,然后下一個字符作為下一個8位,等等。圖4-1說明了在 'moov'位轉移中在哪里位結束。(圖4-1)fromOSType()做相反的轉換,轉換整型的比特位為一個四字符的Java 字符串。導出movie 最明顯的有用的組件之一是MovieExporter,你可以用它來將一個QuickTime movie轉換為一個非QuickTime 格式的movie,如AVI 或MPEG-4。我們如何做呢?類quicktime.std.qtcomponents.MovieExporter圍繞movie導出組件提供了方便的Java 封裝。這需要你傳遞給它一個子類型參數,告訴他你想使用哪種導出類——也就是,你想要導出為哪種格式。例4-2展示了從固定的子類型列表中創造和利用MovieExporter。Example 4-2. Simple MovieExporter creation and use package com.oreilly.qtjnotebook.ch04;import quicktime.*;import quicktime.std.*;import quicktime.std.movies.*;import quicktime.io.*;import quicktime.std.qtcomponents.*;import quicktime.utils.QTUtils;import java.awt.*;import javax.swing.*;import com.oreilly.qtjnotebook.ch01.QTSessionCheck;public class SimpleMovieExport extends Object { public static final void main (String[] args) { new SimpleMovieExport(); } public SimpleMovieExport() { // build choices ExportChoice[] choices = new ExportChoice[3]; choices[0] = new ExportChoice ('QuickTime Movie', StdQTConstants.kQTFileTypeMovie); choices[1] = new ExportChoice ('AVI file', StdQTConstants.kQTFileTypeAVI); choices[2] = new ExportChoice ('MPEG-4 file', QTUtils.toOSType('mpg4')); try { // query user for a movie to open QTSessionCheck.check(); QTFile file = QTFile.standardGetFilePreview (QTFile.kStandardQTFileTypes); OpenMovieFile omFile = OpenMovieFile.asRead (file); Movie movie = Movie.fromFile (omFile); // offer a choice of movie exporters JComboBox exportCombo = new JComboBox (choices); JOptionPane.showMessageDialog (null, exportCombo, 'Choose exporter', JOptionPane.PLAIN_MESSAGE); ExportChoice choice = (ExportChoice) exportCombo.getSelectedItem(); // create an exporter MovieExporter exporter = new MovieExporter (choice.subtype); QTFile saveFile =new QTFile (new java.io.File('Untitled')); // do the export movie.setProgressProc(); movie.convertToFile (null, saveFile, StdQTConstants.kQTFileTypeMovie, StdQTConstants.kMoviePlayer, IOConstants.smSystemScript, StdQTConstants.showUserSettingsDialog | StdQTConstants.movieToFileOnlyExport | StdQTConstants.movieFileSpecValid, exporter); // need to explicitly quit (since awt is running) System.exit(0);} catch (QTException qte) { qte.printStackTrace();}} public class ExportChoice {String name; int subtype; public ExportChoice (String n, int st) { name = n; subtype = st; } public String toString() { return name; } }}運行時,程序提示用戶打開一個movie文件。一旦movie裝載了,程序提供一個導出格式選擇對話框。如圖4-2所示。 Figure 4-2. Choice dialog with canned MovieExporter types 然后,顯示一個保存對話框提示導出信息(例如,“轉換為MPEG-4格式)和一個選擇按扭。該按扭關聯一個明確導出格式的對話框。例如,AVI 導出對話框相當簡單,僅僅提供幾個設置供選擇。相反,MPEG-4導出對話框,圖4-3所示,格外的繁瑣,充斥著多種選擇的描述,幫助用戶理解他們的選擇和并會保證他們的導出文件適應MPEG-4的標準。 在用戶做了選擇并按下OK鍵后,比較長的導出過程便開始了。因為movie導出是潛在的計算密集的,每個視頻畫面和每個音頻示例都必須被重新編碼——這個過程之間會出現一個進度框,這樣用戶可以看到導出過程完成了多少,還要花多長時間。剛剛發生了什么?這個程序使用了一個內部類ExportType 封裝一個子類型,整型和一個字符串。很大程度上是為了簡化在格式選擇對話框中使用的JcomboBox 。這些子類型來自StdQTConstants 中定義的常量。一旦做出了選擇,程序將子類型參數傳遞給它的構造器來選擇適當的MovieExporter。下一步,調用setProgressProc()方法請求一個前進對話框。最后,通過調用convertToFile()方法,程序開始執行導出。這個方法需要幾個參數:&#61548; Track ,指明僅僅導出這個軌跡,null代表需要導出所有軌跡。&#61548; QTFile ,導出到的文件。&#61548; 文件類型,如StdQTConstants.kQTFileTypeMovie。&#61548; 一個構造器,如StdQTConstants.kMoviePlayer。&#61548; 一個腳本標簽,典型的是IOConstants.smSystemScript。&#61548; 行為標志。這個例子使用了所有3個有效值:showUserSettingsDialog 讓導出過程調用包含文件名和選擇按扭的保存對話框;movieToFileOnlyExport 限制導出組件的導出選擇格式子類型;movieFileSpecValid 聲明QTFile 是有效的并且應該作為默認在對話中作為默認值使用。&#61548; MovieExporter 用來進行導出。關于…… 用MovieExporter 本身來導出?那是一個可供選擇的辦法。導出器的toFile()方法導出movie到一個文件,而toHandle()方法導出文件到內存。同時也可以僅導出部分movie,比如指定開始時間和持續時間參數。注意要這樣做的話需要不同的程序流程,因為首先你需要得到有效的QTFile (可能是用AWT文件對話框),然后你需要調用導出器的doUserDialog()方法去設定導出。Movie 類的convertToFile()方法能更方便一些,因為,像這兒所看到的,它允許使用默認的前進對話框。當使用MovieExporter 方法時,程序無權訪問默認對話框。在那種情況下,唯一可選的辦法是提供一個自定義的前進對話框和用setProgressProc()方法處理進程回調。也有不好的地方:我試著在windows下導出MPEG-4,但得不到任何音頻選項。當我點擊導出對話框里的音軌菜單,我得到如圖4-4所示的無用的面板。 這不是技術上的問題而是一種合理的情況。Apple 得到了適合它的基于Mac的QuickTime 用戶的MPEG-4的音頻編碼許可,但不適合Windows 用戶。這個編解碼器存在,但顯然你必須就許可條件聯系Dolby ,讓它們適合Windows操作系統。導出movie到任何已安裝的格式 導出到已知格式的列表會受到一些限制——如果終端用戶已經安裝了新的或者來自第三方或者是QuickTime自身更新的movie 導出器,使用固定導出器列表的程序將不能識別他們。幸運的是,QuickTime提供了一個詢問方法可以查詢到關于某個類型目前已經安裝的組件。你可以用這個策略找到所有可用的導出器列表。我如何做那個呢? AdvancedMovieExport 排除了SimpleMovieExport 所用的選擇數組里的3個固定入口改,而通過動態發現來構造數組。這段代碼將代替SimpleMovieExport 構造器里的“build choices代碼塊但需要添加到try-catch內部,因為它可能拋出QTException異常。運行時,支持的導出器列表讓人出乎意料的大,如圖4-5所示。在這種情況下,一個“普通的movie,這將會導出一個video track和一個audio track,這意味著任何只導出audio或audio/video格式都行。 你也應該注意,一些導出器不能導出movie。這些是比較笨的標準: 這些失敗是因為源movie中沒有包含可以導出為這些格式的tracks。源movie有各種不同的tracks時,一些能成功導出,另一些將會失敗。剛剛發生了什么?由子類型尋找組件的過程是非常奇特的。它重復調用“find方法,傳入上一個匹配的組件。這樣做需要一個ComponentDescription來作為模板進行下一次匹配,同時需要一個ComponentIdentifier, 代表特定的組件(并不是該特定的組件的實例)。為了找到movie導出器,用常量movieExporterType來初始化ComponentDescription 模板。靜態ComponentIdentifier.find()方法會尋找匹配的組件,但要求你重復地傳入ComponentDescription 模板以及該方法先前找到的ComponentIdentifier。第一次重復時,將是空值。調用find()方法返回一個ComponentIdentifier,傳遞給MovieExporter 構造器創造一個新的導出。find()返回空時,表明不再有合適的匹配。匹配的ComponentIdentifier 通過getInfo()方法提供了關于它自身的信息。這將會返回另一個ComponentDescription 對象,不同于之前作為模板使用的ComponentDescription對象。你可以利用這個去得到類型和子類型的信息(FOUR_CHAR_CODE ints),名字,消息字符串,制造商代碼等等。找到一個MovieExporter 并不能夠保證它能真正的工作。你可以調用validate()方法,像這個例子這樣,來檢查示例的導出器能夠導出給定的movie。在這個例子中,如果validate()方法拋出異常,它就是非標準的并且導出器沒有被添加到JcomboBox。關于……能否通過程序來設置導出參數,而不是每次都使用導出對話框?這是可能的,盡管需要開發中至少需要使用一次導出對話框。一個配置好了的MovieExporter 經由getExportSettingsFromAtomContainer()方法能夠以AtomContainer對象的形式返回它的配置狀態。 這個AtomContainer對象可以經由setExportSettingsFromAtomContainer()方法傳遞給一個導出器。在單獨的應用程序里,這是非常直接的。為了保證各個sessions之間的持久,你必須在AtomContainer 上調用getBytes()得到本地結構然后把它保存到硬盤,數據庫等。這樣,將來我們能夠重新生成這個配置,將所有字節讀入一個字節數組,從該數組中創造一個QTHandle ,然后將它傳遞給AtomContainer.fromQTHandle()來創建AtomContainer。QuickTime 6.3版引入了一個新API來設置導出器,但是這樣寫,它沒有通過QTJ方法的調用顯示出來。而且,如果我指定類型和子類型,我將總是得到一個匹配嗎?不,在一些情況下,你將得到多重匹配組件,并且你可能需要使用其它的標準來選擇用哪一個。在一個相當經典的case中我的一位技術導師指出了:某些時候用同樣的子類型你得到了不止一個導出器,這個時候你需要用“manufacturer代碼去區分它們。 這特別適用于AIFF導出器——你所找到的第一個導出器類型僅導出MIDI類型。為了導出任意的QT視頻文件到AIFF,你需要明確地迭代并繼續選擇第二個!導入導出圖形QuickTime提供了許多組件來導入導出不同的圖象格式。正如你所期望的,這些組件被封裝在類GraphicsImporter和GraphicsExporter里。GraphicImportExport例示應用程序使用了這兩個類來說明動態的查找輸入導出器。Example 4-3. Graphics import and exportpackage com.oreilly.qtjnotebook.ch04;import quicktime.*;import quicktime.io.*;import quicktime.std.*;import quicktime.std.comp.*;import quicktime.std.image.*;import quicktime.app.view.*;import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.util.Vector;import java.io.*;import com.oreilly.qtjnotebook.ch01.QTSessionCheck;public class GraphicImportExport extends Object { Button exportButton; Frame frame; GraphicsImporter importer; static final int[] imagetypes = { StdQTConstants.kQTFileTypeQuickTimeImage}; /* other interesting values: StdQTConstants.kQTFileTypeGIF, StdQTConstants.kQTFileTypeJPEG, StdQTConstants4.kQTFileTypePNG, StdQTConstants4.kQTFileTypeTIFF StdQTConstants.kQTFileTypeMacPaint, StdQTConstants.kQTFileTypePhotoShop, StdQTConstants.kQTFileTypePICS, StdQTConstants.kQTFileTypePicture, */ public static void main (String[] args) { new GraphicImportExport(); } public GraphicImportExport() { try { QTSessionCheck.check(); QTFile inFile = QTFile.standardGetFilePreview (imagetypes); importer = new GraphicsImporter (inFile); // put image onscreen QTComponent qtc = QTFactory.makeQTComponent (importer); java.awt.Component c = qtc.asComponent(); frame = new Frame ('Imported image'); frame.setLayout (new BorderLayout()); frame.add (c, BorderLayout.CENTER); exportButton = new Button ('Export'); exportButton.addActionListener (new ActionListener() { public void actionPerformed (ActionEvent ae) { try { doExport(); } catch (QTException qte) { qte.printStackTrace(); } } }); frame.add (exportButton, BorderLayout.SOUTH); frame.pack(); frame.setVisible(true); } catch (QTException qte) { qte.printStackTrace(); } } public void doExport() throws QTException { // build list of GraphicExporters Vector choices = new Vector(); ComponentDescription cd = new ComponentDescription ( StdQTConstants.graphicsExporterComponentType); ComponentIdentifier ci = null; while ( (ci = ComponentIdentifier.find(ci, cd)) != null) { choices.add (new ExportChoice (ci.getInfo().getName()ci.getInfo().getSubTyp } // offer a choice of movie exporters JComboBox exportCombo = new JComboBox (choices); JOptionPane.showMessageDialog (frame,exportCombo,'Choose exporter',JOptionPane.PLAIN_MESSAGE); ExportChoice choice = (ExportChoice) exportCombo.getSelectedItem(); System.out.println ('chose ' + choice.name); // build a GE, wire up to the GraphicsImporter GraphicsExporter exporter = new GraphicsExporter (choice.subtype); exporter.setInputGraphicsImporter (importer); // ask for destination, settings FileDialog fd = new FileDialog (frame, 'Save As', FileDialog.SAVE); fd.setVisible(true); String filename = fd.getFile(); if (filename.indexOf('.') == -1) filename = filename + '.' + exporter.getDefaultFileNameExtension(); File file = new File (fd.getDirectory(), filename); exporter.setOutputFile (new QTFile(file)); exporter.requestSettings();// export exporter.doExport(); // need to explicitly quit (since awt is running) System.exit(0); } public class ExportChoice { String name; int subtype; public ExportChoice (String n, int st) { name = n; subtype = st; } public String toString() { return name; } }}運行時,程序顯示一個對話框,選擇要導入的圖形。在Windows環境下,該對話框里的“文件類型是QuickTime圖象。一旦圖象被選定,它和一個“導出按扭一起顯示在窗口中。當用戶點擊該按扭,她會詢問你類型,如圖4-6所示。 之后,程序顯示一個配置對話框指定選定的導出類型——最小值,這個對話框也提供一個顏色深度的選擇(256色,256灰度,百萬像素等等)。下一步,將會出現一個保存對話框, 要求你指定導出文件的位置。一旦通過,程序轉換該圖象到指定的格式,并保存在提供的位置。剛剛發生了什么?注意QTFile.standardGetFilePreview(),它顯示一個文件打開對話框并帶出一串4整型的數字,代表各種文件格式常數的FOUR_CHAR_CODEs,作為可選文件類型的過濾器。你可以利用QTFileTypeQuickTimeImage作為方便的通配符來匹配QuickTime能打開的任何種類的圖象,盡管它看起來僅工作在Windows操作系統上(實際上, 在Mac上,任何文件都可被選中)。給定一個文件,你可以創建一個GraphicsImporter對象將它裝載到QuickTime。為了導入圖片到屏幕上,需要將importer傳給 QTFactory.makeQTComponent()方法,該方法返回一個QTComponent,你可以造型(cast)為一個AWT組件, 或者為了類型安全安全,通過asComponent()方法來轉換為了將圖片導出到另外一種格式,你可以通過創造一個ComponentDescription模板來匹配graphicsExporterComponentType的組件, 來查找導出器的子類型。在例子中,匹配組件的名字將出現在一個JComboBox里。當一個子類型被選中了,傳遞該子類型到GraphicsExporter的構造函數來創建GraphicsExporter對象。GraphicsExporter需要綁定到某類型的圖片源。有了GraphicsImporter,你可以用setInputGraphicsImporter()方法來實現這點。導出器還需要一個目的文件。如果寫出到一個文件,你可以用setOutputFile()來設置它——僅為了安全起見,檢查用戶提供的文件擴展名和導出器用getDefaultFileNameExtension()方法返回的值是明智的。用戶可能想在導出顏色,圖片質量,和其它設置上進行某些改變,這個時候,requestSettings()方法可提供一個對話框。所有這些做完后,你可以用doExport()方法來導出了。關于…有其它的源適合該導出嗎?GraphicsExporter的Javadoc提供了一系列的setInputXXX()方法。在下一章,我們將探討這些問題,包括Picts, QDGraphics,和PixMaps。那么關于導出參數的設置呢?QTJ有一些方法可以代替用戶對話框。像setDepth()和setCompressionMethod()。一個有趣的方法,setTargetDataSize(),讓導出器可以有“quality選擇(像JPEG)找一個值將導致產生一個給定字節大小的文件。發現所有已安裝的組件我希望到這里,你至少對適用于QuickTime的其它組件有了些許的興趣。很容易發現所有的組件,用一個相同的方法我們可以發現各種MovieExporters和GraphicExporters:提供一個ComponentDescription模板,并利用ComponentIdentifier.find()方法。而使用一個空白模板,將會顯示所有的組件。我怎樣做呢?例子4-4發現了所有已安裝的組件并記錄了他們的類型,子類型和描述。Example 4-4. Discovering al instaled componentspackage com.oreilly.qtjnotebook.ch04;import quicktime.*;import quicktime.std.*;import quicktime.std.comp.*;import quicktime.util.QTUtils;import com.oreilly.qtjnotebook.ch01.QTSessionCheck;public class ComponentTour { public static void main (String[] args) { try { QTSessionCheck.check(); /* use this wildcard to show all components in QT */ ComponentDescription wildcard = new ComponentDescription(); ComponentIdentifier ci = null; while ( (ci = ComponentIdentifier.find(ci, wildcard)) != null) { ComponentDescription cd = ci.getInfo(); System.out.println (cd.getName() + ' (' + QTUtils.fromOSType (cd.getType()) + '/' + QTUtils.fromOSType (cd.getSubType()) + } catch (QTException qte) { qte.printStackTrace(); } }}導出結果有幾百行長,像下面這樣:run-ch04-componenttour:[java] Apple MP3 Decoder (adec/.mp3) An AudioCodec that decodes MPEG-1,MPEG-2, MPEG-2.5 Layer III into linear PCM data[java] MPEG-4 AAC Decoder (adec/aac ) An AudioCodec that decodes MPEG-4AAC into linear PCM data [java] Apple Lossless Decoder (adec/alac) An AudioCodec that decodesApple Lossless into linear PCM data [java] Apple IMA4 Decoder (adec/ima4) An AudioCodec that decodes IMA4into linear PCM data[java] MPEG-4 AAC Encoder (aenc/aac ) An AudioCodec that encodes linearPCM data into MPEG-4 AAC [java] Apple Lossless Encoder (aenc/alac) An AudioCodec that encodeslinear PCM data into Apple Lossless[java] Apple IMA4 Encoder (aenc/ima4) An AudioCodec that encodes linearPCM data into IMA4 [java] Applet (aplt/scpt) The component that runs script applications [java] Apple: AUConverter (aufc/conv) AudioConverter unit [java] Apple: AUVarispeed (aufc/vari) Apple's varispeed playback[...]剛剛發生了什么?關鍵點是通過沒有參數的構造器得到ComponentDescriptor的那行。這為ComponentIdentifier. find()方法創建了一個完全的空白模板。當然,如果你僅僅想遍歷特定類型的組件,你可以傳遞一個像StdQTConstants,movieImportType的類型值,限制MovieImporters的查找,這樣,指明QuickTime可以導入的格式類型。證明和解釋每種類型的組件超出了本書的范圍——實際上,在舊的Macintosh series中它們占了大量的篇幅。當然,重要的一些在表4-1中列出來了。注意不是所有的組件都在Java封裝類里。 待續..資源:Matrix Java社區: http://www.matrix.org.cn Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd
標簽: Java
相關文章:
主站蜘蛛池模板: 成人午夜性a一级毛片免费看 | 99re在线| 亚洲日本欧美日韩高观看 | 婷婷午夜激情网 | 久久亚洲黄色 | 人人插人人干 | 午夜视频在线免费观看 | 国产在线精品一区二区三区 | 欧美电影一区二区三区 | 动漫泳衣美女 | 日本高清中文字幕 | 色婷婷综合在线视频 | 99免费精品 | 国产精品视频成人 | 看真人视频a级毛片 | 久久99精品视频 | 亚洲综合二区 | 亚洲国产成人久久 | 午夜精品视频在线观看 | 91成人黄色 | 久久小视频 | 精品国偷自产国产一区 | 日韩欧美精品一区二区三区 | 日韩中文字幕免费视频 | 午夜精品一区二区三区免费视频 | 欧美午夜一区二区三区免费大片 | 少妇激烈床戏视频 | 亚洲视频免费在线 | www.99久 | 亚洲美女视频 | 一级视频网站 | 午夜精品久久久久 | 精品国产91亚洲一区二区三区www | 91免费版在线看 | 欧美激情欧美激情在线五月 | 久久午夜影院 | 九九在线视频 | 日韩一区二区在线观看 | 欧美日韩在线一区 | 亚洲不卡视频在线观看 | 狠狠se| 国产精品久久久久久久久久三级 | 成人小视频在线观看 | 亚洲天天操 | 国产精品xxxx | 久久大陆| 一区二区三区不卡视频 | 五月激情综合网 | 亚洲一区二区三区中文字幕 | 99精品电影 | www.9191| 狠狠艹夜夜艹 | 欧美日韩一区二区三区在线观看 | 亚洲精品第一页 | 99精品欧美一区二区三区 | 少妇看av一二三区 | 欧一区二区 | 久久精品二区 | 日韩福利在线观看 | 日韩视频中文字幕在线观看 | 色视频网站免费看 | 国产在线精品一区二区三区 | 日本五月婷婷 | 亚洲精品二区 | 91.成人天堂一区 | 欧美在线视频播放 | 成人av视 | 国产欧美一区二区视频 | 日韩久久久久 | 99爱视频 | 日日操天天操 | 成人在线免费视频观看 | www日本高清 | 久久久久久亚洲精品 | 成人免费视频网站在线看 | av影片在线 | 久久久xxxx| 欧美在线亚洲 | 久久99精品久久久久久琪琪 | 日本免费一区二区视频 | 国产一区二区免费 | 欧美日韩国产一区二区三区不卡 | 国产性一级片 | 成人欧美一区二区三区黑人孕妇 | 一级免费黄色免费片 | 欧洲成人在线视频 | 国产成人免费视频网站高清观看视频 | 国产精品久久国产精品 | 国产精品视频久久 | 日韩精品在线视频观看 | 亚洲a在线观看 | 国产精品久久精品 | 国产亚洲成av人片在线观看桃 | 日韩第一区 | 91免费观看 | 亚洲一区av| 91精品在线观看入口 | 欧美日韩中文在线 | 艳妇荡乳豪妇荡淫 | 国产一二在线 | 中文字幕丝袜 | 热久久这里只有精品 | 亚洲日本精品视频 | 国产精品日日夜夜 | 久久精品欧美一区二区三区不卡 | 91高清视频在线观看 | 在线黄av| 成人福利网 | 日本好好热视频 | 亚洲男人的天堂网站 | 网站av| 成人在线播放 | 久色视频在线观看 | 成人av一区二区三区 | 香蕉成人啪国产精品视频综合网 | 日韩精品影院 | 国产成人综合在线 | 日韩综合网 | 国产农村妇女精品 | 亚洲伊人久久网 | 日韩欧美国产精品 | 99久久婷婷国产精品综合 | 日本久久久久久 | 一区二区三区四区 | 日本黄色大片 | 久久精品小视频 | 亚洲精品电影在线一区 | 亚洲国产高清高潮精品美女 | 亚洲高清中文字幕 | 在线日韩 | 亚洲三级不卡 | 欧美一区二区大片 | 逼逼av | 一级欧美 | 有码在线| 拍拍无遮挡人做人爱视频免费观看 | 欧美综合一区 | 日韩一区二区在线电影 | 玖玖国产精品视频 | 国产一区二区在线免费观看 | 久免费视频 | 日韩一区二区三区精品 | 成人毛片视频网站 | 北条麻妃国产九九九精品小说 | www.国产在线 | 天天操天操 | 亚洲不卡| 看亚洲a级一级毛片 | 欧美大片一区二区 | 国产中文字幕一区 | 大香萑 | 亚洲成人福利 | 91国产精品入口 | 日韩视频一区 | 亚洲毛片在线观看 | 日本jizz在线观看 | 成人影院在线 | 中文字幕第100页 | 91麻豆精品国产91久久久久 | 午夜成人在线视频 | 日韩一区二区在线视频 | 久久九精品 | 国产福利91精品一区二区 | 日韩欧美亚洲 | 国产毛片在线 | 国产不卡免费视频 | 在线成人国产 | 99视频免费在线观看 | 亚洲高清在线观看视频 | 中文字幕欧美日韩 | 久久久精品久久久 | 黄色国产大片 | 欧美午夜一区二区三区免费大片 | 91玖玖| 日韩精品1区2区3区 成人黄页在线观看 | 一级毛片免费完整视频 | 国产精品久久久久国产a级 国产精品欧美一区二区三区不卡 | 狠狠久久伊人中文字幕 | 亚洲日本国产 | 亚洲卡一| 国产精品对白一区二区三区 | 六月丁香av | 成人精品视频 | 国产精品美女久久久久久久网站 | 精品国产乱码简爱久久久久久 | 成人精品在线视频 | 成人欧美一区二区 | 亚洲精品自在在线观看 | 亚洲欧美aⅴ | 色综合一区二区三区 | 超碰高清 | 日韩精品久久 | 久久久毛片| 日韩视频在线免费观看 | 欧美激情一区二区三区在线观看 | 免费的色网站 | www.麻豆av | 亚洲欧美精品 | 精品久久一级片 | 狠狠搞狠狠操 | 国产精品美女久久久久久久网站 | 欧美日韩精品综合 | 亚洲综合国产 | 草草视频在线免费观看 | a视频在线免费观看 | 久久久精品| 91亚洲精品乱码久久久久久蜜桃 | 香蕉久久夜色精品国产使用方法 | av手机在线播放 | 国产精品免费看 | 欧美日韩在线看 | 日韩污视频在线观看 | 亚洲狠狠爱一区二区三区 | 你懂的免费在线观看 | 一本一道久久精品综合 | 一区二区免费在线视频 | 中文字幕精品一区二区三区精品 | 天天操狠狠操网站 | 欧美日韩亚洲二区 | caoporn免费在线视频 | 久久男人 | 国产一级毛片国语一级 | 天天色天天射天天操 | 欧美激情视频一区二区三区在线播放 | 亚洲精品综合 | 婷婷午夜激情网 | 九九在线视频 | 成人在线播放 | 成人免费一区二区三区视频网站 | 中文字幕在线永久在线视频 | 青青草一区 | 精品国产91 | 欧美手机在线 | 中国大陆高清aⅴ毛片 | www久久久久久久 | 国产高清在线精品一区二区三区 | 午夜在线 | 蜜桃视频网站在线观看 | 国产精品久久久久久吹潮 | 日韩视频在线不卡 | 亚洲综合视频 | 欧美亚洲视频 | 超碰人人插 | 欧美精品欧美精品系列 | a国产视频 | 国产精品手机在线 | 人人人人人你人人人人人 | 亚洲精品在线播放视频 | 欧美日韩电影一区 | 国产成人在线一区 | 黄色影片网址 | 日本精品一区二区在线观看 | 色欧美日韩 | 密室大逃脱第六季大神版在线观看 | 色视频www在线播放国产人成 | 亚洲狠狠久久综合一区77777 | 在线日韩视频 | 日韩一区二区在线观看视频 | 亚洲精品视频免费看 | 成人精品鲁一区一区二区 | 亚洲一级在线观看 | 精品久久久久久久久久久 | 久久国产精品99久久久久久老狼 | 亚洲一区不卡在线 | 特级av | 欧洲成人午夜免费大片 | 羞羞视频网站在线看 | 欧美午夜一区二区三区 | av三级 | 国产精品成人一区二区三区 | 热久久国产 | 亚洲网在线 | 最新国产视频 | 中文字幕亚洲欧美 | 欧美一级免费高清 | 日本成人中文字幕 | 精品久久久久久久久久 | 国产免费一区二区三区 | 色婷婷基地 | 国产伦精品一区二区三区照片91 | 91久久夜色精品国产网站 | 在线视频久 | 性毛片| 久久精品国产亚洲一区二区三区 | 欧美久久精品 | 欧美一区二区三区精品 | 日韩av电影在线免费观看 | 人人草人人 | 日本一区二区不卡 | 福利久久久 | 一级在线观看视频 | 精品一区二区在线观看 | 国产99久久精品 | 久久久久国产精品午夜一区 | 亚洲免费在线观看视频 | 日日操视频 | 久久国产综合 | 国产日韩欧美在线 | 亚洲欧美日本在线 | 欧美日韩久久精品 | 久久久久香蕉视频 | 毛片网站大全 | 精品三级在线观看 | 大桥未久亚洲精品久久久强制中出 | 亚洲乱码国产乱码精品精的特点 | 日韩中文字幕av | 成人在线精品视频 | 精品国产乱码一区二区三 | 午夜精品久久久久久久白皮肤 | 成人久久久| 97久久久| 久久久精品一区二区 | 亚洲网站在线观看 | 久久亚洲一区二区 | 日韩电影中文字幕 | 午夜在线观看 | 在线观看日韩精品 | 欧美一区二区三区 | 久久久久免费精品视频 | 久久久久久国产精品 | 日韩www视频 | 国产精品午夜电影 | 91精品国产综合久久久久久软件 | 天天澡天天狠天天天做 | 亚洲精品在线播放 | 精品视频在线观看一区二区三区 | 国产精品久久久久婷婷二区次 | 国产亚洲一区二区三区在线观看 | 99久久婷婷国产综合亚洲 | 久久一区二区视频 | 日韩成人小视频 | 日韩精品一区二区三区在线观看 | 欧美日韩在线免费观看 | 久久精品小视频 | 激情欧美日韩一区二区 | 国产成人精品久久二区二区 | 国产精品日本一区二区不卡视频 | aaa在线观看| 成人免费在线电影 | 日本不卡一区二区三区在线观看 | 91精品国产综合久久久久久 | 综合一区 | 一区二区国产精品 | 亚洲国产精品视频 | 欧美日韩不卡 | 国产欧美久久久久久 | 国产视频色 | 国产亚洲精品成人av久久影院 | 日本美女影院 | 欧美炮房| 日韩精品一区二区三区在线 | 日韩欧美在线观看视频 | 一级毛片网 | 日韩中文字幕av | 国产一区精品在线 | 国产一级电影网 | 亚洲精品电影 | 午夜精品一区二区三区在线播放 | 91精品一区二区三区久久久久久 | 亚洲国产精品99久久久久久久久 | 亚洲一区二区三区在线播放 | 9久久精品 | 国产精品欧美一区二区 | 91久久91久久精品免观看 | 国产精品毛片无码 | 久久9久久| 成人国产精品视频 | 久久久精品综合 | 97视频观看| 91亚洲视频 | 一区二区三区欧美在线 | 午夜国产在线 | 国产精品资源在线 | 亚洲黄页| 91精品国产综合久久香蕉922 | 国内精品一级毛片国产99 | 国产精品久久嫩一区二区 免费 | 欧美日韩国产综合视频 | 九草在线 | 欧美簧片在线 | 日韩欧美在线播放 | 亚洲精品自拍视频 | 色呦呦网站在线观看 | 中文字幕高清一区 | 午夜精品一区二区三区免费视频 | 欧美日韩一区二区三区四区 | 成人午夜视频在线观看 | 国产人成精品一区二区三 | 中文字幕在线观看亚洲 | 亚洲视频一区 | 精品在线一区二区 | 欧美日韩亚洲在线 | 色5月婷婷丁香六月 | 亚洲性人人天天夜夜摸 | 在线成人一区 | 国产精品毛片久久久久久久 | 日本黄色a级 | 一级片在线观看视频 | 久久国产精品久久久久久 | 国产免费av网站 | 91影院| 欧美自拍一区 | 青青草一区| 成人在线手机版视频 | www视频在线观看 | 日韩中文字幕一区 | 国产精品女同一区二区久久夜 | 九九九色 | 少妇性l交大片免费一 | 伊人狠狠干 | 亚洲精品资源在线观看 | 人人99| 午夜视频在线观看网站 | www.国产精品| 久久久久久国产精品久久 | 国产一区| 国产精品不卡视频 | 国产精品污www在线观看 | 国产乱码精品一区二区三 | 欧美日韩国产一区二区在线观看 | 国产成人精品一区二 | a久久久久久 | 草久在线视频 | 欧美亚洲专区 | 91久久夜色精品国产网站 | 一区视频在线 | 91福利视频导航 | 日韩欧美在线一区 | 日韩二三区 | 日本一区二区不卡 | 亚洲精品一区二区三区在线 | 亚洲精品国产精品国自产 | 91av视频在线 | 欧美成人一区二区三区片免费 | 国产综合网站 | 久久久网 | 国产成人在线一区二区 | 精品久久久久久久久久久 | 国产中文一区 | 99热精品视 | 欧美日韩久久精品 | 国产裸体永久免费视频网站 | 成人精品在线视频 | 黄瓜av| 免费国产wwwwwww网站 | 在线小视频 | 国产精品亚洲一区二区三区在线 | 欧美成人免费 | 欧美日韩激情一区二区三区 | av在线官网 | 亚洲精美视频 | 日韩99| 99热在线播放 | 欧美国产精品一区二区三区 | 亚洲一区二区三区免费视频 | 一区二区在线免费观看 | 久久国产综合 | 99久久婷婷国产综合精品 | 91精品国产自产精品男人的天堂 | 天天碰天天操 | av久久| 成人一级毛片 | 伊人免费视频 | 欧美成人精品一区二区三区 | 亚洲在线视频 | 久久国产精品久久 | 国产精品视频播放 | 中文字幕在线免费视频 | 日韩视频在线观看不卡 | 久久久久亚洲美女啪啪 | 欧美日韩激情在线一区二区三区 | av一区在线| av网站在线免费观看 | 99国内精品久久久久久久 | 国产在线综合网 | 欧洲成人午夜免费大片 | 欧美日韩在线观看一区二区三区 | 国产在线二区 | 亚洲电影一区二区 | 国产区久久 | 欧美一区二区三区精品 | 亚洲成人第一区 | 久草福利资源 | 欧美成人高清 | 色婷婷久久久久swag精品 | 成人网18免费网站 | 午夜影视| 97超碰青青草 | 91视频.www | 在线播放亚洲 | 男女国产网站 | 久久久久久亚洲 | 伊人狠狠干 | 免费看a | 欧美高清视频在线观看 | 永久91嫩草亚洲精品人人 | 一区福利 | 美女久久 | 国产成人精品免高潮在线观看 | 天天拍天天干天天操 | 日韩啊啊啊 | 国产精品国产 | 中文字幕第80页 | 国产中文视频 | 国产性一级片 | 91麻豆精品国产91久久久更新资源速度超快 | a级在线观看免费 | 国产精品成人久久久久 | 国产欧美精品 | 午夜av电影 | 欧美在线国产 | 国产成人av网站 | 一区二区日韩 | 亚洲精品二区 | 欧美高清视频一区 | 永久91嫩草亚洲精品人人 | 黄色网址大全在线观看 | 久久伊99综合婷婷久久伊 | 可以免费在线观看av的网站 | 粉嫩视频在线观看 | 亚洲欧美一区二区在线观看 | 国产亚洲久久 | 日韩在线播放一区二区三区 | 成人av网站在线 | 欧美日韩在线成人 | 亚洲一区二区三区免费 | 日韩在线视频观看 | 男人的天堂在线视频 | 免费av一区 | 国产乱淫av片 | 久一久久 | 97影院在线午夜 | 99精品免费 | 97伦理电影院 | 一区二区在线免费观看 | 黄网站涩免费蜜桃网站 | 日本免费一区二区三区 | 中文字幕精品一区久久久久 | 在线三级电影 | 国产精品三级久久久久久电影 | 涩涩视频大全 | 中文字幕三区 | 亚洲第一福利视频 | 精品国产一区二区三区久久久蜜臀 | 青青草日韩 | 日韩性xxx| 人人干天天干 | 亚洲综合色自拍一区 | 日本黄a三级三级三级 | 中文字幕日韩欧美一区二区三区 | 国产成人精品在线观看 | 国产成人综合一区 | 精品一区二区三区三区 | 日韩精品小视频 | 亚洲xxxx3d | 欧美黄色一区二区 | 欧美成视频| 亚洲美女在线视频 | 中国av在线 | 91久久精品一区二区别 | 精品久久久久一区二区三区 | 伊人伊人伊人 | 国产精品丝袜一区二区 | 午夜噜噜噜 | 97国产一区二区精品久久呦 | 青草福利 | 午夜免费片 | 中文字幕在线第一页 | 人人干天天干 | 国产精品九九九 | 国产成人一区二区三区 | 97国产免费| 国产精品日韩欧美一区二区 | 欧美黑人一级毛片 | 成人在线小视频 | 日韩av成人 | 在线观看午夜免费视频 | 91av在线不卡| 91亚洲高清 | 日本久久精品视频 | 国产亚洲精品精品国产亚洲综合 | 中文字幕视频在线观看 | 亚洲欧美激情视频 | 日本天天操 | 五月婷婷天 | 欧美在线一区二区三区 | 精品一区二区在线播放 | 91久久久久久久久久久 | 国产精品一区二区av | 成人在线观看免费视频 | a久久久久久 | 色综合久 | 欧美高清视频一区 | 在线观看亚洲一区 | 国产免费拔擦拔擦8x高清在线人 | 婷婷久久五月 | 超碰97免费在线 | 久久精品成人一区二区三区蜜臀 | 精品久久久久久久久福利 | 欧美视频在线观看一区 | caoporn免费在线视频 | 久久精品欧美电影 | 探花在线观看 | 国产精品二区三区 | 亚洲精品日韩激情在线电影 | 日本亚洲最大的色成网站www | 午夜小影院 | 中文字幕精品一区二区三区精品 | 岛国av一区| 日韩超级大片免费看国产国产播放器 | 亚洲国内精品 | 成人在线播放网站 | 久久精品成人免费视频 | a在线免费观看 | 99爱在线观看 |