1. 程式人生 > >15.輸入和輸入(I&O)

15.輸入和輸入(I&O)

我這些學習筆記,記錄的都是我自己認為的知識點,可能以後再看的時候還要翻書,但是可以用來定位到準確的書中示例的位置,減少翻書重找的時間,利於自身知識體系的搭建。                   self-transcendence

第15章 I/O

15.1 流概述

流是一組有序的資料序列,根據操作的型別,可分為輸入流和輸出流。I/OInput/Putput)流提供了一條通道程式,可以使用這條通道把源中的位元組序列送到目的地。雖然I/O流通常與磁碟檔案存取有關,但是程式的源和目的地也可以是鍵盤、滑鼠、記憶體或顯示器視窗等。

Java由資料流處理輸入/輸出模式,程式從指向源的輸入流中讀取源中的資料,源可以使檔案、網路、壓縮包或其他資料來源。

輸出流的指向是資料要到達的目的地,程式通過向輸入流中寫入資料把資訊傳遞到目的地,輸出流的目標可以使檔案、網路、壓縮包、控制檯和其他資料輸出目標

---------------------------------------------------------------------

15.2 輸入/輸出流

Java定義了許多專門負責各種方式的輸入/輸出,這些類都放在java.io包中。其中,所有輸入流類都是抽象類InputStream(位元組輸入流)或抽象類Reader(字元輸出流)的子類;而所有輸出流都是抽象類OutputStream(位元組輸出流)或者抽象類Writer(字元輸出流)的子類。

15.2.1 輸入流

InputStream類是位元組輸入流的抽象類,是所有位元組輸入流的父類。

該類中所有方法遇到錯誤時都會引發IOException異常。

A. read():從輸入流中讀取資料的下一個位元組。返回0-255範圍內的int位元組值。如果因為已經達到流末尾而沒有可用的位元組,則返回-1

B. read(byte[] b):從輸入流中讀入一定長度的位元組,並以整數的形式返回位元組數。

C. mark(int i):在輸入流當前位置放置一個標記,i引數告知此輸入流在標記位置失效之前允許讀取的位元組數。

D. reset():將輸入指標返回到當前所做的標記處。

E. skip(long n):跳過輸入流上的n個位元組並返回實際跳過的位元組數。

F. markSupported():如果當前流支援mark()/reset()操作就返回true

G. Close():關閉此輸入流並釋放與該流關聯的所有系統資源。

並不是所有的子類都支援inputStream定義的所有方法,如skip()mark()reset()等只對某些生效。

Java中的字元是Unicode編碼,是雙位元組的。inputStream是用來處理位元組的,並不適合處理字元文字。Java為字元文字的輸入專門提供了一套單獨的類Reader,但Reader類並不是Inputstream類的替換者,只是在處理字串時簡化了程式設計。Reader類是字元輸入流的抽象類,所有字元輸入流的實現都是它的子類。

15.2.2 輸出流

OutputStream類是位元組輸出流的抽象類,是所有輸出位元組流的父類。

該類所有的方法均返回void,錯誤會引發IOException異常。

A. write(int b):將指定的位元組寫入輸出流

B. write(byte[] b):將b個位元組從指定的b寫入輸出流

C. write(byte[] b,int off,int len):指定b陣列中從偏移量off開始的len個位元組寫入輸出流

D. flush():徹底完成輸出並清空快取區

E. Close():關閉輸出流

Writer類是字元輸出流的抽象類,所有字元輸出類的實現都是他的子類。

----------------------------------------------------------------------

15.3 File

File類是唯一代表磁碟檔案本身的物件。File類定義了一些與平臺無關的方法來操作檔案,可以通過呼叫file類中的方法, 實現建立、刪除、重新命名檔案等操作。File類的物件主要用來獲取檔案本身的一些資訊,如檔案所在的目錄、檔案的長度、檔案讀寫許可權等。資料流可以將資料寫入到檔案中,檔案也是資料流最常用的資料媒體。

15.3.1 檔案的建立與刪除

可以使用file類建立一個檔案物件。通常用以下3鍾構造方法來建立檔案物件:

A. File(String pathName):通過給定字串,轉換為抽象路徑來建立一個File例項。

File file=new File(“d:/1.txt”);

B. File(String parent,String child):根據定義的父路徑和子路徑字串建立一個新的file物件

File file=new File(“d:/doc/”,”1.txt”);

C. File(File f,String child):根據parent抽象路徑名和child路徑名字串建立一個新的File

File file=new File(“d:/doc”,”1.txt”);

當通過例項化file建立一個檔案物件時,如果該路徑上沒有就建立一個檔案,如果有就會先刪除後建立。

15.3.2 獲取檔案資訊

File類提供了很多方法用於獲取一些檔案本身資訊:

方法

返回值

說明

getName()

String

獲取檔案的名稱

canRead()

Boolean

判斷檔案是否為可讀的

canWrite()

Boolean

判斷檔案是否可被寫入

exits()

Boolean

判斷檔案是否存在

length()

Long

獲取檔案的長度(以位元組為單位)

getAbsolutePath()

String

獲取檔案的絕對路徑

getParent()

String

獲取檔案的父路徑

isFile()

Boolean

判斷檔案是否存在

isDirectory()

Boolean

判斷檔案是否為一個目錄

isHidden()

Boolean

判斷檔案是否為隱藏檔案

lastModified()

long

獲取檔案最後修改時間

-------------------------------------------------------------------

15.4 檔案輸入/輸出流

程式執行時,大部分資料都在記憶體中進行操作,當程式結束或關閉時,這些資料將消失。如果需要將資料永久儲存,可使用檔案輸入/輸出流與指定的檔案建立連線,將需要的資料永久儲存到檔案中。

15.4.1 FileInputStreamFileOutputStream

FileInputStream類和FileOutputStream類都用來操作磁碟檔案。如果使用者的檔案讀取需求比較簡單,則可以使用FileInputStream類,該類繼承自InputStream類。FileOutputStream提供基本的檔案寫入能力,是OutputStream的子類。兩個類的構造方法如下:

a. FileInputStream(String name) FileOutputStream(String name)

b. FileInputStream(File file) FileOutputStream(File file)

15.4.2 FileReaderFileWriter

FileInputStreamFileOutputStream是對位元組或位元組陣列進行讀取,但是漢字佔用兩個位元組,使用位元組流可能會出現亂碼現象,而FileReaderFileWriter就是用來操作字元流的。

------------------------------------------------------------

15.5 帶快取的輸入/輸出流

快取是I/O的一種效能優化。快取流為I/O流增加了記憶體快取區。有了快取區才使得skip mark reset方法可以實現。

15.5.1 BufferedInputStreamBufferedOutputStream

BufferedInputStream類對所有InputStream類進行帶快取區的包裝以達到效能的優化。

A. BufferedInputStream(InputStream in)

B. BufferedInputStream(InputStream in,int size)

一個最優的快取區的大小,取決於它所在的作業系統、可用的記憶體空間以及機器配置。

位元組資料讀取檔案的過程:檔案---->InputStream---->BufferedInputStream---->目的地

BufferedOutputStream輸出資訊跟OutputStream輸出資訊完全一樣,只不過前者有一個flush()方法將快取區的資料強制輸出完。

A. BufferedOutputStream(InputStream in)

B. BufferedOutputStream(InputStream in,int size)

Flush()方法用於快取區沒有滿,也將快取區內容強制寫到外設,習慣上叫這個過程為重新整理。

Flush()方法只對使用快取區的OutputStream類的子類有效。

呼叫close()時,系統在關閉流之前,也會將快取區中的資訊重新整理到磁碟檔案中。

兩個A構造方法都是建立一個有32個位元組的快取區,兩個B構造方法都是以指定的大小來建立快取區

15.5.2 BufferedReaderBufferedWriter

BufferedReaderBufferedWriter類分別繼承ReaderWriter類。具有內部快取機制,並可以以單位進行輸入/輸出。字元資料讀取檔案的過程:

字元資料--->BufferedWriter--->OutputStreamWriter--->OutputStream--->檔案

BufferedReader常用方法:

A. Read()方法:讀取單個字串

B. readLine()方法:讀取一個文字行,並將其返回為字串。若無資料則返回null

BufferedWriter類中都返回void,常用方法如下:

A. Write(String s,int off,int len)方法:寫入字串的某一部分

B. Flush()方法:重新整理該流的快取

C. newLine()方法:寫入一個行分隔符

使用BufferedWriter類的write方法時,資料並沒有立刻被寫入輸入流,而是先進入快取區中。如果想立刻將快取區的資料寫入輸出流,一定要呼叫flush()方法。

----------------------------------------------------------------------

15.6 資料輸入/輸出流

DataInputStream類與DataOutputStream類允許應用程式以與機器無關的方式從底層輸入流中讀取基本java資料型別。即讀取資料時,不必關心這個數值是那種位元組。構造方法如下:

A. DataInputStream(InputStream in):使用指定的基礎InputStream 建立一個DataInputStream

B. DataOutputStream(OutputStream out):建立一個新的資料輸出流,將資料寫入指定基礎輸出流。

DataOutputStream類提供瞭如下3種寫入字串的方法。

A. writeBytes(String s)

B. writeChars(String s)

C. writeUTF(String s)

Java中的字元是Unicode編碼,是雙位元組的,writeBytes只是將字串中的每一個字元的低位元組內容寫入目標裝置中;而writeChars將字串中的每一個字元的兩個位元組的內容都寫到目標裝置中;writeUTF將字串按照UTF編碼後的位元組長度寫入目標裝置,然後才是每一個位元組的UTF編碼。

DataInputStream類提供了一個readUTF()方法返回字串。這是因為要再一個連續的位元組流讀取一個字串,如果沒有特殊的標記作為一個字串的結尾,並且不知道這個字串的長度,就無法知道讀取到什麼位置才是這個字串的結束。DataOutputStream類中只有writeUTF()方法向目標裝置中寫入字串的長度,所以也能準確地讀回寫入字串。

-------------------------------------------------------------

15.7 zip壓縮輸入/輸出流

如果要從zip壓縮管理檔案內讀取某個檔案,要先找到對應該檔案的“目錄進入點”,才能讀取這個檔案的內容,寫檔案也是一樣。

Java實現了I/O資料流與網路資料流的單一介面,因此資料的壓縮、網路傳輸和解壓縮的實現比較容易。ZipEntry類產生的物件,是用來代表一個zip壓縮檔案內的進入點。

15.7.1 壓縮檔案

利用ZipOutputStream類物件,可以將檔案壓縮為zip檔案

ZipOutputStream(OutputStream out)

方法

返回值

說明

putNextEntry(ZipEntry e)

void

開始寫一個新的ZipEntry,並將流內的位置移至此entry所指資料的開頭

Write(byte[] b,int off,int len)

void

將位元組陣列寫入當前zip條目資料

Finish()

void

完成寫入zip輸出流的內容,無須關閉它所配合的OutputStream

setComment(String comment)

void

可設定此Zip檔案的註釋檔案

每一個zip檔案中可能包含多個檔案。寫入目標zip檔案時,必須先使用putNextEntry方法,寫入個別檔案的entry,將流內目前指到的位置移到該entry所指的開頭位置。

15.7.2 解壓縮zip檔案

利用ZipInputStream類讀取zip壓縮檔案,包括已壓縮和未壓縮的條目(entry)

ZipInputStream(InputStream in)

方法

返回值

說明

Read(byte[] b,int off,int len)

int

讀取b陣列內off偏移量的位置,長度是len位元組

Available()

int

判斷是否已讀完目前entry所指定的資料。是01

closeEntry()

void

關閉當前ZIP條目並定位流以讀取下一條目

Skip(long n)

long

跳過當前ZIP條目中指定的位元組數

getNextEntry()

ZipEntry

讀取下一個ZipEntry,將將流內的位置移至該entry所指資料的開頭

createZipEntry(String name)

ZipEntry

以指定的name引數新建一個ZipEntry物件

使用ZipInputStream類來解壓檔案,必須先使用ZipInputStream類的getNextEntry()方法來取得其內的第一個ZipEntry


相關推薦

Java輸入輸出流I/O

第十四天: 目標: ------------------------------------------------------------ 第十四章  Stream I/O and Files, 共 44 個slide(411-455); 知識點:一. 流的概念    

C/C++輸入輸出函式I/O總結

在c語言的學習使用過程中,除了格式化輸入輸出外,還有很多輸入輸出函式,包括字串輸入輸出、檔案輸入輸出等。在使用的過程中一直沒有認真總結過,在這裡把以前學的好好總結一下,以便時間長了又忘記了。 字串輸入輸出 1、輸入函式:gets、fgets、scanf

java輸入輸出流I/O總結

 io流的四個基本類       Java.io包中包含了流式I/O所需要的所有類。在java.io包中有四個基本類:InputStream、OutputStream及Reader、Writer類,它們分別處理位元組流和字元流: 基本資料流的I/O 輸入/輸出

15.輸入輸入I&O

我這些學習筆記,記錄的都是我自己認為的知識點,可能以後再看的時候還要翻書,但是可以用來定位到準確的書中示例的位置,減少翻書重找的時間,利於自身知識體系的搭建。                   self-transcendence第15章 I/O15.1 流概述流是一組有序

scala:輸入輸出I/O

d:/test.txt檔案內容: 1 2 1 2 程式: import scala.io.Source def main(args: Array[String]): Unit = { val filename = "d:/test.txt" var buffer

作業系統——輸入/輸出I/O管理

1、I/O管理概述 I/O裝置 I/O裝置管理是作業系統設計中最凌亂也最具挑戰性的部分。由於它包含了很多領域的不同裝置以及與裝置相關的應用程式,因此很難有一個通用且一致的設計方案 I/O裝置按使用特徵分類: 1、人機互動類外部裝置: 2、儲存裝置: 3、網路通

輸入/輸出管理I/O)

1.I/O裝置及其分類 I/O裝置管理是作業系統設計中最凌亂也最具挑戰性的部分。由於它包含了很多領域的不同裝置以及與裝置相關的應用程式,因此很難有一個通用且一致的設計方案。所以在理解裝置管理之前,應該先了解具體的I/O裝置型別。 計算機系統中的I/O裝置按使

同步非同步區別I/O原理

老張愛喝茶,廢話不說,煮開水。 出場人物:老張,水壺兩把(普通水壺,簡稱水壺;會響的水壺,簡稱響水壺)。 1 老張把水壺放到火上,立等水開。(同步阻塞) 老張覺得自己有點傻 2 老張把水壺放到火上,去客廳看電視,時不時去廚房看看水開沒有。(同步非阻塞) 老張

java輸入輸出效能提升高效能I/O

在java各種輸入輸出流效能由低到高排序:      -RandomAccessFile      -其他各種輸入輸出流      -帶快取的流:BufferedInputStream,BufferedOutputStream      -記憶體對映 記憶體對映是什

C++的終端輸入輸出C++學習筆記 3

C++和C的輸入輸出方面的不同 在C中輸入和輸出,常使用函式scanf和printf。 C++除了可以照常使用這兩個函式進行輸入和輸出外,還增加了標準輸入流物件cin(念 see-in)和標準輸出流物件cout(念 see-out) scanf("%d",i); printf

C++檔案輸入輸出C++學習筆記 1

為了開啟一個檔案供輸入或輸出,標頭檔案需要包括 #include<iostream> 和#include<fstream> iostream庫除了支援終端輸入輸出,也支援檔案的輸入和輸出。 1. 開啟一個輸出檔案 必須宣告一個ofstream型別的物件,來

Tornado使用者指引-----------非同步非阻塞I/O

摘要:非同步和非阻塞I/O實時WEB的特性是經常需要為每個使用者端維持一個長時間存活但是大部分時候空閒的連線。在傳統的同步式web伺服器中,這主要通過為每個使用者建立一個執行緒來實現,這樣的代價是十分昂貴的。為了最大限度地減少併發成本,Tornado使用單執行緒的事件迴圈機制(linux中是基於

IO的埠對映記憶體對映 Port mapped I/O Memory mapped I/O說明

IO埠和IO記憶體的區別及分別使用的函式介面           每個外設都是通過讀寫其暫存器來控制的。外設暫存器也稱為I/O埠,通常包括:控制暫存器、狀態暫存器和資料暫存器三大類。根據訪問外設暫存器的不同方式,可以把CPU分成兩大類。一類CPU(如M68K,Power

單鏈表的輸入輸出c語言編寫

#include<stdio.h> #include<stdlib.h> struct link2 {     int data;     struct link2 *next; }*head; void creat(); void Ouput();

Java基礎-高階特性-簡單總結I/O反射機制

    Java中按照流向分,分為輸入流和輸出流,按照處理資料單元分,分為字元流和位元組流。這個總結開始會簡單寫一點方法,然後會寫一下常用模板,套用就好了。File類的常用方法:方法說明boolean exists( )測試檔案是否存在String getAbsolutePa

java代碼實現socket接口通訊堵塞I/O

write ice 代碼 args fin true finall tar 輸出 傳統的java實現socket通訊比較簡單實現,不過它屬於堵塞式的I/O流存取,只能由一個線程完成當前任務才能起下個一個線程,無法解決高並發; 1、簡單的socketservice

9.繼續練習簡單的輸入計算a-b)

pan main tdi 簡單 pri 輸入 include span scan #include <stdio.h> int main() { int a,b; scanf("%d %d",&a,&b); printf

如何在各類控制元件中輸入/輸出資料學習筆記

一、知識點描述 1、相關控制元件 ①下拉框(ComboBox) 顯示一個可編輯的文字框,其中包含一個允許值下拉列表。 ②日曆框(DateTimePick) 允許使用者選擇日期和時間,並以指定的格式顯示該日期和時間。 ③文字框(TextBox) 允許使用者輸入文字,並提供多行編輯和密碼字元掩碼功能

CVPR論文《100+ Times FasterWeighted Median Filter (WMF)》的實現解析附原始碼。 任意半徑中值濾波擴充套件至百分比濾波器)O(1)時間複雜度演算法的原理、實現及效果 任意半徑中值濾波擴充套件至百分比濾波器)O(1)時間複雜度演算法的原理、實現及

  四年前第一次看到《100+ Times FasterWeighted Median Filter (WMF)》一文時,因為他附帶了原始碼,而且還是CVPR論文,因此,當時也對程式碼進行了一定的整理和解讀,但是當時覺得這個演算法雖然對原始速度有不少的提高,但是還是比較慢。因此,沒有怎麼在意,這幾天有幾位朋友

JTextField限制輸入資料型別java GUI

package javaBasic; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class ControlClass { public static void main(String[] a