走進底層-Java中的IO流

Java中IO流

在Java編程中,IO流(Input/Output Stream)是非常重要的概念,它為程序的輸入和輸出操作提供了一套強大而靈活的機制。本文將詳細介紹Java中IO流的相關內容,包括其基本概念、分類以及常見類的使用示例。

一、基本概念

Java的IO流用于在程序和外部設備(如文件、網絡連接等)之間傳輸數據。簡單來說,它提供了一種將數據看作是流的形式進行處理的機制,數據可以在不同的源和目標之間以流的方式“流動”。例如,從文件中讀取數據可以看作是從文件這個數據源沿著流的方向將數據流入程序,而向文件中寫入數據則是將程序中的數據通過流的方式流出到文件這個目標。

二、IO流的分類

(一)按流向分類

  • 輸入流(Input Stream):用于從數據源(如文件、鍵盤等)讀取數據到程序中。例如,當我們需要從文件中讀取內容時,就會使用輸入流來實現。常見的輸入流類有InputStreamReader

  • 輸出流(Output Stream):用于將程序中的數據寫入到目標(如文件、顯示器等)。比如,當我們要將程序中的數據保存到文件中時,就會用到輸出流。常見的輸出流類有OutputStreamWriter

(二)按數據傳輸單位分類

  • 字節流:以字節為單位進行數據的傳輸和處理。字節流可以處理任何類型的數據,包括二進制數據(如圖像、音頻、視頻等)。在Java中,字節流的基類是InputStreamOutputStream。例如,FileInputStreamFileOutputStream就是常用的字節流類,用于對文件進行字節級別的讀寫操作。

下面是一個使用字節流讀取文件內容的簡單示例:

import java.io.FileInputStream;
import java.io.IOException;public class ByteReadStreamExample {public static void main(String[] args) {try (FileInputStream fis = new FileInputStream("test.txt")) {int data;while ((data = fis.read())!= -1) {System.out.print((char) data);}} catch (IOException e) {e.printStackTrace();}}
}

在這個示例中,我們使用FileInputStream打開文件test.txt,然后通過循環不斷讀取文件中的字節數據,直到讀取到文件末尾(read方法返回-1)。每次讀取一個字節并將其轉換為字符輸出。

  • 字符流:以字符為單位進行數據的傳輸和處理。字符流主要用于處理文本數據,它會在內部進行字符編碼和解碼的操作,更適用于處理人類可讀的文本信息。在Java中,字符流的基類是ReaderWriter。例如,FileReaderFileWriter就是常用的字符流類,用于對文件進行字符級別的讀寫操作。

下面是一個使用字符流讀取文件內容的簡單示例:

import java.io.FileReader;
import java.io.IOException;public class CharacterReadStreamExample {public static void main(String[] args) {try (FileReader fr = new FileReader("test.txt")) {int data;while ((data = fr.read())!= -1) {System.out.print((char) data);}} catch (IOException e) {e.printStackTrace();}}
}

在這個示例中,我們使用FileReader打開文件test.txt,然后通過循環不斷讀取文件中的字符數據,直到讀取到文件末尾。

  • **緩沖流:**字節流中讀取讀入文件是磁盤之間的單字節讀取,這種頻繁的單字節操作會導致大量系統調用降低讀取速度。而緩沖流內部會維護一個緩沖區(在內存中),從緩沖區讀取取數據,每讀滿8kb再通過基本流寫到硬盤上,因為內存之間讀取速度遠大于硬盤之間讀寫,因此相對于字節流大大加快了傳輸速度。相對于字符流,由于字符流本身存在緩沖區,所以效果沒有字節流那么明顯但是性能提升仍然顯著。緩沖流的使用需要將基本流包裝成緩沖流,下面分別展示一下緩沖字符流和緩沖字節流

    緩沖字節流

    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;public class BufferedByteStreamExample {public static void main(String[] args) {byte[] data = "這是使用緩沖字節流寫入的字節數據。".getBytes();// 寫入字節數據到文件try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("byte.txt"))) {bos.write(data);} catch (IOException e) {e.printStackTrace();}// 從文件中讀取字節數據try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("byte.txt"))) {int byteRead;while ((byteRead = bis.read()) != -1) {System.out.print((char) byteRead);}} catch (IOException e) {e.printStackTrace();}}
    }
    

    緩沖字符流

    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;public class BufferedCharacterStreamExample {public static void main(String[] args) {// 寫入文本到文件try (BufferedWriter writer = new BufferedWriter(new FileWriter("character.txt"))) {writer.write("這是使用緩沖字符流寫入的文本。");writer.newLine();writer.write("第二行文本。");} catch (IOException e) {e.printStackTrace();}// 從文件中讀取文本try (BufferedReader reader = new BufferedReader(new FileReader("character.txt"))) {String line;while ((line = reader.readLine()) != null) {System.out.println(line);}} catch (IOException e) {e.printStackTrace();}}
    }
    

三、常見的IO流類匯總

以下是一些在Java中常用的IO流類:

流類型抽象基類常見子類說明
字節輸入流InputStreamFileInputStreamByteArrayInputStreamDataInputStream用于從不同數據源讀取字節數據
字節輸出流OutputStreamFileOutputStreamByteArrayOutputStreamDataOutputStream用于向不同目標寫入字節數據
字符輸入流ReaderFileReaderBufferedReaderStringReader用于從不同數據源讀取字符數據
字符輸出流WriterFileWriterBufferedWriterStringWriter用于向不同目標寫入字符數據

四、總結

Java中的IO流提供了一種統一而靈活的方式來處理程序與外部設備之間的數據交互。通過了解不同的分類和使用方法,我們可以根據具體的需求選擇合適的IO流類來完成各種輸入和輸出操作。無論是處理文件、網絡通信還是其他數據交換場景,IO流都是Java編程中不可或缺的一部分。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/898873.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/898873.shtml
英文地址,請注明出處:http://en.pswp.cn/news/898873.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Tiny RDM】Redis客戶端工具

Tiny RDM Tiny RDM是一款現代化、輕量級、跨平臺的Redis客戶端,支持Mac、Windows和Linux,目前在Github上已有10kStar。 Github 項目地址: https://github.com/tiny-craft/tiny-rdm 功能特性 極度輕量,基于Webview2&#xff0c…

ctfshow REVERSE re2 萌新賽 內部賽 七夕杯 WP

目錄 re2 萌新賽 flag白給 簽退 數學不及格 內部賽 批量生產的偽劣產品 來一個派森 好好學習 天天向上 屏幕裂開了 七夕杯 逆向簽到 easy_magic re2 ida分析主函數,將flag.txt內容加密寫入enflag.txt 這是密鑰加密過程 標準rc4加密 簡單異或解…

【Linux】線程庫

一、線程庫管理 tid其實是一個地址 void* start(void* args) {const char* name (const char *)args;while(true){printf("我是新線程 %s ,我的地址:0x%lx\n",name,pthread_self());sleep(1);}return nullptr; }int main() {pthread_t tid…

深入剖析 Android Compose 框架的自動動畫:AnimatedVisibility 與 AnimatedContent(二十四)

深入剖析 Android Compose 框架的自動動畫:AnimatedVisibility 與 AnimatedContent 引言 在 Android 應用開發中,動畫是提升用戶體驗的重要手段。它能夠讓界面元素的顯示與隱藏、狀態的切換變得更加自然和流暢,避免生硬的變化給用戶帶來不佳…

文件上傳的小點總結(1)

2.文件類型繞過 問題插入:BP無法攔截本地流量 ①插件限制 不代理的地址列表通常寫有localhost和127.0.0.1,把本地的全都刪掉,然后應用保存。 ②瀏覽器限制 Firefox瀏覽器設置:檢查瀏覽器代理配置和proxy listeners都沒問題后&…

AI基礎01-文本數據采集

本篇文章是學習文本數據的采集,作為人工智能訓練師或者數據分析師有時需要先獲取數據,然后進行數據清洗、數據標注。很明顯數據采集是后續步驟的基礎。 1)數據采集定義 數據采集:data acquisition,DAQ 又稱為數據獲取…

深度學習Python編程:從入門到工程實踐

第一章 Python語言概述與生態體系 1.3 Python在工業界的應用場景 # 示例:使用FastAPI構建RESTful接口 from fastapi import FastAPI from pydantic import BaseModelapp = FastAPI()class Item(BaseModel):name: strprice: float@app.post("/items/") async def cr…

使用CSS3實現炫酷的3D翻轉卡片效果

使用CSS3實現炫酷的3D翻轉卡片效果 這里寫目錄標題 使用CSS3實現炫酷的3D翻轉卡片效果項目介紹技術要點分析1. 3D空間設置2. 核心CSS屬性3. 布局和定位 實現難點和解決方案1. 3D效果的流暢性2. 卡片內容布局3. 響應式設計 性能優化建議瀏覽器兼容性總結 項目介紹 在這個項目中…

HAl庫開發中斷方式接收Can報文的詳細流程

下面給出一個基于 HAL 庫的中斷方式接收 CAN 報文的詳細流程說明,描述每一步的硬件配置、軟件調用和中斷處理機制,而不涉及具體代碼細節,只講解整體原理和步驟: 在使用 HAL 庫時,不需要手動清除中斷標志位。原因如下&…

【讀書筆記】華為《從偶然到必然》

note 華為的成功并非偶然,而是通過IPD體系、投資組合管理、平臺戰略等系統性工具,將研發投資轉化為可持續的商業競爭力。書中強調的“管理即內部因素”理念,揭示了企業規模擴張與管理能力匹配的深層規律,為高科技企業提供了可借鑒…

6.4考研408數據結構圖論核心知識點深度解析

一、最小生成樹(Minimum Spanning Tree) 1.1 Prim算法 易錯點與難點 lowcost數組更新邏輯 錯誤將已加入生成樹的頂點距離重置為0后繼續參與計算,導致后續頂點選擇錯誤未正確處理非連通圖情況,可能陷入死循環(需結合visited數組判斷)示例錯誤:for(int j=0; j<G.vexn…

HashMap添加元素的流程圖

文章目錄 JDK7 vs JDK8 的 HashMap 結構變化Java8 中哈希表的紅黑樹優化機制HashMap 添加元素的完整流程解析1. 計算 key 的哈希值并確定索引2. 檢查該索引位置是否已有元素3. 處理哈希沖突4. 判斷當前存儲結構&#xff08;鏈表還是紅黑樹&#xff09;5. 判斷鏈表長度是否超過 …

Excel(進階篇):powerquery詳解、PowerQuery的各種用法,逆透視表格、雙行表頭如何制作透視表、不規則數據如何制作數據透視表

目錄 PowerQuery工具基礎修改現有數據理規則PowerQuery抓取數據的兩種方式多文件合并透視不同表結構多表追加數據透視追加與合并整理橫向表格:逆透視 數據用拆分工具整理數據算賬齡 不等步長值組合合并文件夾中所有文件PowerQuery處理CSV文件雙行表頭、帶合并單元格如何做數據…

從零開始:使用 Cython + JNI 在 Android 上運行 Python 算法

1. 引言 在 Android 設備上運行 Python 代碼通常面臨性能、兼容性和封裝等挑戰。尤其是當你希望在 Android 應用中使用 Python 編寫的計算密集型算法時&#xff0c;直接運行 Python 代碼可能導致較高的 CPU 占用和較差的性能。為了解決這個問題&#xff0c;我們可以使用 Cytho…

請為下面的html添加一個修改按鈕,以便對書名、價格進行修改

下面的HTML段落&#xff0c;在書名和價格輸入錯誤的情況下&#xff0c;無法進行修改。添加一個按鈕&#xff0c;對已經輸入的信息進行修改。 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title></…

FFmpeg + ?Qt? 簡單視頻播放器代碼

一個基于 ?FFmpeg 4.x? 和 ?Qt? 的簡單視頻播放器代碼示例&#xff0c;實現視頻解碼和渲染到 Qt 窗口的功能。 1&#xff09;ffmpeg庫界面&#xff0c;視頻解碼支持軟解和硬解方式。 2&#xff09;QImage/QPixmap顯示視頻圖片。 ?1. Qt 項目配置&#xff08;.pro 文件&…

如何在百度搜索上刪除與自己名字相關的資料

個人信息的網絡足跡如同一張無形的網&#xff0c;將我們與世界的每一個角落緊密相連。然而&#xff0c;當某些與自己名字相關的資料不再希望被公眾輕易檢索到時&#xff0c;如何在百度搜索中有效“隱身”&#xff0c;成為了一個亟待解決的問題。面對復雜多變的網絡環境&#xf…

WebSocket:現代實時通信協議的深度解析與實踐

一、背景與演進歷程 1.1 傳統實時通信的困境 // 典型的HTTP輪詢偽代碼 while(true) {auto response http_client.get("/messages");if(response.has_data()) process(response);std::this_thread::sleep_for(1s); // 固定間隔輪詢 } 高延遲&#xff1a;輪詢間隔導…

[貪心算法]最長回文串 增減字符串匹配 分發餅干

1.最長回文串 我們可以存下每個字母的個數&#xff0c;然后分類討論 如果是奇數就減一加到結果中如果是偶數就直接加入即可 最后判斷長度跟原字符串的差距&#xff0c;如果小于原數組說明有奇數結果1 class Solution { public:int longestPalindrome(string s) {int ret0;//1.計…

STM32 的tf卡驅動

基于STM32的TF卡驅動的基本實現步驟和相關代碼示例,主要使用SPI接口來與TF卡進行通信。 硬件連接 將TF卡的SPI接口與STM32的SPI引腳連接,通常需要連接SCK(時鐘)、MOSI(主出從入)、MISO(主入從出)和CS(片選)引腳。 軟件實現 初始化SPI 配置SPI的工作模式、時鐘頻率…