導航:首頁 > 知識科普 > io都有哪些方法

io都有哪些方法

發布時間:2022-06-29 02:18:10

㈠ java io流的典型使用方式有幾種

Java中IO流分成兩大類,

一種是輸入流,所有的輸入流都直接或間接繼承自InputStream抽象類,輸入流作為數據的來源,我們可以通過輸入流的read方法讀取位元組數據;

另一種是輸出流,所有的輸出流都直接或間接繼承自OutputStream抽象類,輸出流接收數據,可以通過write方法寫入位元組數據。


Java的IO流類中,大部分的輸入流和輸出流都是成對存在的,即如果存在XXXInputStream,那麼就存在XXXOutputStream,反之亦然。SequenceInputStream和StringBufferInputStream是特例,沒有對應的SequenceOutputStream類和StringBufferOutputStream類,許多IO操作都可能會拋出IOException異常,比如read、write、close操作。

以下是Java的IO流中常見的輸入流,由於每個輸入流都有其對應的輸出流,所以此處就不再列出輸出流的繼承結構圖。



1、ByteArrayInputStream & ByteArrayOutputStream:

ByteArrayInputStream構造函數中需要傳入一個byte數組作為數據源,當執行read操作時,就會從該數組中讀取數據,正如其名,是一種基於位元組數組實現的一種簡單輸入流,顯而易見的是,如果在構造函數中傳入了null作為位元組數據,那麼在執行read操作時就會出現NullPointerException異常,但是在構造函數初始化階段不會拋出異常;與之相對應的是ByteArrayOutputStream,其內部也有一個位元組數組用於存儲write操作時寫入的數據,在構造函數中可以傳入一個size指定其內部的byte數組的大小,如果不指定,那麼默認它會將byte數組初始化為32位元組,當持續通過write向ByteArrayOutputStream中寫入數據時,如果其內部的byte數組的剩餘空間不能夠存儲需要寫入的數據,那麼那麼它會通過調用內部的ensureCapacity
方法對其內部維護的byte數組進行擴容以存儲所有要寫入的數據,所以不必擔心其內部的byte數組太小導致的IndexOutOfBoundsException之類的異常。

2、FileInputStream & FileOutputStream

FileInputStream 能夠將文件作為數據源,讀取文件中的流,通過File對象或文件路徑等初始化,在其構造函數中,如果傳入的File對象(或與其相對應的文件路徑所表示的File對象)不存在或是一個目錄而不是文件或者由於其他原因無法打開讀取數據,都會導致在初始化階段導致拋出FileNotFoundException異常;與FileInputStream 相對應的是FileOutputStream,可以通過FileOutputStream向文件中寫入數據,也需要通過File對象或文件路徑對其初始化,如同FileInputStream ,如果傳入的File對象(或與其相對應的文件路徑所表示的File對象)是一個目錄而不是文件或者由於其他原因無法創建該文件寫入數據,都會導致在初始化階段拋出FileNotFoundException異常。

3、PipedInputStream & PipedOutputStream

PipedInputStream和PipedOutputStream一般是結合使用的,這兩個類用於在兩個線程間進行管道通信,一般在一個線程中執行PipedOutputStream 的write操作,而在另一個線程中執行PipedInputStream的read操作。可以在構造函數中傳入相關的流將PipedInputStream 和PipedOutputStream 綁定起來,也可以通過二者的connect方法將二者綁定起來,一旦二者進進行了綁定,那麼PipedInputStream的read方法就會自動讀取PipedOutputStream寫入的數據。PipedInputStream的read操作是阻塞式的,當執行PipedOutputStream的write操作時,PipedInputStream會在另一個線程中自動讀取PipedOutputStream寫入的內容,如果PipedOutputStream一直沒有執行write操作寫入數據,那麼PipedInputStream的read方法會一直阻塞PipedInputStream的read方法所運行的線程直至讀到數據。單獨使用PipedInputStream或單獨使用PipedOutputStream時沒有任何意義的,必須將二者通過connect方法(或在構造函數中傳入對應的流)進行連接綁定,如果單獨使用其中的某一個類,就會觸發IOException: Pipe Not Connected.

4、ObjectInputStream & ObjectOutputStream

ObjectOutputStream具有一系列writeXXX方法,在其構造函數中可以摻入一個OutputStream,可以方便的向指定的輸出流中寫入基本類型數據以及String,比如writeBoolean、writeChar、writeInt、writeLong、writeFloat、writeDouble、writeCharts、writeUTF等,除此之外,ObjectOutputStream還具有writeObject方法。writeObject方法中傳入的類型必須實現了Serializable介面,從而在執行writeObject操作時將對象進行序列化成流,並將其寫入指定的輸出流中。與ObjectOutputStream相對應的是ObjectInputStream,ObjectInputStream有與OutputStream中的writeXXX系列方法完全對應的readXXX系列方法,專門用於讀取OutputStream通過writeXXX寫入的數據。

5、SequenceInputStream

SequenceInputStream 主要是將兩個(或多個)InputStream在邏輯上合並為一個InputStream,比如在構造函數中傳入兩個InputStream,分別為in1和in2,那麼SequenceInputStream在讀取操作時會先讀取in1,如果in1讀取完畢,就會接著讀取in2。在我們理解了SequenceInputStream 的作用是將兩個輸入流合並為一個輸入流之後,我們就能理解為什麼不存在對應的SequenceOutputStream 類了,因為將一個輸出流拆分為多個輸出流是沒有意義的。

6、StringBufferInputStream

StringBufferInputStream允許通過在構造函數中傳入字元串以讀取位元組,在讀取時內部主要調用了String的charAt方法。與SequenceInputStream類似,StringBufferInputStream也沒有對應的OutputStream,即不存在StringBufferOutputStream類。Java沒有設計StringBufferOutputStream類的理由也很簡單,我們假設StringBufferOutputStream存在,那麼StringBufferOutputStream應該是內部通過執行write操作寫入數據更新其內部的String對象,比如有可能是通過StringBuilder來實現,但是這樣做毫無意義,因為一旦我們String的構造函數中可以直接傳入位元組數組構建字元串,簡單明了,所以設計StringBufferOutputStream就沒有太大的必要了。StringBufferInputStream這個類本身存在一點問題,它不能很好地將字元數組轉換為位元組數組,所以該類被Java標記為廢棄的(Deprecated),其官方推薦使用StringReader作為代替。

7、FilterInputStream & FilterOutputStream

FilterInputStream包含了其他的輸入流,說具體點就是在其構造函數中需要傳入一個InputStream並將其保存在其名為in的欄位中,FilterInputStream只是簡單的覆蓋了所有的方法,之所說是簡單覆蓋是因為在每個覆蓋函數中,它只是調用內部的保存在in欄位中的InputStream所對應的方法,比如在其覆蓋read方法時,內部只是簡單調用了in.read()方法。FilterInputStream的子類可以進一步覆蓋某些方法以保持介面不變的情況下實現某一特性(比如其子類有的可以通過使用緩存優化讀取的效率)或者提供一些其他額外的實用方法。所以在使用時FilterInputStream可以讓傳入的InputStream具有一些額外的特性,即對構造函數傳入的InputStream進行了一層包裹,使用了典型的裝飾著模式,如果只看FilterInputStream本身這一個類的話,則該類自己本身意義不大,因為其只是通過內部的欄位in簡單覆寫某些方法。但是如果將FilterInputStream 和其子類結合起來使用話,那麼就很有用了。比如FilterInputStream 有兩個子類BufferedInputStream和DataInputStream,這兩個類在下面還會詳細介紹。BufferedInputStream對read操作做了優化,每次讀操作時都讀取一大塊數據,然後將其放入內部維護的一個位元組數組緩沖區中。當外面調用BufferedInputStream的read方法時,首先去該緩沖區中讀取數據,這樣就避免了頻繁的實際的讀操作,BufferedInputStream對外沒有暴露額外的其他方法,但是其內部的read方法已經經過優化了,所以在執行讀操作的時候效率更高。DataInputStream與ObjectInputStream有點類似,可以通過一些readXXX方法讀取基本類型的數據,這是非常有用的一些方法。

8、BufferedInputStream & BufferedOutputStream

如上面所介紹的那樣,在BufferedInputStream的構造函數中需要傳入一個InputStream, BufferedInputStream內部有一個位元組數組緩沖區,每次執行read操作的時候就從這buf中讀取數據,從buf中讀取數據沒有多大的開銷。如果buf中已經沒有了要讀取的數據,那麼就去執行其內部綁定的InputStream的read方法,而且是一次性讀取很大一塊數據,以便填充滿buf緩沖區。緩沖區buf的默認大小是8192位元組,也就是8K,在構造函數中我們也可以自己傳入一個size指定緩沖區的大小。由於我們在執行BufferedInputStream的read操作的時候,很多時候都是從緩沖區中讀取的數據,這樣就大大減少了實際執行其指定的InputStream的read操作的次數,也就提高了讀取的效率。與BufferedInputStream 相對的是BufferedOutputStream。在BufferedOutputStream的構造函數中我們需要傳入一個OutputStream,這樣就將BufferedOutputStream與該OutputStream綁定在了一起。BufferedOutputStream內部有一個位元組緩沖區buf,在執行write操作時,將要寫入的數據先一起緩存在一起,將其存入位元組緩沖區buf中,buf是有限定大小的,默認的大小是8192位元組,即8KB,當然也可以在構造函數中傳入size指定buf的大小。該buf只要被指定了大小之後就不會自動擴容,所以其是有限定大小的,既然有限定大小,就會有被填充完的時刻,當buf被填充完畢的時候會調用BufferedOutputStream的flushBuffer方法,該方法會通過調用其綁定的OutputStream的write方法將buf中的數據進行實際的寫入操作並將buf的指向歸零(可以看做是將buf中的數據清空)。如果想讓緩存區buf中的數據理解真的被寫入OutputStream中,可以調用flush方法,flush方法內部會調用flushBuffer方法。由於buf的存在,會大大減少實際執行OutputStream的write操作的次數,優化了寫的效率。

㈡ Java幾種常用的IO寫法與效率比較

Java中經常會用到迭代列表數據的情況,本文針對幾種常用的寫法進行效率比較。雖然網上已經有了類似的文章,但是對他們的結論並不認同。常見的實現方法:1.for循環:for(int i = 0; i < list.size(); i++) for(int i = 0, size = list.size(); i < size; i++) 一般人都會認為第二種寫法效率高。
2.foreach:for(Object obj : list) 這是一種簡潔的寫法,只能對列表進行讀取,無法修改。
3.while:int size = list.size(); while(size-- > 0) 4.迭代:
Object iter = list.iterator(); while(iter.hasNext()) { iter.next(); }測試代碼: 針對以上幾種方法編寫的測試代碼。 public static void main(String[] args) { List list = new ArrayList(); int runTime = 1000;//執行次數 for (int i = 0; i < 1000 * 1000; i++) { list.add(i); } int size = list.size(); long currTime = System.currentTimeMillis();//開始分析前的系統時間 //基本的for for(int j = 0; j < runTime; j++) { for (int i = 0; i < size; i++) { list.get(i); } } long time1 = System.currentTimeMillis(); //foreach for(int j = 0; j < runTime; j++) { for (Integer integer : list) { } } long time2 = System.currentTimeMillis(); for(int j = 0; j < runTime; j++) { //while int i = 0 ; while(i < size){ list.get(i++); } } long time3 = System.currentTimeMillis(); for(int j = 0; j < runTime; j++) {//普通for循環 for (int i = 0; i < list.size(); i++) { list.get(i); } } long time4 = System.currentTimeMillis(); for(int j = 0; j < runTime; j++) {//迭代 Iterator iter = list.iterator(); while(iter.hasNext()) { iter.next(); } } long time5 = System.currentTimeMillis(); long time = time1 - currTime ; System.out.print("use for:" + time); time = time2 - time1; System.out.print("\tuse foreach:" + time); time = time3 - time2; System.out.print("\tuse while:" + time); time = time4 - time3; System.out.print("\tuse for2:" + time); time = time5 - time4; System.out.print("\tuse iterator:" + time); System.out.println(); }輸出結果(JDK1.6):1.use for:8695 use foreach:17091 use while:6867 use for2:7741 use iterator:14144
2.use for:8432 use foreach:18126 use while:6905 use for2:7893 use iterator:139763.use for:8584 use foreach:17177 use while:6875 use for2:7707 use iterator:14345
結論:1.針對列表的 foreach的效率是最低:耗時是普通for循環的2倍以上。個人理解它的實現應該和iterator相似。2. list.size()的開銷很小:list.size()次數多少對效率基本沒有影響。查看ArrayList的實現就會發現,size()方法的只是返回了對象內的長度屬性,並沒有其它計算,所以只存在函數調用的開銷。對數組的測試:將代碼中的列表list換做數組再進行測試(iterator不適用),發現耗時基本為0。說明:
3. 列表的get()方法開銷不少應該主要是檢測數據合法性時產生的。將執行次數增加100萬倍,這時可以看出結果基本相等,並沒有明顯的差異。說明:4. 數組length也沒有開銷可見數組長度並不是每次執行的時候都要計算的。聯想一下Java創建數組的時候要求必須指定數組的長度,編譯處理的時候顯然沒有把這個值拋棄掉。網上有一篇類似的文章,它居然得出了一個foreach執行效率最高的結論。

㈢ 西門子讀取職能io設備數據的有哪些方法

1.新建一個數據塊,假設用來存放第三方設備數據.2 .在新建的數據塊中新建幾個word(int也可以)變數,假設為第三方設備對接數據。然後點擊工具欄中的「編譯」按鈕。3 .新建一個監控表,用來修改變數值。此表假設用來檢測第三方設備的狀態發生改變。4 .打開模擬,未修改變數值的情況下,M 點輸出為0.5. 將修改值寫入,監控OB1 程序變化。此時可以看到程序段都有輸出。

㈣ 計算機的I/O過程中的編址方式有哪些各有什麼特點

I/O介面獨立編址方式這種編址方式是將存儲器地址空間和I/O介面地址空間分開設置,互不影響。設有專門的輸入指令(IN)和輸出指令(OUT)來完成I/O操作,2、I/O介面與存儲器統一編址方式這種編址方式不區分存儲器地址空間和I/O介面地址空間,把所有的I/O介面的埠都當作是存儲器的一個單元對待,每個介面晶元都安排一個或幾個與存儲器統一編號的地址號。也不設專門的輸入/輸出指令,所有傳送和訪問存儲器的指令都可用來對I/O介面操作。兩種編址方式有各自的優缺點,獨立編址方式的主要優點是內存地址空間與I/O介面地址空間分開,互不影響,解碼電路較簡單,並設有專門的I/O指令,所編程序易於區分,且執行時間短,快速性好。其缺點是只用I/O指令訪問I/O埠,功能有限且要採用專用I/O周期和專用的I/O控制線,使微處理器復雜化。統一編址方式的主要優點是訪問內存的指令都可用於I/O操作,數據處理功能強;同時I/O介面可與存儲器部分公用解碼和控制電路。其缺點是:I/O介面要佔用存儲器地址空間的一部分;因不用專門的I/O指令,程序中較難區分I/O操作

㈤ java 提供了哪些IO方式

Java IO 方式有很多種,基於不同的 IO 抽象模型和交互方式,可以進行簡單區分。
首先,傳統的 java.io 包,它基於流模型實現,提供了我們最熟知的一些 IO 功能,比如 File 抽象、輸入輸出流等。交互方式是同步、阻塞的方式,也就是說,在讀取輸入流或者寫入輸出流時,在讀、寫動作完成之前,線程會一直阻塞在那裡,它們之間的調用是可靠的線性順序。
java.io 包的好處是代碼比較簡單、直觀,缺點則是 IO 效率和擴展性存在局限性,容易成為應用性能的瓶頸。
很多時候,人們也把 java.net 下面提供的部分網路 API,比如 Socket、ServerSocket、HttpURLConnection 也歸類到同步阻塞 IO 類庫,因為網路通信同樣是 IO 行為。
第二,在 Java 1.4 中引入了 NIO 框架(java.nio 包),提供了 Channel、Selector、Buffer 等新的抽象,可以構建多路復用的、同步非阻塞 IO 程序,同時提供了更接近操作系統底層的高性能數據操作方式。
第三,在 Java 7 中,NIO 有了進一步的改進,也就是 NIO 2,引入了非同步非阻塞 IO 方式,也有很多人叫它 AIO(Asynchronous IO)。非同步 IO 操作基於事件和回調機制,可以簡單理解為,應用操作直接返回,而不會阻塞在那裡,當後台處理完成,操作系統會通知相應線程進行後續工作。

㈥ I/O設備的控制方式有幾種

1、程序控制方式

2、中斷驅動方式

3、直接內存訪問方式

4、通道控制方式

(6)io都有哪些方法擴展閱讀:

現代計算機系統中配置了大量的外圍設備,即I/O設備。依據它們的工作方式的不同,通常進行如下分類:

(1)字元設備用戶通過這些設備實現與計算機系統的通信。它們大多是以字元為單位發送和接受數據的,數據通信的速度比較慢。例如,鍵盤和顯示器為一體的字元終端、列印機、掃描儀、包括滑鼠等,還有早期的卡片和紙帶輸入和輸出機。含有顯卡的圖形顯示器的速度相對較快,可以用來進行圖像處理中的復雜圖形的顯示。

(2)塊設備用戶通過這些設備實現程序和數據的長期保存。與字元設備相比,它們是以塊為單位進行傳輸的,如磁碟、磁帶和光碟等。塊的常見尺寸為512~32768B之間。

㈦ I/O控制方式有哪幾種

I/O控制方式主要有程序查詢方式、中斷方式、DMA方式和I/O通道控制方式。

  1. 程序查詢方式也稱為程序輪詢方式,該方式採用用戶程序直接控制主機與外部設備之間輸入/輸出操作。CPU必須不停地循環測試I/O設備的狀態埠,當發現設備處於准備好(Ready)狀態時,CPU就可以與I/O設備進行數據存取操作。

  2. 中斷方式。當I/O設備結束(完成、特殊或異常)時,就會向CPU發出中斷請求信號,CPU收到信號就可以採取相應措施。當某個進程要啟動某個設備時,CPU就向相應的設備控制器發出一條設備I/O啟動指令,然後CPU又返回做原來的工作。

  3. DMA(直接內存存取)方式。DMA方式也稱為直接主存存取方式,其思想是:允許主存儲器和I/O設備之間通過「DMA控制器(DMAC)」直接進行批量數據交換,除了在數據傳輸開始和結束時,整個過程無須CPU的干預。

  4. I/O通道控制方式。通道(Channel)也稱為外圍設備處理器、輸入輸出處理機,是相對於CPU而言的。是一個處理器。也能執行指令和由指令的程序,只不過通道執行的指令是與外部設備相關的指令。是一種實現主存與I/O設備進行直接數據交換的控制方式。

拓展資料:

i/o系統即輸入輸出系統,操作系統中負責管理輸入輸出設備的部分稱為i/o系統,完成設備管理功能,包括外設編址,數據通路的建立,向主機提供外設的狀態信息等。i/o系統的組成有:i/o設備,設備控制器及i/o操作有關的軟硬體。

參考資料:網路I/O系統

㈧ io設備有哪些編址方式,各有何特點

1.獨立編址方式的主要優點是內存地址空間與I/O介面地址空間分開,互不影響,解碼電路較簡單,並設有專門的I/O指令,所編程序易於區分,且執行時間短,快速性好。

其缺點是只用I/O指令訪問I/O埠,功能有限且要採用專用I/O周期和專用的I/O控制線,使微處理器復雜化。

2.統一編址方式的主要優點是訪問內存的指令都可用於I/O操作,數據處理功能強;同時I/O介面可與存儲器部分公用解碼和控制電路。

其缺點是:I/O介面要佔用存儲器地址空間的一部分;因不用專門的I/O指令,程序中較難區分I/O操作。

㈨ i/o 埠的定址方式有幾種 各有何特點

i/o 埠的定址方式有5種分別是直接定址、寄存器間接定址、相對定址、基址變址定址和相對基址變址定址。

形成操作數的有效地址的方法稱為操作數的定址方式。由於大型機、小型機、微型機和單片機結構不同,從而形成了各種不同的操作數定址方式。



(9)io都有哪些方法擴展閱讀:

變址定址方式與基址定址方式計算有效地址的方法很相似,它把CPU中某個變址寄存器的內容與偏移量D相加來形成操作數有效地址。

但使用變址定址方式的目的不在於擴大定址空間,而在於實現程序塊的規律變化。為此,必須使變址寄存器的內容實現有規律的變化(如自增1、自減1、乘比例系數)而不改變指令本身,從而使有效地址按變址寄存器的內容實現有規律的變化。

㈩ 單片機i/o數據傳送有哪幾種方式分別在哪幾個場合下使用

3種傳送方式:
(1) 同步傳送方式:當外設速度可與單片機速度相比擬時,常常採用同步傳送方式。
(2) 查詢傳送方式:查詢傳送方式又稱為有條件傳送,也稱非同步傳送。單片機通過查詢得知外設准備好後,再進行數據傳送。非同步傳送的優點是通用性好,硬體連線和查詢程序十分簡單,但是效率不高。
(3) 中斷傳送方式:中斷傳送方式是利用單片機本身的中斷功能和I/O介面的中斷功能來實現I./O數據的傳送。單片機只有在外設准備好後,發出數據傳送請求,才中斷主程序,而進入與外設進行數據傳送的中斷服務程序,進行數據的傳送。中斷服務完成後又返回主程序繼續執行。因此,中斷方式可大大提高工作效率。

閱讀全文

與io都有哪些方法相關的資料

熱點內容
控制感染最簡單的有效方法 瀏覽:269
公差測量有幾種測量方法 瀏覽:472
績效考核的內容和方法有哪些 瀏覽:17
最簡單的技術升壓方法 瀏覽:523
民航商業方法類知識產權有哪些 瀏覽:882
bbs的使用方法 瀏覽:980
mac版優酷下載的視頻在哪裡設置方法 瀏覽:361
蘋果7揚聲器哪裡設置方法 瀏覽:197
河北美術計算方法有哪些 瀏覽:816
新風管風量計算方法 瀏覽:427
電燈遙控器電池安裝方法 瀏覽:600
金珠的檢測方法 瀏覽:328
水波的計算方法 瀏覽:591
木耳怎麼保存方法 瀏覽:650
論文常見的問題以及解決方法 瀏覽:73
拔自己的牙有什麼方法 瀏覽:129
電腦裁線機操作方法 瀏覽:522
水泵葉輪外圓磨損的修理方法如何 瀏覽:97
文竹的養殖方法大全圖片 瀏覽:29
hiv快速檢測方法及應用 瀏覽:397