欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中I/O輸入輸出的深入講解

 更新時間:2022年08月03日 11:39:09   作者:曠世奇才李先生  
Java的I/O技術(shù)可以將數(shù)據(jù)保存到文本文件、二進(jìn)制文件甚至是ZIP壓縮文件中,以達(dá)到永久性保存數(shù)據(jù)的要求,下面這篇文章主要給大家介紹了關(guān)于Java中I/O輸入輸出的相關(guān)資料,需要的朋友可以參考下

前言

在變量、數(shù)組和對象中存儲的數(shù)據(jù)是暫時存在的,程序結(jié)束后它們就會丟失。為了能夠永久地保存創(chuàng)建的數(shù)據(jù),需要將其保存在磁盤文件中,這樣就可以在其他程序中使用它們。Java的I/O技術(shù)可以將數(shù)據(jù)保存到文本文件、二進(jìn)制文件甚至是ZIP壓縮文件中,已達(dá)到永久性保存數(shù)據(jù)的要求。掌握I/O處理技術(shù)能夠提高對數(shù)據(jù)的處理能力。

一、流概述

流是一組有序的數(shù)據(jù)序列,根據(jù)操作的類型,可分為輸入流和輸出流兩種。I/O(Input/Output,輸入/輸出)流提供了一條通道程序,可以使用這條通道把源中的字節(jié)序列送到目的地。雖然I/O流通常與磁盤文件存取有關(guān),但是程序的源和目的地也可以是鍵盤、鼠標(biāo)、內(nèi)存或顯示器窗口等。
Java由數(shù)據(jù)流處理輸入/輸出模式,程序從指向源的輸入流中讀取源中的數(shù)據(jù),源可以是文件、網(wǎng)絡(luò)、壓縮包或其他數(shù)據(jù)源。
輸出流的指向是數(shù)據(jù)要到達(dá)的目的地,程序通過向輸出流中寫入數(shù)據(jù)把信息傳遞到目的地。

二、輸入/輸出流

Java語言定義了許多類專門負(fù)責(zé)各種方式的輸入/輸出,這類類都被放在java.io包中。其中,所有輸入流類都是抽象類InputStream(字節(jié)輸入流)或抽象類Reader(字符輸入流)的子類;而所有輸出流都是抽象類OutputStream(字節(jié)輸出流)或抽象類Writer(字符輸出流)的子類。

1、輸入流

InputStream類是字節(jié)輸入流的抽象類,是所有字節(jié)輸入流的父類。InputStream類的具體層次結(jié)構(gòu)如下所示。
該類中所有方法遇到錯誤時都會引發(fā)IOException異常。下面是對該類中的一些方法的簡要說明。

read()方法:從輸入流中讀取數(shù)據(jù)的下一個字節(jié)。返回0-255范圍內(nèi)的int字節(jié)值。如果因為已經(jīng)到達(dá)流末尾而沒有可用的字節(jié),則返回值為-1。
read(byte[] b):從輸入流中讀入一定長度的字節(jié),并以整數(shù)的形式返回字節(jié)數(shù)。
mark(int readlimit)方法:在輸入流的當(dāng)前位置放置一個標(biāo)記,readlimit參數(shù)告知此輸入流在標(biāo)記位置失效之前允許讀取的字節(jié)數(shù)。
reset()方法:將輸入指針返回到當(dāng)前所做的標(biāo)記處。
skip(long n)方法:跳過輸入流上的n個字節(jié)并返回實(shí)際跳過的字節(jié)數(shù)。
markSupported()方法:如果當(dāng)前流支持mark()/reset()操作就返回true。
close方法:關(guān)閉此輸入流并釋放與該流關(guān)聯(lián)的所有系統(tǒng)資源。

Java中的字符是Unicode編碼,是雙字節(jié)的。InputStream是用來處理字節(jié)的,并不適合處理字符文本。Java為字符文本的輸入專門提供了一套單獨(dú)的類Reader,但Reader類并不是InputStream類的替換者,只是處理字符串時簡化了編程。Reader類是字符輸入流的抽象類,所有字符輸入流的實(shí)現(xiàn)都是它的子類。

Reader類中的方法與InputStream類中的方法類似,讀者在需要時可查看JDK文檔。

2、輸出流

OutputStream類是字節(jié)輸出流的抽象類,此抽象類是表示輸出字節(jié)流的所有類的超類。
OutputStream類中的所有方法均返回void,在遇到錯誤時會引發(fā)IoException異常。下面對OutputStream類中的方法作簡單的介紹。

write(int b)方法:將指定的字節(jié)寫入此輸出流。
write(byte[] b)方法:將b個字節(jié)從指定的byte數(shù)組寫入此輸出流。
write(byte[] b,int off, int len)方法:將指定byte數(shù)組中從偏移量off開始的len個字節(jié)寫入此輸出流。
flush()方法:徹底完成輸出并清空緩存區(qū)。
close()方法:關(guān)閉輸出流。

三、File類

File類是java.io包中唯一代表磁盤文件本身的對象。File類定義了一些與平臺無關(guān)的方法來操作文件,可以通過調(diào)用File類中的方法,實(shí)現(xiàn)創(chuàng)建、刪除、重命名文件等操作。File類的對象主要用來獲取文件本身的一些信息,如文件所在的目錄、文件的長度、文件讀寫權(quán)限等。數(shù)據(jù)流可以將數(shù)據(jù)寫入到文件中,文件也是數(shù)據(jù)流最常用的數(shù)據(jù)媒體。

1、文件的創(chuàng)建與刪除

可以使用File類創(chuàng)建一個文件對象。通常使用以下3種構(gòu)造方法來創(chuàng)建文件對象。

1、File(String pathname)

該構(gòu)造方法通過將給定路徑名字符串轉(zhuǎn)換為抽象路徑名來創(chuàng)建一個新File實(shí)例。

語法如下:

new File(String pathname);

其中,pathname指定路徑名稱(包含文件名)。例如:

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

2、File(String parent,String child)

該構(gòu)造方法根據(jù)定義的父路徑和子路徑字符串(包含文件名)創(chuàng)建一個新的File對象。

語法如下:

new File(String parent,String child);

3、File(File f,String child)

該構(gòu)造方法根據(jù)Parent抽象路徑名和child路徑名字符串創(chuàng)建一個新的File實(shí)例。

語法如下:

new File(File f,String child);

2、獲取文件信息

File類提供了很多方法用于獲取一些文件本身的信息。如下表

方法| 返回值 | 說明
-------- | -----
getName() | String| 獲取文件的名稱
canReda()| boolean |判斷文件是否為可讀的
canWrite()| boolean | 判斷文件是否可被寫入
exits()|boolean | 判斷文件是否存在
length()|long | 獲取文件的長度(以字節(jié)為單位)
getAbsolutePath() | String | 獲取文件的絕對路徑
getParent() | String | 獲取文件的父路徑
isFile() | boolean | 判斷文件是否存在
isDirectory() | boolean | 判斷文件是否為一個目錄
isHidden() | boolean | 判斷文件是否為隱藏文件
lastModified() | long | 獲取文件最后修改時間

四、文件輸入/輸出流

程序運(yùn)行期間,大部分?jǐn)?shù)據(jù)都在內(nèi)存中進(jìn)行操作,當(dāng)程序結(jié)束或關(guān)閉時,這些數(shù)據(jù)將消失。如果需要將數(shù)據(jù)永久保存,可使用文件輸入/輸出流與指定的文件建立連接,將需要的數(shù)據(jù)永久保存到文件中。

1、FillInputStream與FileOutputStream類

FileInputStream類與FileOUtputStream類都用來操作磁盤文件。如果用戶的文件讀取需求比較簡單,則可以使用FileInputString類,該類繼承自InputString類。FileOutputStream類與FileInputStream類對應(yīng),提供了基本的文件寫入能力。FileOutputStream類是OutputStream類的子類。
FileInputStream類常用的構(gòu)造方法如下:

FileInputStream(String name)
FileInputStream(File file)

2、FileReader和FileWriter類

使用FileOutputStream類向文件中寫入數(shù)據(jù)與使用FileInputStream類從文件中將內(nèi)容讀出來,都存在一點(diǎn)不足,即這兩個類都只提供了對字節(jié)或字節(jié)數(shù)組的讀取方法。由于漢子在文件中占用兩個字節(jié),如果使用字節(jié)流,讀取不好可能會出現(xiàn)亂碼現(xiàn)象,此時采用字符流Reader或Writer類即可避免這種現(xiàn)象。

FileReader和FileWriter字符流對應(yīng)了FileInputStream和FileOutputStream類。FileReader流順序地讀取文件,只要不關(guān)閉流,每次調(diào)用read()方法就順序地讀取源中其余的內(nèi)容,直到源的末尾或流被關(guān)閉。

五、帶緩存的輸入/輸出流

緩存是I/O的一種性能優(yōu)化。緩存流為I/O流增加了內(nèi)存緩存區(qū)。有了緩存區(qū),使得在流上執(zhí)行skip()、mark()和reset()方法都成為可能。

1、BufferedInputStream與BufferedOutputStream類

BufferedInputStream類可以對所有InputStream類進(jìn)行帶緩沖區(qū)的包裝以達(dá)到性能的優(yōu)化。BufferedInputStream類有兩個構(gòu)造方法:

BufferedInputStream(InputStream in)
BufferedInputStream(InputStream in,int size)

第一種構(gòu)造方法創(chuàng)建一個有32個字節(jié)的緩存區(qū),第二種構(gòu)造方法以指定的大小來創(chuàng)建緩存區(qū)。

2、BufferedReader與BufferedWriter類

BufferedReader類與BufferedWriter類分別繼承Reader類與Writer類。這兩個類同樣具有內(nèi)部緩存機(jī)制,并可以以行為單位進(jìn)行輸入/輸出。

六、數(shù)據(jù)輸入/輸出流

數(shù)據(jù)輸入/輸出流(DataInputStream類與DataOutputStream類)允許應(yīng)用程序以與機(jī)器無關(guān)的方式從底層輸入流中讀取基本Java數(shù)據(jù)類型。也就是說,當(dāng)讀取一個數(shù)據(jù)時,不必再關(guān)心這個數(shù)值應(yīng)當(dāng)是哪種字節(jié)。

七、ZIP壓縮輸入/輸出流

ZIP壓縮管理文件(ZIP archive)是一種十分典型的文件壓縮形式,使用它可以節(jié)省存儲空間。關(guān)于ZIP壓縮的I/O實(shí)現(xiàn),在Java的內(nèi)置類中提供了非常好用的相關(guān)類,所以其實(shí)現(xiàn)方式非常簡單。本節(jié)將介紹使用java.util.zip包中的ZipOutputStream與ZipInputStream類來實(shí)現(xiàn)文件的壓縮/解壓縮。如要從ZIP壓縮管理文件內(nèi)讀取某個文件,要先找到對應(yīng)文件的“目錄進(jìn)入點(diǎn)”(從它可知該文件在ZIP文件內(nèi)的位置),才能讀取這個文件的內(nèi)容。如果要將文件內(nèi)容寫入ZIP文件內(nèi),必須先寫入對應(yīng)于該文件的“目錄進(jìn)入點(diǎn)”,并且把要寫入文件內(nèi)容的位置移到此進(jìn)入點(diǎn)所指的位置,然后再寫入文件內(nèi)容。

Java實(shí)現(xiàn)了I/O數(shù)據(jù)流與網(wǎng)絡(luò)數(shù)據(jù)流的單一接口,因此數(shù)據(jù)的壓縮、網(wǎng)絡(luò)傳輸和解壓縮的實(shí)現(xiàn)比較容易。ZipEntry類產(chǎn)生的對象,是用來代表一個ZIP壓縮文件內(nèi)的進(jìn)入點(diǎn)(entry)。ZipInputStream用來寫出ZIP壓縮格式的文件,所支持的包括已壓縮及未壓縮的進(jìn)入點(diǎn)(entry)。

ZipOutputStream類用來寫出ZIp壓縮格式的文件,而且所支持的包括已壓縮及未壓縮的進(jìn)入點(diǎn)(entry)。下面介紹利用ZipEntry、

ZipInputStream和ZipOutputStream3個Java類實(shí)現(xiàn)ZIP數(shù)據(jù)壓縮方式的編程方法。

1、壓縮文件

利用ZipOutputStream類對象,可將文件壓縮為.zip文件。ZipOutputStream類的構(gòu)造方法如下:

ZipOutputStram(OutputStream out);

ZipOutputStream類的常用方法如表所示:

方法返回值說明
putNextEntry(ZipEntry e)void開始寫一個新的ZipEntry,并將流內(nèi)的位置移至此entry所指數(shù)據(jù)的開頭
write(byte[] b,int off,int len)void將字節(jié)數(shù)組寫入當(dāng)前ZIP條目數(shù)據(jù)
finish()void完成寫入ZIP輸出流的內(nèi)容,無須關(guān)閉它所配合的OutputStream
setComment(String comment)void可設(shè)置此ZIP文件的注釋文字

2、解壓縮ZIP文件

ZipInputStream類可讀取ZIP壓縮格式的文件,包括已壓縮和未壓縮的條目(entry)。ZipInputStream類的構(gòu)造方法如下:

ZipInputStream(InputStream in)

ZipInputStream類的常用方法如下表所示:

方法返回值說明
read(byte[] b, int off , int len)int讀取目標(biāo)b數(shù)組內(nèi)off偏移量的位置,長度是len字節(jié)
available()int判斷是否已讀完目前entry所指定的數(shù)據(jù)。已讀完返回0,否則返回1
closeEntry()void關(guān)閉當(dāng)前ZIP條目并定位流以讀取下一個條目
skip(long n)long跳過當(dāng)前ZIP條目中指定的字節(jié)數(shù)
getNextEntry()ZipEntry讀取下一個ZipEntry,并將流內(nèi)的位置移至該entry所指數(shù)據(jù)的開頭
createZipEntry(String name)ZipEntry以指定的name參數(shù)新建一個ZipEntry對象

補(bǔ)充:獲取目錄下的所有目錄和文件

示例:假設(shè)目錄“D:\TestDir1”下有兩個文件夾(dir1 和 dir2)和一個文件 file1.txt 。

File[] listFiles()方法:獲取該目錄下的所有子目錄和文件,返回File類數(shù)組。

import java.io.File;
 
/**
 * 獲取目錄下的所有目錄和文件
 * @author pan_junbiao
 **/
public class DirFileTest
{
    public static void main(String[] args)
    {
        File file = new File("D:\\TestDir1");
 
        //判斷目錄是否存在
        if (!file.exists())
        {
            System.out.println("目錄不存在");
            return;
        }
 
        //獲取文件數(shù)組
        File[] fileList = file.listFiles();
        for (int i = 0; i < fileList.length; i++)
        {
            //判斷是否為目錄
            if (fileList[i].isDirectory())
            {
                System.out.println("目錄:" + fileList[i].getName());
            }
            else
            {
                System.out.println("文件:" + fileList[i].getName());
            }
        }
    }
}

執(zhí)行結(jié)果:

總結(jié)

這里的相關(guān)內(nèi)容還沒有整理完畢,文章后面持續(xù)更新,建議收藏。

文章中涉及到的命令大家一定要像我一樣每個都敲幾遍,只有在敲的過程中才能發(fā)現(xiàn)自己對命令是否真正的掌握了。

到此這篇關(guān)于Java中I/O輸入輸出的文章就介紹到這了,更多相關(guān)Java I/O輸入輸出內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java的Hibernate框架中的組合映射學(xué)習(xí)教程

    Java的Hibernate框架中的組合映射學(xué)習(xí)教程

    組合映射即是指主對象和子對象關(guān)聯(lián)且擁有相同的生命周期的映射關(guān)系,這里我們將舉一些數(shù)據(jù)操作的實(shí)例,來講解Java的Hibernate框架中的組合映射學(xué)習(xí)教程
    2016-07-07
  • 使用idea將工具類打包使用的詳細(xì)教程

    使用idea將工具類打包使用的詳細(xì)教程

    這篇文章主要介紹了使用idea將工具類打包使用的詳細(xì)教程,本文通過圖文并茂給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • Java并發(fā)編程之Fork/Join框架詳解

    Java并發(fā)編程之Fork/Join框架詳解

    這篇文章主要介紹了Java并發(fā)編程之Fork/Join框架詳解,Fork/Join框架是Java7提供的一個用于并行執(zhí)行任務(wù)的框架,是一個把大任務(wù)分割成若干個小任務(wù),最終匯總每個小任務(wù)結(jié)果后得到大任務(wù)結(jié)果的框架,需要的朋友可以參考下
    2023-12-12
  • 如何理解和運(yùn)用ClassLoader

    如何理解和運(yùn)用ClassLoader

    這篇文章主要介紹了如何理解和運(yùn)用 ClassLoader,幫助大家更好的理解和使用JVM,感興趣的朋友可以了解下
    2021-01-01
  • 解決JAVA非對稱加密不同系統(tǒng)加密結(jié)果不一致的問題

    解決JAVA非對稱加密不同系統(tǒng)加密結(jié)果不一致的問題

    這篇文章主要介紹了解決JAVA非對稱加密不同系統(tǒng)加密結(jié)果不一致的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • 關(guān)于Nacos和Eureka的區(qū)別及說明

    關(guān)于Nacos和Eureka的區(qū)別及說明

    這篇文章主要介紹了關(guān)于Nacos和Eureka的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Java8 中使用Stream 讓List 轉(zhuǎn) Map使用問題小結(jié)

    Java8 中使用Stream 讓List 轉(zhuǎn) Map使用問題小結(jié)

    這篇文章主要介紹了Java8 中使用Stream 讓List 轉(zhuǎn) Map使用總結(jié),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-06-06
  • Java BigDecimal類的使用和注意事項

    Java BigDecimal類的使用和注意事項

    這篇文章主要講解Java中BigDecimal類的用法,并簡單介紹一些注意事項,希望能給大家做一個參考。
    2016-06-06
  • Java并發(fā)之線程池Executor框架的深入理解

    Java并發(fā)之線程池Executor框架的深入理解

    這篇文章主要介紹了Java并發(fā)之線程池Executor框架的深入理解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-11-11
  • springboot+vue實(shí)現(xiàn)登錄功能

    springboot+vue實(shí)現(xiàn)登錄功能

    這篇文章主要為大家詳細(xì)介紹了springboot+vue實(shí)現(xiàn)登錄功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-05-05

最新評論