最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中IO流解析及代碼實(shí)例詳解

 更新時(shí)間:2021年08月16日 16:14:41   作者:我永遠(yuǎn)信仰  
流是一種抽象概念,它代表了數(shù)據(jù)的無(wú)結(jié)構(gòu)化傳遞。。用來(lái)進(jìn)行輸入輸出操作的流就稱為IO流。換句話說(shuō),IO流就是以流的方式進(jìn)行輸入輸出

1、IO流

1.流和流的分類

什么是IO流?

I:Input (輸入)

O: Ouput(輸出)

IO流的分類?

有多種分類方式:

  • 一種方式是按照流的方向進(jìn)行分類:

以內(nèi)存作為參照物

往內(nèi)存中去,叫做輸入(Input)。或者叫做讀(Read) .

從內(nèi)存中出來(lái),叫做輸出(output)?;蛘呓凶鰧?write) .

  • 另一種方式是按照讀取藪據(jù)方式不同進(jìn)行分類:
    • 有的流是按照字節(jié)的方式讀取數(shù)據(jù),一次讀取1個(gè)字節(jié)byte,等同于一次讀取8個(gè)二進(jìn)制。
    • 這種流是萬(wàn)能的,什么類型的文件都可以讀取。包括:文本文件,圖片,聲音文件,視頻……
    • 有的流是按照字符的方式讀取數(shù)據(jù)的,一次讀取一個(gè)字符,這種流是為了方便讀取普通文本文件而存在的,這種流不能讀取:圖片、聲音、視頻等文件。只能讀取純文本文件,連word文件都無(wú)法讀取

總結(jié):流的分類

輸入流、輸出流、字節(jié)流、字符流

Java IO流的四大家族

java.io.InputStream 字節(jié)輸入流
java.io.OutputStream 字節(jié)輸出流
java.io.Reader 字符輸入流
java.io.Writer 字符輸出流

注意:

  • 四個(gè)都是抽象類。
  • 所有流都是實(shí)現(xiàn)了java.io.Closeable接口,都是可關(guān)閉的
    • 流是一個(gè)管道,是內(nèi)存和硬盤之間的通道。用完后一定要關(guān)閉,不然會(huì)占用很多資源。
  • 所有的輸出流都實(shí)現(xiàn)了java.io.Flushable接口,都是可刷新的
    • 最終輸出后,一定要記得調(diào)用flush()方法。目的是將管道中剩余未輸出的數(shù)據(jù)強(qiáng)行輸出完(清空管道)
    • 如果沒(méi)有flash(),可能會(huì)導(dǎo)致丟失數(shù)據(jù)
  • 在java中只要”類名”以strean結(jié)尾的都是字節(jié)流。以"Reader/writer"結(jié)尾的都是字符流

java.io包下需要掌握的流有16個(gè):

文件專屬:

java . io.FileInputstream

java.io.FileOutputstream

java.io.FileReader

java.io.Filewriter

轉(zhuǎn)換流:(將字節(jié)流轉(zhuǎn)換成字符流)

java . io . InputstreamReader

java . io. outputstreamWriter

緩沖流專屬:

java. io. BufferedReader

java.io.BufferedWriter

java.io. BufferedInputstream

java . io.Bufferedoutputstrean

數(shù)據(jù)流專屬:

java . io . DataInputstream

java .io. Dataoutputstrean

標(biāo)準(zhǔn)輸出流:

java . io . Printwriter

java . io . Printstream

對(duì)象專屬流:

java.io.ObjectInputstream

java.io.ObjectOutputstream

一下子看到這么多流。不用怕,只需要掌握一組的使用方法就可以了,使用其他的都是一樣,一通百通。

下面以萬(wàn)能的字節(jié)流(FileInputStream、FileOutputStream)來(lái)舉例說(shuō)明。

2.如何使用流

1、輸入流(讀文件):FileInputStream

方法一

使用FileInputStream的read()

步驟:

1、 創(chuàng)建流對(duì)象

​ new FileInputStream(參數(shù))

​ 參數(shù)可以是一個(gè)File類、String字符串表示的文件路徑

2、使用流的方法對(duì)文件進(jìn)行讀

輸入流調(diào)用read()方法,每次從流中讀取一個(gè)數(shù)據(jù)字節(jié)。返回值是讀到的字節(jié)的ASCII值

讀取一個(gè)后,他會(huì)指向下一個(gè)字符,如果到達(dá)末尾。返回-1,可以用while()來(lái)實(shí)現(xiàn)。

3、關(guān)閉流

調(diào)用close()方法

實(shí)例:

package com.io.stream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class TestFileInputStream {
    //定義一個(gè)流對(duì)象
    private static FileInputStream fis;
    public static void main(String[] args) {
        try {
            //1、 創(chuàng)建流對(duì)象.參數(shù)可以是一個(gè)File類、String字符串表示的文件路徑
            fis = new FileInputStream("E:\\aaa.txt");//在e盤下有一個(gè)aaa.txt的文件夾,內(nèi)容為(abcdefg)
            //2、使用流的方法對(duì)文件進(jìn)行讀
            while (true) {
                int read = fis.read();//注意這里返回的是int類型,代表是字符的ASCII值
                if (read==-1) {//讀到最后會(huì)返回-1,退出條件
                    break;
                }
                System.out.println(read);
            }
        } catch (FileNotFoundException e) {//異常細(xì)?;?,不同異常可以選擇不同的處理方式
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                //3、關(guān)閉流
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

/*輸出
97
98
99
100
101
102
103
*/

int read()

該方法因?yàn)槊看味际侵蛔x取一個(gè)字節(jié),這樣內(nèi)存和硬盤交互太頻繁 ,開(kāi)銷大且效率不高。一般不使用,但是要了解,這是基礎(chǔ)。

方法二

一般使用這種方法

使用read(byte[] b)

一次讀取最多 b.length 個(gè)字節(jié),減少內(nèi)存和硬盤交互,提高執(zhí)行效率

該方法返回的是讀到的字節(jié)的數(shù)量

使用步驟:和前面只有第二步有些差別

byte[] b= new byte[3];

int readNum = fis.read(b);

解析

  • 新建一個(gè)byte[]數(shù)組b,代表我們一次需要讀多少個(gè)字符。讀完這么多字符后,下次一讀是從當(dāng)前讀到的位置開(kāi)始,和上面一樣
  • 將byte數(shù)組b傳入read()方法中,返回一個(gè)我們byte數(shù)組的大小,此時(shí)readNum值為3

那么我們讀出來(lái)的數(shù)據(jù)在哪里呢。自然是存放在byte數(shù)組里。我們打印b數(shù)組看,發(fā)現(xiàn)b數(shù)組里存放的讀到的ascii值

細(xì)節(jié):

因?yàn)閿?shù)組的長(zhǎng)度是我們?cè)O(shè)定的。如果文件讀到最后,不一定剛好符合我們?cè)O(shè)定的長(zhǎng)度,最后一組的長(zhǎng)度只有小于或等于數(shù)組的長(zhǎng)度。如果小于它會(huì)返回剩余的字符的數(shù)量,讀不到返回-1,我們可以利用這個(gè)作為循環(huán)退出的條件。

另外一個(gè),因?yàn)樗拈L(zhǎng)度小于b數(shù)組,那么它的值也是無(wú)法填滿b數(shù)組的,此時(shí),它只更新b數(shù)組中前面的n個(gè)讀到的值,b數(shù)組后面的是上一個(gè)讀取時(shí)讀取到的值。

實(shí)例:

仍然讀取aaa.txt文件,內(nèi)容為(abcdefg)

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Arrays;
public class TestFileInputStream2 {
    private static FileInputStream fis;
    public static void main(String[] args) {
        try {
            fis = new FileInputStream("IO流\\aaa.txt");
            //準(zhǔn)備一個(gè)byte數(shù)組
            byte[] b= new byte[3];
            int readNum = 0;
            while (true) {
                //先進(jìn)行讀操作。
                readNum=fis.read(b);
                //判斷
                if (readNum == -1) {
                    break;
                }
                //將字符數(shù)組轉(zhuǎn)為String,后面兩個(gè)參數(shù)為起始位置,和長(zhǎng)度
                String str = new String(b, 0, readNum);
                System.out.println(str);
            }
            /*輸出
				abc
				def
				g
			*/
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                //關(guān)閉流
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

其他常用的方法

int available()

返回流中還有多少個(gè)字符沒(méi)有讀。(相當(dāng)于獲得文件讀到的位置到末尾字符的個(gè)數(shù),如果沒(méi)開(kāi)始讀,返回文件中總字符的數(shù)量)

使用這個(gè)可以對(duì)一些比較小的(字符長(zhǎng)度)文件一次讀完,如果不超過(guò)byte數(shù)組的范圍的話

public class TestFileInputStream3 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("IO流\\aaa.txt");
        byte[] bytes = new byte[fis.available()];//創(chuàng)建一個(gè)和文件字符數(shù)量一樣大的byte數(shù)組,文件不能太大。
        fis.read(bytes);
        System.out.println(new String(bytes));//b轉(zhuǎn)為字符串,輸出abcdefg
    }
}

skip(long n)

顧名思義:從輸入流中跳過(guò)并丟棄 n 個(gè)字節(jié)的數(shù)據(jù)。

2、輸出流(寫文件):FileOutputStream

和輸入的流程差不多,過(guò)程也基本相同

write(byte[] b)

注意:

  • byte的范圍是-128~127,超過(guò)會(huì)報(bào)錯(cuò)
  • 寫完之后,一定要刷新
  • 如果當(dāng)前路徑下文件已存在,會(huì)將原文件清空,再寫入(慎用)。
    • 如果它是一個(gè)目錄,而不是一個(gè)常規(guī)文件,會(huì)報(bào)錯(cuò)。
    • 或者該文件不存在,但無(wú)法創(chuàng)建它,會(huì)報(bào)錯(cuò)。
  • 如果當(dāng)前路徑下文件不存在,會(huì)新建文件。
package com.io.stream.output;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/**
 * @Author cyh
 * @Date 2021/8/7 17:21
 */
public class Test1 {
    private static FileOutputStream fos;
    public static void main(String[] args) {
        try {
            //新建一個(gè)輸出流,參數(shù)是輸出的路徑,最后的為文件名。
            fos = new FileOutputStream("IO流\\bbb.txt");
            //新建一個(gè)byte數(shù)組,里面對(duì)應(yīng)的是abcd的ascii值
            byte[] bytes = {97, 98, 99, 100,101,127}; //注意byte的范圍是-128~127
            //輸出流調(diào)用write方法寫入byte數(shù)組,以文件形式保存到上面的路徑
            fos.write(bytes);
            //寫完之后,一定要刷新
            fos.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

追加寫文件

想要追加寫文件,則需要在新建流的的時(shí)候,加一個(gè)參數(shù)true。

表示將字節(jié)寫入文件末尾處,而不是寫入文件開(kāi)始處

//新建一個(gè)輸出流,參數(shù)是輸出的路徑,最后的為文件名。增加true表示開(kāi)啟追加寫
fos = new FileOutputStream("IO流\\bbb.txt",true);

注意:和上面一樣,不一樣的點(diǎn)只是追加寫。

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

將指定 byte 數(shù)組中從偏移量 off 開(kāi)始的 len 個(gè)字節(jié)寫入此文件輸出流.

意思就是,寫入的內(nèi)容為off~len。如果off是0,len是數(shù)組長(zhǎng)度,那就全部寫入;如果off是數(shù)組長(zhǎng)度-1,len是數(shù)組長(zhǎng)度,那就只寫入了一個(gè)字符

3.文件的拷貝

  • 使用FileInputStream+FileOutputStream即可完成文件的拷貝
  • 拷貝的過(guò)程應(yīng)該是一邊讀、一邊寫
  • 使用上面的字節(jié)流拷貝文件的時(shí)候,文件類型隨意,是萬(wàn)能的。什么文件都可以拷貝

實(shí)例

package com.io.stream.copy;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/**
 * @Author cyh
 * @Date 2021/8/7 17:53
 */
public class TestCopy {
    private static FileInputStream fis;
    private static FileOutputStream fos;
    public static void main(String[] args) {
        try {
            //創(chuàng)建一個(gè)輸入流
            fis = new FileInputStream("D:\\edgeDownload\\VSCodeUserSetup-x64-1.55.0.exe");
            //創(chuàng)建一個(gè)輸出流
            fos = new FileOutputStream("C:\\Users\\PC\\Desktop\\copy\\b\\VSCodeUserSetup-x64-1.55.0.exe");
            //核心,一邊讀、一邊寫
            byte[] bytes = new byte[1024*1024];//1MB,一次最多拷貝1MB
            int readNum=0;
            while((readNum=fis.read(bytes))!=-1){
                fos.write(bytes,0,readNum);//將bytes全部寫入
            }
            //刷新
            fos.flush();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //資源要分開(kāi)釋放,不然一個(gè)出錯(cuò)會(huì)導(dǎo)致另一個(gè)無(wú)法釋放
            try {
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

總結(jié)

本篇文章就到這里了,希望能給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • 基于Java?GUI?事件處理方式

    基于Java?GUI?事件處理方式

    這篇文章主要介紹了基于Java?GUI?事件處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 基于idea把springboot項(xiàng)目部署到docker

    基于idea把springboot項(xiàng)目部署到docker

    這篇文章主要介紹了基于idea把springboot項(xiàng)目部署到docker,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • 詳解如何使用IntelliJ IDEA生成UML圖

    詳解如何使用IntelliJ IDEA生成UML圖

    在軟件開(kāi)發(fā)中,UML(統(tǒng)一建模語(yǔ)言)是一種用于描述、構(gòu)建和文檔化軟件系統(tǒng)的圖形化語(yǔ)言,它幫助開(kāi)發(fā)者以可視化的方式理解系統(tǒng)的結(jié)構(gòu)和行為,手動(dòng)繪制 UML 圖可能既耗時(shí)又容易出錯(cuò),所以本文給大家介紹了如何使用IntelliJ IDEA生成UML圖,需要的朋友可以參考下
    2024-10-10
  • springMVC中基于token防止表單重復(fù)提交方法

    springMVC中基于token防止表單重復(fù)提交方法

    本篇文章主要介紹了springMVC中基于token防止表單重復(fù)提交方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-07-07
  • Springboot項(xiàng)目使用Slf4j將日志保存到本地目錄的實(shí)現(xiàn)代碼

    Springboot項(xiàng)目使用Slf4j將日志保存到本地目錄的實(shí)現(xiàn)代碼

    這篇文章主要介紹了Springboot項(xiàng)目使用Slf4j將日志保存到本地目錄的實(shí)現(xiàn)方法,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • java 獲取項(xiàng)目文件路徑實(shí)現(xiàn)方法

    java 獲取項(xiàng)目文件路徑實(shí)現(xiàn)方法

    以下是對(duì)java中獲取項(xiàng)目文件路徑的實(shí)現(xiàn)方法進(jìn)行了介紹,需要的朋友可以過(guò)來(lái)參考下
    2013-09-09
  • SpringBoot實(shí)現(xiàn)文件上傳功能

    SpringBoot實(shí)現(xiàn)文件上傳功能

    這篇文章主要為大家詳細(xì)介紹了SpringBoot實(shí)現(xiàn)文件上傳功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Java private修飾符失效的原因

    Java private修飾符失效的原因

    在Java編程里,使用private關(guān)鍵字修飾了一個(gè)成員,只有成員內(nèi)部可以訪問(wèn),其余成員都不可訪問(wèn),今天說(shuō)明一下private功能失效的問(wèn)題。
    2020-10-10
  • Java 線程池核心參數(shù)、執(zhí)行流程與實(shí)戰(zhàn)建議全解析

    Java 線程池核心參數(shù)、執(zhí)行流程與實(shí)戰(zhàn)建議全解析

    主要介紹了 Java 線程池:核心參數(shù)、執(zhí)行流程與實(shí)戰(zhàn)建議,我將用最通俗的方式帶你搞懂 Java 線程池,從構(gòu)造函數(shù)開(kāi)始,講透執(zhí)行機(jī)制、參數(shù)配置,再結(jié)合我在真實(shí)項(xiàng)目中的使用經(jīng)驗(yàn),總結(jié)出一套實(shí)戰(zhàn)建議,需要的朋友可以參考下
    2025-04-04
  • 基于javax.validation結(jié)合spring的最佳實(shí)踐

    基于javax.validation結(jié)合spring的最佳實(shí)踐

    這篇文章主要介紹了javax.validation結(jié)合spring的最佳實(shí)踐,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07

最新評(píng)論

巴青县| 泸溪县| 瑞金市| 温宿县| 碌曲县| 温州市| 海宁市| 尤溪县| 镇坪县| 威宁| 高平市| 晋江市| 新野县| 罗甸县| 石泉县| 弥渡县| 武安市| 长武县| 金昌市| 铜川市| 贵阳市| 千阳县| 麻江县| 鄢陵县| 法库县| 拉萨市| 荔波县| 淮南市| 裕民县| 内江市| 林西县| 永城市| 泾川县| 蓬莱市| 奎屯市| 山东省| 合作市| 巨鹿县| 远安县| 瑞丽市| 尼勒克县|