主頁 > 後端開發 > IO流(Java)

IO流(Java)

2021-11-14 13:47:08 後端開發

目錄

一、概述

二、File類

2.1作用

2.2構造方法

2.3常用方法

2.3.1創建方法

2.3.2判斷方法

2.3.3獲取方法

2.3.4洗掉方法

三、IO流

3.1分類

3.2位元組流

3.2.1位元組輸入流(InputStream)

3.2.2位元組輸出流(OutputStream)

3.3字符流

3.3.1字符輸入流(Reader)

FileReader類

FileReader讀取字符資料

3.3.2字符輸出流(Writer)

共性方法:

FileWriter類

案例:使用FileWiter和FileReader實作對文本檔案的復制

四、緩沖流

4.1位元組緩沖流

4.2字符緩沖流

總結:


一、概述

Hello,各位觀眾老爺,又到了每周的分享時間了,這周小的學習了Java中的IO流,在這里...算了不廢話了,直接開始!

IO流其實在我理解看來就分成三部分,即I、O、流,I即Input,輸入,O即Output,輸出,流是資料傳輸的總稱,

更通俗一點、把自己想成計算機的記憶體,以第一人稱去理解這個問題,比如人要看書對吧,那么把書中的知識讀取到自己的大腦(也就是記憶體)中這個操作就是輸入,這個操作類比到計算機中就是從硬碟上讀取資料到記憶體中,也就是IO流中的I(Input),

同理,我們有時候要博客對吧,那么寫博客這個操作是不是人把自己大腦(也就是記憶體)中想的東西寫到紙上,那這個操作類比到計算機上就是把記憶體中的資料寫到硬碟上,即IO流中的O(Output),

好了,上述是本人對IO流的一個最基本的理解,主要是助于快速理清Input和Output的區別,如果有錯誤的地方,請各位觀眾老爺指出,接下來正式進入IO流的探討了!

二、File類

在計算機中,對于資料的存盤都離不開檔案,IO流也是對檔案進行操作,所以我們先來探討File類,

2.1作用

File類是檔案和目錄名路徑的抽象表示形式,其封裝的并不是一個真正存在的檔案,而僅僅是一個路徑名,可以存在,也可以不存在,

2.2構造方法

File(String pathName)根據字串路徑創建一個File物件
File(String parent,String child)

根據字串父級路徑和子級路徑創建File物件

File(File parent,String child)

根據File型別父級路徑和字串子級路徑創建File物件

2.3常用方法

2.3.1創建方法

boolean createNewFile()

創建一個新檔案
boolean mkdir() 創建單級檔案夾
boolean mkdirs()創建多級檔案夾

2.3.2判斷方法

boolean isDirectory()

判斷是否是檔案夾
boolean isFile() 判斷是否是檔案
boolean exists() 判斷檔案是否存在

2.3.3獲取方法

String getAbsolutePath()

獲取絕對路徑
String getPath()獲取構造方法中的路徑
String getName()獲取檔案或檔案夾的名稱
String[] list()獲取目錄下所有內容,回傳字串陣列
File[] listFiles()獲取目錄下所有內容,回傳File物件陣列

這里要提兩個概念:相對路徑絕對路徑

相對路徑: 是一個簡化的路徑,不以根路徑為開頭,如:\\a.txt ,

絕對路徑:一個完整的路徑,以根路徑開頭,如:D:\\a.txt,

2.3.4洗掉方法

boolean delete()

洗掉檔案或檔案夾(檔案夾必須為空)

注:當待洗掉檔案夾中還有檔案夾或者檔案時,是不能直接洗掉此檔案夾的,必須!!!把該檔案夾以下的檔案和檔案夾全部洗掉之后才能洗掉此檔案夾,

三、IO流

了解了File類時候,我們可以正式開始今天的探討內容IO流了,在前面本人對IO流作了一個大概的講述,下面我們來詳細探討!

3.1分類

資料流向輸入流輸出流

輸入流:把資料從硬碟上讀取到記憶體中,

輸出流: 把資料從記憶體中寫出到硬碟上,

資料型別位元組流字符流

位元組流:讀寫資料以位元組為單位的流,

字符流:讀寫資料以字符為單位的流,

在實際應用中,檔案的上傳下載以及傳輸是比較常見的,

以下兩張圖概括性的描述了位元組流和字符流:

位元組流:

字符流:

看完這兩張圖之后,我們接著再來分別對位元組流和字符流進行探討,

3.2位元組流

3.2.1位元組輸入流(InputStream)

InputStream:這個抽象類是表示位元組輸入流的所有類的超類,

位元組輸入流的共性方法;

void close() 關閉此流并釋放與此流相關的資源,
abstract int read()從輸入流讀取一個字符,
int read(byte[] b)該方法回傳的int值代表的是讀取了多少個位元組,讀到幾個回傳幾個,讀取不到回傳-1

FileInputStream

檔案輸入流,讀取的是位元組,

構造方法:

FileInputStream(File file)通過打開與實際檔案的連接來創建一個 FileInputStream ,該檔案由檔案系統中的 File物件 file命名,
FileInputStream(String name)通過打開與實際檔案的連接來創建一個FileInputStream ,該檔案由檔案系統中的路徑名name命名,

FileInputStreram讀取位元組資料

1.一次讀一個字符資料

2.一次讀一個位元組陣列的資料

提問:如何實作圖片的復制呢?

3.2.2位元組輸出流(OutputStream)

位元組輸出流,將資料以位元組形式寫到檔案中,

構造方法:

public FileOutputStream(File file)以File物件為引數創建物件
public FileOutputStream(String name)以字串名稱為引數創建物件

OutputStream寫資料:

write(int b) 一次寫一個位元組資料
write(byte[] arr)一次寫一個位元組陣列
write(byte[] arr,int index,int len)寫位元組陣列的一部分

看到這里,我們就可以解決剛才的提問了,

現在我們再次把目光轉回剛才的問題:如何實作文本檔案的復制,對了,我們可以先創建FileInputStream物件先讀取需要復制的文本檔案,再創建FileOutputStream物件關聯需要寫出的檔案,通過回圈進行讀和寫的操作,最后釋放資源,

步驟:

??????? ???????

具體代碼:

public class FosTest {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("D:\\mytemp\\mn.jpg");
        //創建位元組輸入流物件,關聯檔案.這里的檔案為自己需要復制檔案的路徑
        FileOutputStream fos = new FileOutputStream("path08\\mytemp\\mn.jpg");
        //創建位元組輸出流物件,關聯檔案
        //回圈讀寫操作
        int len;
        byte[] bys = new byte[1024];
        while ((len = fis.read(bys))!=-1){
            fos.write(bys,0,len);
        }

        //釋放資源
        fis.close();
        fos.close();
    }
}

兩個問題:

??????? ??????? ???????

3.3字符流

3.3.1字符輸入流(Reader)

讀取字符資訊到記憶體中,

字符輸入流的共性方法:

public void close()關閉此流并釋放與此流相關聯的任何系統資源,
int read()從輸入流讀取一個字符,
int read(char[] cbuf)從輸入流中讀取一些字符,并將它們存盤到字符陣列cbuf中

FileReader類

構造方法:

FileReader(File file) 創建一個新的 FileReader ,給定要讀取的File物件
FileReader(String fileName)創建一個新的 FileReader ,給定要讀取的檔案的字串名稱,

FileReader讀取字符資料

3.3.2字符輸出流(Writer)

將指定的字符資料寫到檔案中,

共性方法:

Write(int b)寫一個字符
write(char[] c)寫一個字符陣列
write(char[] c,int off,int len)寫一個字符陣列的一部分
write(String s)寫一個字串
write(String s,int off,int len)寫一個字串的一部分·
flush()重繪該流的緩沖
close()釋放資源,先重繪

FileWriter類

構造方法:

FileWriter(File file)創建一個新的 FileWriter,給定要讀取的File物件,
FileWriter(String fileName)創建一個新的 FileWriter,給定要讀取的檔案的名稱

寫資料方法:

案例:

public class FwTest {
    public static void main(String[] args) throws IOException {
        //創建字符輸出流物件
        FileWriter fw = new FileWriter("D:\\mytemp\\a.txt");
        //續寫
        //FileWriter fw = new FileWriter("D:\\mytemp\\a.txt",true);

        //寫資料
        fw.write(97);
        fw.write("\r\n");//換行操作
        fw.write("hello");

        //釋放資源
        fw.close();

    }
}

注:FileWiter中的換行是書寫"\r\n", 續寫則是在創建物件時加上true,

案例:使用FileWiter和FileReader實作對文本檔案的復制

這里只使用了一種方式,其他方式請各位觀眾老爺自己動動小手,嘗試一下,

public class FwTest {
    public static void main(String[] args) throws IOException {
        //創建字符輸出流物件
        FileWriter fw = new FileWriter("path08\\mytemp\\read.txt",true);
        FileReader fr = new FileReader("D:\\mytemp\\read.txt");

        //回圈讀寫檔案
        int len;
        char[] ch = new char[1024];
        while ((len = fr.read(ch))!=-1){
            fw.write(ch,0,len);
        }
        fw.flush();
        //釋放資源
        fw.close();
        fr.close();
    }
}

四、緩沖流

緩沖流也叫高效流,是一個增強流,

4.1位元組緩沖流

構造方法:

public BufferedInputStream(InputStream in)創建一個新的緩沖輸入流,引數是InputStream
public BufferedOutputStream(OutputStream out)創建一個新的緩沖輸出流,引數是OutputStream

舉例:

public class BufferTest {
    public static void main(String[] args) throws IOException {
        //創建一個位元組緩沖輸入流物件
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("path08\\mytemp\\read.txt"));
        
        //創建一個位元組緩沖輸出流物件
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\mytemp\\read.txt"));
    }
}

4.2字符緩沖流

構造方法:

public BufferedReader(Reader in)創建一個緩沖輸入流物件,引數是Reader
public BufferedWriter(Writer out)創建一個緩沖輸出流物件,引數是Writer

舉例:

public class BufferTest {
    public static void main(String[] args) throws IOException {
        //創建一個字符緩沖輸入流物件
        BufferedReader br = new BufferedReader(new FileReader("D:\\mytemp\\read.txt"));
        
        //創建一個字符緩沖輸出流物件
        BufferedWriter bw = new BufferedWriter(new FileWriter("path08\\mytemp\\read.txt"));
    }
}

字符緩沖流特有方法 :

BufferedReader: readLine(): 讀取一行資料,讀到最后回傳空值,

BufferedWriter: newLine():換行,

總結:

緩沖流的作用,本人的理解就是高效,他的讀寫速度比基本流要快,至于驗證,就交給各位觀眾老爺了,這里提供一個驗證思路,先使用基礎流讀寫一個檔案,在讀之前我們使用System.currentTimeMillis()方法,再寫完檔案之后,我們再次使用此方法獲取時間,然后兩者相減,我們就能得到其中的運行時間了,同理,我們使用緩沖流再次讀取檔案,比較時間,我們就可以看出兩者時間的差距了,

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/356973.html

標籤:java

上一篇:JVM垃圾收集(GC)機制和GC演算法

下一篇:Java面向物件編程詳解

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more