国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Java基礎(chǔ)】I/O流 —— Java中的流都需要關(guān)閉嗎?

這篇具有很好參考價值的文章主要介紹了【Java基礎(chǔ)】I/O流 —— Java中的流都需要關(guān)閉嗎?。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

一、為什么要關(guān)閉流?

涉及到對外部資源的讀寫操作,包括網(wǎng)絡(luò)、硬盤等等的I/O流,如果在使用完畢之后不關(guān)閉,會導(dǎo)致資源泄漏以及可能會引起文件鎖定等問題。因此,需要在使用完畢之后關(guān)閉流。
關(guān)閉流是一種資源釋放機(jī)制,意味著在使用完畢之后歸還系統(tǒng)的內(nèi)存、CPU或者網(wǎng)絡(luò)等資源,避免資源長時間占用。常見的關(guān)閉流的方法是調(diào)用close()方法,該方法會將相關(guān)的資源釋放,可以有效避免導(dǎo)致資源泄漏的問題。
需要注意的是,關(guān)閉流的時機(jī)非常重要,過早關(guān)閉可能會影響正常操作,而過晚關(guān)閉則可能導(dǎo)致資源泄漏。在實際開發(fā)的時候,使用完畢之后應(yīng)該及時關(guān)閉流。在Java 7之后引入了try-with-resources語法,可以在語法層面上自動關(guān)閉流,用法是:

/* 讀取文件 */
File file = new File("opsLiya.json");
try (FileInputStream fileInputStream = new FileInputStream(file)) {
    /* 操作 */
}catch (IOException e){
    /* 異常處理 */
}

當(dāng)然也可以使用傳統(tǒng)的finally代碼塊關(guān)閉流:

InputStream inputStream = null;
try {
    inputStream = new FileInputStream("opsLiya.txt");
    /* 操作 */
} catch (IOException e) {
    /* 異常處理 */
} finally {
    if (inputStream != null) {
        try {
            inputStream.close();
        } catch (IOException e) {
            /* 異常處理 */
        }
    }
}

二、close方法和flush方法

1.使用close方法

當(dāng)我們使用輸入流的時候,如FileInputStream,對流進(jìn)行關(guān)閉時,直接調(diào)用close方法即可。
close方法的底層如下:
java為什么要關(guān)閉流,java,jvm

這個close0方法的底層是一個native方法(本地方法)
java為什么要關(guān)閉流,java,jvm

此方法進(jìn)行具體的關(guān)閉操作。

2.使用flush方法

當(dāng)我們使用輸出流的時候(即寫入數(shù)據(jù)到文件或者網(wǎng)絡(luò)中),如BufferedOutputStream,對流進(jìn)行關(guān)閉時,需要先調(diào)用flush方法再調(diào)用close方法。
我們進(jìn)入到BufferedOutputStream的flush方法的源碼可以看到:
java為什么要關(guān)閉流,java,jvm

方法注釋大概的意思是:刷新此緩沖輸出流。這將強(qiáng)制將任何緩沖的輸出字節(jié)寫入底層輸出流。
也就是說,在關(guān)閉流前調(diào)用flush方法,會將緩存中的數(shù)據(jù)強(qiáng)行刷新到輸出目標(biāo)中,避免數(shù)據(jù)丟失

三、流按指向分類

Java中的流在指向上可以分為兩大類,分別是用于讀寫內(nèi)存的流用于讀寫外部資源(文件、網(wǎng)絡(luò)等)的流。
比如,用于讀寫內(nèi)存的流又可以根據(jù)操作對象分為兩類,如下:

  1. 操作對象是byte數(shù)組:
    1. ByteArrayInputStream
    2. ByteArrayOutputStream
  2. 操作對象是字符串:
    1. StringReader
    2. StringWriter

而用于讀寫外部資源的流,有如下這些:

  1. FileInputStream和 FileOutputStream:用于字節(jié)流讀寫文件;
  2. FileReader和FileWriter:用于字符流讀寫文件;
  3. BufferedInputStream和BufferedOutputStream:用于緩存讀寫字節(jié)流提升IO性能;
  4. BufferedReader和BufferedWriter:用于緩存讀寫字符流提升IO性能;
  5. DataInputStream和DataOutputStream:可以用于讀寫整數(shù)、浮點(diǎn)數(shù)等基本類型的字節(jié)流;
  6. ObjectInputStream和ObjectOutputStream:用于讀寫Java對象的字節(jié)流;
  7. Socket和ServerSocket:用于網(wǎng)絡(luò)數(shù)據(jù)傳輸;
  8. HttpURLConnection:用于HTTP請求等。

四、不用關(guān)閉的流

對于Java中的ByteArrayInputStreamByteArrayOutputStream,它們都是在內(nèi)存中進(jìn)行讀寫操作,不需要涉及到底層的外部資源(如文件、網(wǎng)絡(luò)等等),因此在使用完畢后不一定需要顯式地調(diào)用close方法去關(guān)閉。它們占用的內(nèi)存將會被JVM自動回收。
我們可以去到ByteArrayInputStream的close方法實現(xiàn)是一個空方法,如下:
java為什么要關(guān)閉流,java,jvm

當(dāng)然,我們也可以手動釋放它們占用的內(nèi)存——使用try-with-resources語法:

byte[] data = new byte[]{1, 2, 3, 4, 5};
try (ByteArrayInputStream bis = new ByteArrayInputStream(data);
  ByteArrayOutputStream bos = new ByteArrayOutputStream()) {
 /* 操作 */
} catch (IOException e) {
 /* 異常處理 */
}

注意:雖然它的close方法是空實現(xiàn),但是我們?yōu)榱吮WC代碼的可讀性和健壯性,仍然應(yīng)該在使用完畢后及時關(guān)閉它們。文章來源地址http://www.zghlxwxcb.cn/news/detail-527297.html

到了這里,關(guān)于【Java基礎(chǔ)】I/O流 —— Java中的流都需要關(guān)閉嗎?的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • SRS關(guān)閉無人觀看的流

    這里需要使用到SRS自身自帶的鉤子回調(diào)功能,配置文件中有標(biāo)注: Hook函數(shù): 分為on_publish、on_play、on_stop、on_unpublish、on_dvr等類別; 其中主要介紹on_play、on_stop on_play: 主要用于用戶在對srs拉流進(jìn)行播放的時候觸發(fā); on_stop: 主要用于用戶在停止播放的時候觸發(fā); 要做到關(guān)閉

    2024年02月21日
    瀏覽(10)
  • Java核心技術(shù)知識點(diǎn)筆記—Java SE 8的流庫(二)

    前言:約簡是一種終結(jié)操作(terminal operation),它們會將流約簡為可以在程序中使用的非流值。例如:Stream中的count方法,返回流中元素的數(shù)量。 1、簡單約簡舉例: (1)OptionalT max(Comparator? super T comparator):使用給定的comparator規(guī)則,產(chǎn)生流的最大元素,如果流為空,則產(chǎn)生一

    2023年04月18日
    瀏覽(18)
  • Java中的實體類為什么要 implements Serializable?

    Java中的實體類為什么要 implements Serializable?

    1. 序列化和反序列化 首先來解釋一下什么是序列化和反序列化: 序列化 :把對象轉(zhuǎn)換為字節(jié)序列的過程稱為對象的序列化。 反序列化 :把字節(jié)序列恢復(fù)為對象的過程稱為對象的反序列化。 在 Java 和其他語言進(jìn)行通信的時候,需要將對象轉(zhuǎn)化成一種通用的格式例如Json( 轉(zhuǎn)換

    2023年04月20日
    瀏覽(11)
  • Java基礎(chǔ):為什么hashmap是線程不安全的?

    HashMap 是線程不安全的主要原因是它的內(nèi)部結(jié)構(gòu)和操作不是線程安全的。下面是一些導(dǎo)致 HashMap 線程不安全的因素: 非同步操作:HashMap 的操作不是線程同步的,也就是說,在多線程環(huán)境下同時對 HashMap 進(jìn)行讀寫操作可能會導(dǎo)致數(shù)據(jù)不一致的問題。 非原子操作:HashMap 的操作

    2024年02月10日
    瀏覽(21)
  • 為什么商業(yè)基礎(chǔ)軟件需要開源

    為什么商業(yè)基礎(chǔ)軟件需要開源

    Bytebase 本身是一家商業(yè)軟件公司,而作為最核心資產(chǎn)的代碼從 Day 0 卻是開源的。同時我們還是 star-history.com 的運(yùn)營者,大家在各種開源渠道會看到它生成的圖: 一直以來,常會被別人問起的一個問題,就是為什么 Bytebase 要開源。結(jié)合這 2 年多的實戰(zhàn)經(jīng)驗,一次性把能想到的

    2024年02月13日
    瀏覽(29)
  • 【Day1】零基礎(chǔ)學(xué)java--》記事本運(yùn)行java程序,通熟語言讓你徹底明白為什么配置java環(huán)境變量

    【Day1】零基礎(chǔ)學(xué)java--》記事本運(yùn)行java程序,通熟語言讓你徹底明白為什么配置java環(huán)境變量

    前言: 大家好,我是 良辰丫 ,從今天開始我將協(xié)同大家一起從零基礎(chǔ)學(xué)習(xí)Java,期待與君為伴,走向海的彼岸。?????? ??個人主頁:良辰針不戳 ??所屬專欄:EveryDay零基礎(chǔ)學(xué)java ??勵志語句:生活也許會讓我們遍體鱗傷,但最終這些傷口會成為我們一輩子的財富。 ??期

    2024年02月11日
    瀏覽(13)
  • 什么是 Java 中的數(shù)據(jù)庫連接池?為什么使用連接池來管理數(shù)據(jù)庫連接?

    什么是 Java 中的數(shù)據(jù)庫連接池?為什么使用連接池來管理數(shù)據(jù)庫連接?

    數(shù)據(jù)庫連接池(database connection pool)是在 Java 中用于管理數(shù)據(jù)庫連接的一種技術(shù)。它的主要目的是提高數(shù)據(jù)庫連接的重用性和性能。在傳統(tǒng)的數(shù)據(jù)庫連接方式中,每次與數(shù)據(jù)庫建立連接時都需要進(jìn)行一系列的網(wǎng)絡(luò)通信和身份驗證操作,這樣的開銷較大并且會影響應(yīng)用程序的性

    2024年02月06日
    瀏覽(33)
  • 什么是OSPF?為什么需要OSPF?OSPF基礎(chǔ)概念

    什么是OSPF?為什么需要OSPF?OSPF基礎(chǔ)概念

    開放式最短路徑優(yōu)先OSPF(Open Shortest Path First)是IETF組織開發(fā)的一個基于鏈路狀態(tài)的內(nèi)部網(wǎng)關(guān)協(xié)議(Interior Gateway Protocol)。 目前針對IPv4協(xié)議使用的是OSPF Version 2(RFC2328);針對IPv6協(xié)議使用OSPF Version 3(RFC2740)。如無特殊說明,本文中所指的OSPF均為OSPF Version 2。 目錄 為什么

    2024年01月20日
    瀏覽(22)
  • 學(xué)習(xí)大數(shù)據(jù),所需要的java(Maven)基礎(chǔ)(1)

    學(xué)習(xí)大數(shù)據(jù),所需要的java(Maven)基礎(chǔ)(1)

    maven是干什么用,的我們先通過企業(yè)開發(fā)中的時間需求來看一看那些方面是我們技術(shù)不足。 java項目,每個項目需要復(fù)制一份jar包,Maven后只在本地倉庫中保存一份 java項目,自己去網(wǎng)上找jar包,費(fèi)勁心血找的jar包里面有的時候并沒有你需要的哪個類。 Maven就會自動從倉庫進(jìn)行

    2024年04月26日
    瀏覽(18)
  • 學(xué)習(xí)大數(shù)據(jù),所需要的java(Maven)基礎(chǔ)(2)

    學(xué)習(xí)大數(shù)據(jù),所需要的java(Maven)基礎(chǔ)(2)

    以對Spring的jar包依賴為例:Spring的每一個版本中都包含spring-context,springmvc等jar包。我們應(yīng)該導(dǎo)入版本一致的Spring jar包,而不是使用4.0.0的spring-context的同時使用4.1.1的springmvc。 問題是如果我們想要將這些jar包的版本統(tǒng)一升級為4.1.1,是不是要手動一個個修改呢?顯然,我們有

    2024年04月29日
    瀏覽(42)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包