日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java IO流 详解(字节流、字符流、输入流、输出流、刷新)

發布時間:2023/12/29 java 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java IO流 详解(字节流、字符流、输入流、输出流、刷新) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、IO流概述

? ? ? ? ? I:Input輸入? 從其他存儲設備【讀】數據到內存中? 輸入過程
????????O:OutPut輸出? 從內存中【寫】數據到其他存儲設備? 輸出過程

二、IO流分類

? ? ? ? 1.根據數據的類型分為:

? ? ? ? ? ? ? ? 【字節流】和【字符流】

????????????????【字節流】:以字節為基本單位,讀寫數據的流
??? ????????????????????????字節輸入流:以字節為基本單位,讀數據
??? ????????????????????????字節輸出流:以字節為基本單位,寫出數據
????????????????【字符流】:以字符為基本單位,讀寫數據的流
??????????????????? ????????字符輸入流:以字符為基本單位,讀數據
??????????????????? ????????字符輸出流:以字符為基本單位,寫出數據

? ? ? ? 2.根據數據的流向分為:

? ? ? ? ? ? ? ? 【輸入流】和【輸出流】

? ? ? ? ? ? ? ? 【輸入流】:把數據從 其他存儲設備 上【讀取】到 內存 中的流
?? ????????????????????????字節輸入流:以字節為基本單位,讀數據
?? ????????????????????????字符輸入流:以字符為基本單位,讀數據
? ? ? ? ? ? ? ? 【輸出流】:把數據從 內存 中【寫出】到 其他 存儲 設備中的流
?????????????????????????? 字節輸出流:以字節為基本單位,寫出數據
?????????????????????????? 字符輸出流:以字符為基本單位,寫出數據

? ? ? ? 3.IO流的頂層父類

? ? ? ? ? ? ? ? - 字節輸入流:頂層父類:InputStream --> 抽象類?? 常見子類:FileInputStream
????????????????- 字節輸出流:頂層父類:OutputStream --> 抽象類?? 常見子類:FileOutputStream
????????????????- 字符輸入流:頂層父類:Reader --> 抽象類?? 常見子類:FileReader
????????????????- 字符輸出流:頂層父類:Writer --> 抽象類?? 常見子類:FileWriter

?

三、字節輸出流OutPutStream

????????OutputStream 輸出流頂層父類
??????????? java.io.OutputStream抽象類是所有【字節輸出流】的父類,用來【寫】出字節輸出流


??????????? 成員方法:

??????????????? - public void close():關閉次輸出流并釋放與此流相關聯的任何系統資源
? ? ? ? ? ? ? ? - close方法,當完成流的操作時,必須調用此方法,釋放系統資源,否則數據寫入不完整或消失
??????? ????????- public abstract void write(int b):將指定的字節寫入輸出流【一個字節一個字節寫入到硬盤】
??????????????? - public void write(byte b[]):將 b.length字節從指定的字節數組寫入到此輸出流【以字節數組的形式寫入到硬盤】
??????????????? - public void write(byte b[],int off, int len):將指定范圍的字節數組的字節數據寫到此輸出流中【將字節數組中某一段字節數據寫到硬盤】

? ? ? ? ? ?方法逐個演示:

? ? ? ? ? ? ? ? 1.寫出單個字節數據

// 1.創建字節輸出流對象 路徑文件必須真實存在FileOutputStream fos1 = new FileOutputStream("day12_File類與遞歸&IO流&字符流&字節流\\resources\\a.txt");// 2.寫出 單個字節的數據fos1.write(72);// 寫入的一個字節數據,我們是往文本文檔寫入字節數據,但是因為是文本類型,需要將字節數據轉換成文本數據,文本就是字符fos1.write(105);fos1.write(33);// 3.關閉流,釋放資源fos1.close();

? ? ? ? (運行結束,會在對應的文件中生成對應的字節,代碼中寫入的數字為ASCII碼,每個數字對應一個字母)

? ? ? ? ? ? ? ? ?2.寫出字節數組數據

//1.創建字節輸出流對象 真實存在的路徑FileOutputStream fos1 = new FileOutputStream("day12_File類與遞歸&IO流&字符流&字節流\\resources\\a.txt");// 2.創建字節數組byte[] bytes = {97,98,99};// 3.寫出字節數組中的字節數據fos1.write(bytes);// 4.關閉流,釋放資源fos1.close();

?(運行結束,會在對應的文件中生成對應的字節,代碼中寫入的數字為ASCII碼,每個數字對應一個字母)

????????????????3.寫出指定范圍字節數組的數據

// 1.創建字節輸出流對象 真實存在的路徑FileOutputStream fos1 = new FileOutputStream("day12_File類與遞歸&IO流&字符流&字節流\\resources\\a.txt");// 2.創建字節數組byte[] bytes = {97,98,99};// 3.寫出字節數組中的字節數據fos1.write(bytes,1,2);// 4.關閉流,釋放資源fos1.close();

?(運行結束,會在對應的文件中生成對應的字節,代碼中寫入的數字為ASCII碼,每個數字對應一個字母)

? ? ? ? ? ? ? ??4.數組追加續寫

// 1.創建字節輸出流對象 真實存在的路徑FileOutputStream fos1 = new FileOutputStream("day12_File類與遞歸&IO流&字符流&字節流\\resources\\a.txt",true);// 2.創建字節數組byte[] bytes = {97,98,99,100};// 3.寫出字節數組中的字節數據fos1.write(bytes,1,2);// 4.關閉流,釋放資源fos1.close();

? ? ? ? ? ? ? ?

(這里續寫是沿著第三個練習續寫的,第三個練習寫了 “bc”,這里也續寫一個“bc”,不續寫的話,同一個文件的數據會被覆蓋)

????????5.寫出換行

/** 需求: 寫一首詩* 鵝鵝鵝,* 曲項向天歌。* 白毛浮綠水,* 紅掌撥清波。* */// 1.創建字節輸出流對象,關聯到 day12\resources\a.txt 真實存在FileOutputStream fos1 = new FileOutputStream("day12_File類與遞歸&IO流&字符流&字節流\\resources\\a.txt");// 2.創建字節數組byte[] bytes = {97,98,99,100};// 3.寫出字節數組中的字節數據fos1.write("鵝鵝鵝,".getBytes());fos1.write("\r\n".getBytes());fos1.write("曲項向天歌。".getBytes());fos1.write("\r\n".getBytes());fos1.write("白毛浮綠水,".getBytes());fos1.write("\r\n".getBytes());fos1.write("紅掌撥清波。".getBytes());// 4.關閉流,釋放資源fos1.close();

四、字節輸入流InputStream

????????java.io.InputStream 抽象類,給類是所有字節輸入流的父類,用于讀取字節數據

? ? ? ? 構造方法:

????????????????概述:java.io.FileInputStream類是InputStream的實現子類,表示字節輸入流,用于讀取數據

????????????????- public FileInputStream(String name):通過打開與實際文件的連接來創建一個字節輸入流對象,該文件由文件系統的路徑名 name命名
????????????????- public FileInputStream(File file):通過打開與實際文件的連接來創建一個字節輸入流對象,該文件由文件系統中的文件對象file命名

? ? ? ? 成員方法:

????????????????- public void close():關閉輸入流并釋放與此流相關的任何系統資源
????????????????- public abstract int read():從輸入流讀取數據的下一個字節,每次讀取一個字節
? ? ? ? ? ? ? ? - public int read(byte b[]):從輸入流讀取一些字節數據,并將它們存儲到字節數住b中

? ? ? ? 方法逐一演示:

? ? ? ? ? ? ? ??1.構造方法

// 創建字節輸入流對象,關聯數據源文件路徑 真實存在的路徑FileInputStream fileInputStream1 = new FileInputStream("day12_File類與遞歸&IO流&字符流&字節流\\resources\\a.txt");FileInputStream fileInputStream2 = new FileInputStream(new File("day12_File類與遞歸&IO流&字符流&字節流\\resources\\a.txt"));// 創建字節輸入流對象,關聯數據源文件路徑 不存在的路徑,會報異常:系統找不到指定的文件FileInputStream fileInputStream3 = new FileInputStream("day12_File類與遞歸&IO流&字符流&字節流\\resources\\a1.txt");

? ? ? ? ? ? ? ? 2.讀取單個字節數據

// 創建字節輸入流對象,關聯數據源文件路徑 真實存在的FileInputStream fileInputStream1 = new FileInputStream("day12_File類與遞歸&IO流&字符流&字節流\\resources\\a.txt");// 定義一個Int類型的變量,用來存儲讀取到的數據int len;// 使用循環的方式讀取數據while ((len = fileInputStream1.read()) != -1){// while循環中的條件,fis每讀取一個字節,會優先復制給len變量,然后拿len變量與 -1 進行比較System.out.print((char) len);}// 關閉流fileInputStream1.close();

????????

? ? ? ??(輸出語句中如果不加? char? 強轉字符的話,打印出來的就是ASCII碼,需要強轉成字符類型)

? ? ? ? ? ? ? ? 3.讀取字節數組長度的字節數據

public static void main (String[] args) throws IOException {// 創建字節輸入流對象,關聯數據源文件路徑 真實存在的FileInputStream fileInputStream1 = new FileInputStream("day12_File類與遞歸&IO流&字符流&字節流\\resources\\a.txt");// 創建byte[] 數組,長度暫定為2,用來存儲讀取到的字節數據byte[] bytes = new byte[8192];// 定義一個int類型的變量,用來存儲讀取到的字節個數int len;//while循環的方式來遍歷讀取本中的數據while ((len = fileInputStream1.read(bytes)) != -1){System.out.println(new String(bytes,0,len));}// 關閉流fileInputStream1.close();/** 使用數組讀取的話,每次讀取多個字節,減少系統之間的IO操作次數,從而提高了讀寫的效率,建議開發中如此使用* */}

????????

? ? ? ? ? ? ? ? (因為數組不能強轉,所以用來String的一個方法用來打印數組)
???

五、字節流操作文本文件可能存在的問題

? ? ? ? ? 1.當使用字節流讀取文本文檔的時候,可能會有一些問題,遇到中文字符的時候,可能不會顯示完整的字符
? ? ? ? ? 2.因為一個中文符可能占用多個字節存儲,所以Java提供了字符流類,專門來操作文本文件,以字符為單位讀寫數據

六、字符輸入流Reader

????????java.io.Reader類:抽象類,表示用于讀取字符流的所有類的超類,可以讀取字符信息到內存中

? ? ? ? 構造方法:

? ? ? ? ? ? ? ? 概述:java.io.FileReade類,繼承Reader類,表示字符輸入流,用來讀取字符數據對象

?????????????????- public FileReader(String fileName):FileReader類對象,給定要讀取的文件的名稱
? ? ? ? ? ? ? ? ?- public FileReader(File file):FileReader類對象,給定要讀取的file文件的名稱

? ? ? ? 成員方法:

????????????????- public abstract void close():關閉此流并釋放與此流相關的任何系統資源
????????????????- public int read():從輸入流讀取一個字符,讀取到末尾返回 -1
????????????????- public int read(char cbuf[]):從輸入流中讀取一些數據,并將它們存儲到字符數組cbuf中

? ? ? ? ?方法逐一演示:

????????????????(字符的輸入輸出流? ?和? ?字節的輸入輸出流? ?一樣的效果,有些地方就不加以贅述了)

? ? ? ? ? ? ? ??1.構造方法

// 文件真實存在FileReader fr1 = new FileReader("day12_File類與遞歸&IO流&字符流&字節流\\resources\\a.txt");// 文件不存在,會報出異常FileReader fr2 = new FileReader("day12_File類與遞歸&IO流&字符流&字節流\\resources\\a.txt");

? ? ? ? ? ? ? ? 2.讀取單個字符數據

// 創建字符輸入流對象FileReader fr1 = new FileReader("day12_File類與遞歸&IO流&字符流&字節流\\resources\\a.txt");int len;// 循環讀取while ((len = fr1.read()) != -1){System.out.print((char) len);}//關閉fr1.close();

? ? ? ? ? ? ? ?3.讀取字符的數組長度的字符數據

// 創建字符輸入流對象FileReader fr1 = new FileReader("day12_File類與遞歸&IO流&字符流和字節流\\resources\\a.txt");int len;// 每次讀取返回的字符數據char[] chars = new char[1024];// 循環讀取while( (len = fr1.read(chars)) != -1 ){System.out.print(new String(chars,0,len));}// 關閉流fr1.close();

????????

七、字符輸出流Write

?????????java.io.Writer類,抽象類,用于表示字符輸出流的所有類的超類,將指定的字符信息寫出到目的地

? ? ? ? 構造方法:

? ? ? ? ? ? ? ??概述:java.io.FileWriter類 是Writer的子類,表示字符輸出流,可以用來寫出字符數據

????????????????- public FileWriter(String fileName)
????????????????- public FileWriter(String fileName, boolean append)
????????????????- public FileWriter(File file)
????????????????- public FileWriter(File file, boolean append)

? ? ? ? ? ? ? ??注意:

????????????????1.當你創建一個字符輸出流對象時,必須傳入一個文件路徑
????????????????2.前面2個構造方法,傳入的路徑,如果沒有這個文件,會創建這個文件,如果文件里面有數據,數據會被清空
????????????????3.后面2個構造方法,多了一個append的參數,true表示不清空,false默認清空

? ? ? ? 成員方法:

????????????????- public void write(int c)
????????????????- public void write(char cbuf[])
????????????????- public abstract void write(char cbuf[], int off, int len)
????????????????- public void write(String str)
????????????????- public void write(String str, int off, int len)
????????????????- public abstract void flush()
????????????????- public abstract void close()

? ? ? ? 方法逐個演示:

? ? ? ? ? ? ? ? 1.構造方法

FileWriter fw1 = new FileWriter("day12_File類與遞歸&IO流&字符流和字節流\\resources\\a.txt"); FileWriter fw2 = new FileWriter(new File("day12_File類與遞歸&IO流&字符流和字節流\\resources\\a.txt"));FileWriter fw3 = new FileWriter("day12_File類與遞歸&IO流&字符流和字節流\\resources\\a.txt",true); FileWriter fw4 = new FileWriter(new File("day12_File類與遞歸&IO流&字符流和字節流\\resources\\a.txt"),true);

? ? ? ? ? ? ? ?2.寫出單個字符

// 第一步:創建字符輸出流對象。關聯目的地文件路徑FileWriter fw1 = new FileWriter(new File("day12_File類與遞歸&IO流&字符流&字節流\\resources\\b.txt"));// 第二步:寫入單個字符fw1.write(97);// 第三步:關閉流fw1.close();

? ? ? ? ? ? ? ?

????????????????3.寫出字符串

// 第一步:創建字符輸出流對象。關聯目的地文件路徑FileWriter fw1 = new FileWriter("day12_File類與遞歸&IO流&字符流和字節流\\resources\\c.txt");// 第二步:寫出字符串String str = "我今天心情真美麗\r\n嘿嘿哈哈";fw1.write(str,3,5);// 第三步:關閉流fw1.close();

?????????

? ? ? ? ? ? ? ??4.寫出字符數組

// 第一步:創建字符輸出流對象。關聯目的地文件路徑FileWriter fw1 = new FileWriter("day12_File類與遞歸&IO流&字符流&字節流\\resources\\c.txt");// 第二步:寫出字符數組char[] chars = {'我','是','一','個','偉','大','的','人'};fw1.write(chars);// 第三步:關閉流fw1.close();

?????????

?

八、流的關閉和刷新

????????- public abstract void flush():刷新緩沖區,流對象可以繼續使用
??????? - public abstract void close():關閉流,釋放系統資源,關閉流會順帶刷新緩沖區,關閉之后不可操作

// 第一步:創建字符輸出流對象。關聯目的地文件路徑FileWriter fw1 = new FileWriter("day12_File類與遞歸&IO流&字符流&字節流\\resources\\d.txt");// 第二步:寫出字符串String str = "我今天心情真美麗";fw1.write(str);fw1.write("\r\n");fw1.write("這是第二行");fw1.flush();fw1.write("\r\n");fw1.write("這是flush之后的數據");//第三步:關閉流fw1.close();

????????

?

總結

以上是生活随笔為你收集整理的Java IO流 详解(字节流、字符流、输入流、输出流、刷新)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。