Java 基礎--File - IO流(2)

I/O流

定義

數據從硬盤流向內存為輸入流,數據從內存流向硬盤為輸出流。輸入也叫讀取數據,輸出也叫寫出數據。

IO分類

1.按照數據的流向分為:輸入流和輸出流

①輸入流:把數據從其他設備上讀取到內存中的流

②輸出流:把數據從內存中寫出到其他設備上的流

2.按照功能類型分為:字節流和字符流

①字節流:以字節為單位,讀寫數據的流

②字符流:以字符為單位,讀寫數據的流

字節流和字符流的頂級父類

字節流:①字節輸入流:InputStream

②字節輸出流:OutputStream

字符流:①字符輸入流:Reader

②字符輸出流:Writer

注:這些都是抽象父類,不能直接使用,要使用他們的子實現類

字節輸出流(OutputStream)

一切皆為字節,我們存儲的數據,文件,圖片等都是以二進制數字的形式保存,都是一個一個的字節,傳輸的時候也是一樣。java.io.OutputStream抽象類是表示字節輸出流的所有類的父類,將指定的字節信息寫出到目的地。

1.字節輸出流的基本共性功能方法:

①public void close():關閉此輸出流并釋放與此流相關聯的任何系統資源當完成流的操作時,必須調用此方法,釋放系統資源。

②public void write(byte[] b):將 b.length字節從指定的字節數組寫入此輸出流。

③public void write(byte[] b, int off, int len)` :從指定的字節數組寫入 len字節,從偏移量 off開始輸出到此輸出流。

④public abstract void write(int b):將指定的字節輸出。

FileOutputStream類(文件字節輸出流)

OutputStream的子類,用于將數據寫出到文件

構造方法

1.public FileOutputStream(File file):創建文件輸出流以寫入由指定的File對象表示的文件

        // 使用File對象創建流對象File file = new File("a.txt");FileOutputStream fos = new FileOutputStream(file);

2.public FileOutputStream(String name):創建文件輸出流以指定的名稱寫入文件

        // 使用文件名稱創建流對象FileOutputStream fos = new FileOutputStream("b.txt");

注:如果目標文件不存在,則創建,若存在,則覆蓋。

常用方法:

1.寫出字節:write(int b) 方法,每次可以寫出一個字節數據

        FileOutputStream fos = new FileOutputStream(“D:/test/test.txt”);fos.write(97);fos.close();//文件中會寫出a

注:雖然參數為int類型四個字節,但是只會保留一個字節的信息寫出,因為這是字節輸出流,一個字節一個字節輸出,只會保留我們輸出的那個字節。

2.寫出字節數組:write(byte[] b),每次可以寫出數組中的數據

        File file = new File("D:/test/test.txt");FileOutputStream fos = new FileOutputStream(file);//寫出一個字節數組大小的數據byte[] b={97,98,99,100};fos.write(b);byte[] b1="今天真好看".getBytes();fos.write(b1);fos.close();//寫入abcd今天真好看

3.寫出指定長度字節數組:write(byte[] b, int off, int len),每次寫出從off索引開始,len個字節

        File file = new File("D:/test/test.txt");FileOutputStream fos = new FileOutputStream(file);//寫出數組中指定長度的字節數據byte[] b={97,98,99,100};fos.write(b,1,2);fos.close();//寫入bc

4.數據追加續寫

public FileOutputStream(File file/String name,boolean append):這個構造方法,參數中需要傳入一個boolean類型的值,true表示追加數據,false表示清空原有數據,不寫的話默認是false

        File file = new File("D:/test/test.txt");FileOutputStream fos = new FileOutputStream(file,true);//追加數據byte[] b={97,98,99,100};fos.write(b,1,2);fos.close();//寫入bcbc

5.寫出換行

        File file = new File("D:/test/test.txt");FileOutputStream fos = new FileOutputStream(file,true);//換行\r\nbyte[] b={97,98,99,100};for(int i:b){fos.write(i);fos.write("\r\n".getBytes());}fos.close();

注:①回車符(\r):回到一行的開頭,如果在abcde中的c前回車后不做任何操作,再寫數據的時候光標是在c前面

???????②換行符(\n):另起一行,如果在abcde中的c前換行后不做任何操作,再寫數據的時候光標是在e后面

字節輸入流(InputStream)

java.io.InputStream 抽象類是表示字節輸入流的所有類的父類,可以讀取字節信息到內存中。定義了字節輸入流的基本共性功能方法。

1.基本共性功能方法:

①public void close():關閉此輸入流并釋放與此流相關聯的任何系統資源。

②public abstract int read(): 從輸入流讀取數據的下一個字節。

③public int read(byte[] b): 從輸入流中讀取一些字節數,并將它們存儲到字節數組 b中 。

FileInputStream類(文件字節輸入流)

構造方法:

1.FileInputStream(File file): 通過打開與實際文件的連接來創建一個 FileInputStream ,該文件由文件系統中的 File對象 file命名。

        // 使用File對象創建流對象File file = new File("a.txt");FileInputStream fos = new FileInputStream(file);

2.public FileInputStream(String name):通過打開與實際文件的連接來創建一個 FileInputStream ,該文件由文件系統中的路徑名 name命名。

        // 使用文件名稱創建流對象FileInputStream fos = new FileInputStream("b.txt");

常用方法:

1.讀取字節數據:read方法,從輸入流中讀取數據的下一個字節,自動提升為int類型,讀取到文件末尾,返回-1。

 public static void main(String[] args) throws IOException {File file=new File("D:\\test\\test.txt");FileInputStream fis = new FileInputStream(file);int r;while ((r=fis.read())!=-1){System.out.println((char)r);//遍歷文件中的全部字節}fis.close();}

2.使用字節數組讀取:read(byte[] b),每次讀取b的長度個字節到數組中,返回讀取到的有效字節個數,讀取到末尾時,返回-1。

 public static void main(String[] args) throws IOException {File file=new File("D:\\test\\test.txt");FileInputStream fis = new FileInputStream(file);//每次讀一個字節數組的數據byte[] b=new byte[3];int read =fis.read(b);//返回的int值是讀取的有效字節個數System.out.println(read);//3System.out.println(new String(b));//bcafis.close();}

注:

讀取到的數據賦值給字節數組b,每一次讀取會覆蓋前一次的數據如果字符的長度不是字節數組的整數倍,比如字節數組長度為3,但是讀取到最后只剩2個字符,那么這兩個字符會覆蓋字符數組前兩位,而第三位則還是上一次讀取的字符,

改進如下:

 public static void main(String[] args) throws IOException {File file=new File("D:\\test\\test.txt");FileInputStream fis = new FileInputStream(file);byte[] b=new byte[3];//定義有效字節數int len;while ((len=fis.read(b))!=-1){String s=new String(b,0,len);System.out.println(s);}fis.close();}

字符輸入流(Reader)

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

1.基本共性功能方法:

①public void close():關閉此流并釋放與此流相關聯的任何系統資源

②public int read(): 從輸入流讀取一個字符

③public int read(char[] cbuf): 從輸入流中讀取一些字符,并將它們存儲到字符數組 cbuf中

FileReader類

java.io.FileReader `類是讀取字符文件的便捷類

構造方法:

①FileReader(File file): 創建一個新的 FileReader ,給定要讀取的File對象

        // 使用File對象創建流對象File file = new File("a.txt");FileReader fr = new FileReader(file);

②FileReader(String fileName): 創建一個新的 FileReader ,給定要讀取的文件的名稱

        // 使用文件名稱創建流對象FileReader fr = new FileReader("b.txt");

常用方法:

1.讀取字符:read方法,每次可以讀取一個字符的數據,提升為int類型,讀取到文件末尾,返回-1,循環讀取

public static void main(String[] args) throws IOException {//字符輸入流FileReader fr=new FileReader(new File("F:\\test\\bbb.txt"));int r ;while ((r=fr.read())!=-1){System.out.println((char)r);}fr.close();}

2.使用字符數組讀取:read(char[] cbuf),每次讀取b的長度個字符到數組中,返回讀取到的有效字符個數,讀取到末尾時,返回-1

public static void main(String[] args) throws IOException {//字符輸入流FileReader fr=new FileReader(new File("F:\\test\\bbb.txt"));char[] c=new char[3];int l;while ((l=fr.read(c))!=-1){String s=new String(c,0,l);System.out.println(s);}fr.close();}

字符輸出流(Writer)

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

1.基本共性功能方法

①public abstract void close():關閉此輸出流并釋放與此流相關聯的任何系統資源

②public abstract void flush():刷新此輸出流并強制任何緩沖的輸出字符被寫出

③public void write(int b):寫出一個字符

④public void write(char[] cbuf):將 cbuf.length字符從指定的字符數組寫出此輸出流

⑤public abstract void write(char[] b, int off, int len):從指定的字符數組寫出 len字符,從偏移量 off開始輸出到此輸出流

⑥public void write(String str):寫出一個字符串

FileWriter類

java.io.FileWriter 類是寫出字符到文件的便利類。構造時使用默認字節緩沖區(之前輸出流是從內存直接就寫到硬盤中了,現在這個字符輸出流是有一個緩沖區存在的,在向外界磁盤寫數據的時候會先把數據寫到緩沖區中,只有調用刷新或者關閉方法的時候,才會把當前緩沖區內的數據輸出到指定文件中

構造方法:

1.FileWriter(File file): 創建一個新的 FileWriter,給定要讀取的File對象

        // 使用File對象創建流對象File file = new File("a.txt");FileWriter fw = new FileWriter(file);

2.FileWriter(String fileName): 創建一個新的 FileWriter,給定要讀取的文件的名稱

        // 使用文件名稱創建流對象FileWriter fw = new FileWriter("b.txt");

常用方法:

1.寫出字符:write(int b) 方法,每次可以寫出一個字符數據

public static void main(String[] args) throws IOException {//文件字符輸出流//FileWriter fw= new FileWriter("F:\\test\\aaa.txt");FileWriter fw= new FileWriter(new File("F:\\test\\aaa.txt"));fw.write("我");fw.write(30000);//寫出的數據現在存放在緩沖區中,必須刷新或者關閉才能把數據輸出到文件中。fw.close();}

關閉和刷新的區別

1.flush:刷新緩沖區,流對象可以繼續使用

2.close:關閉流,釋放系統資源,關閉前會刷新緩沖區,但流對象不可以繼續使用。

public static void main(String[] args) throws IOException {// 使用文件名稱創建流對象FileWriter fw = new FileWriter("F:\\test\\aaa.txt");// 寫出數據,通過flushfw.write('刷'); // 寫出第1個字符fw.flush();//寫出成功fw.write('新'); // 繼續寫出第2個字符fw.flush();//寫出成功// 寫出數據,通過closefw.write('關'); // 寫出第1個字符fw.close();fw.write('閉'); // 繼續寫出第2個字符,【報錯】java.io.IOException: Stream closedfw.close();}

2.寫出其他數據

①寫出字符數組?:write(char[] cbuf) 和 write(char[] cbuf, int off, int len),每次可以寫出字符數組中的數據,同FileOutputStream的用法一樣。

       FileWriter fw= new FileWriter(new File("F:\\test\\aaa.txt"));char[] c="今天適合吹風".toCharArray();fw.write(c);fw.write(c,3,2);//寫出的數據現在存放在緩沖區中,必須刷新或者關閉才能把數據輸出到文件中。fw.close();

②寫出字符串:write(String str) 和 write(String str, int off, int len),每次可以寫出字符串中的數據。

       FileWriter fw= new FileWriter(new File("F:\\test\\aaa.txt"));String s="今天太陽好大";fw.write(s);fw.write(s,2,3);//寫出的數據現在存放在緩沖區中,必須刷新或者關閉才能把數據輸出到文件中。fw.close();

③續寫和換行:操作類似于FileOutputStream

   FileWriter fw= new FileWriter(new File("F:\\test\\aaa.txt"),true);fw.write("今天太陽好大");fw.write("\r\n");fw.write("今天");//寫出的數據現在存放在緩沖區中,必須刷新或者關閉才能把數據輸出到文件中。fw.close();

總結

凡是自己能寫出來的用字符流,字符寫不出來的比如圖片,視頻等用字節流。

IO流的異常處理

第一種方式:

public static void main(String[] args){FileInputStream fis=null;FileOutputStream fos=null;try{fis=new FileInputStream("C:\\test\\完整的頁面效果圖.jpg");fos=new FileOutputStream("C:\\test\\1.jpg");byte[] b=new byte[1024];int l=0;while((l=fis.read(b))!=-1){fos.write(b,0,l);}}catch(IOException e){e.printStackTrace();}finally {try {if(fos!=null){fos.close();}} catch (IOException e) {e.printStackTrace();}try {if(fis!=null){fis.close();}} catch (IOException e) {e.printStackTrace();}}}

第二種方式:1.7之后流的簡化版處理異常的方式.不再需要自己關流,這種方式會自動關流

public static void main(String[] args) throws IOException {//第二種方式try(FileInputStream fis=new FileInputStream("C:\\test\\完整的頁面效果圖.jpg");FileOutputStream fos=new FileOutputStream("C:\\test\\1.jpg")){byte[] b=new byte[1024];int l=0;while((l=fis.read(b))!=-1){fos.write(b,0,l);}}catch (Exception e){e.printStackTrace();}}

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

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

相關文章

Qt 基礎組件速學 事件過濾器

學習目標:理解事件過濾器 前置環境 運行環境:qt creator 4.12 學習內容和效果演示: Qt 提供了事件過濾器的機制,允許我們在事件到達目標對象之前對事件進行攔截和處理。這在以下情況下非常有用: 全局事件處理: 我們可以在應用程序級別安裝一個事件過…

工控人最愛的PLC觸摸屏一體機,有多香

PLC觸摸屏一體機是什么 PLC觸摸屏一體機,聽起來可能有點技術化,但簡單來說,它就是一個集成了可編程邏輯控制器(PLC)和觸摸屏的智能設備。這種設備不僅能夠執行自動化控制任務,還能實時顯示和操作設備狀態&a…

JVM原理(十九):JVM虛擬機內存模型

1. 硬件的效率與一致性 數據不安全的原因:緩存一致性的問題 共享內存多核系統:在多路處理器系統中,每個處理器都有自己的高速緩存,而他們又共享同一主內存。 線程先后執行結果不一致問題:除了增加高速緩存之外&#…

【Python】已解決:nltk.download(‘stopwords‘) 報錯問題

文章目錄 一、分析問題背景二、可能出錯的原因三、錯誤代碼示例四、正確代碼示例五、注意事項 已解決:nltk.download(‘stopwords’) 報錯問題 一、分析問題背景 在使用Python的自然語言處理庫NLTK(Natural Language Toolkit)時&#xff0c…

后端開發常見錯誤

1、解析json字符串要考慮格式不正確,空值情況 2、解析時間字符串要考虎格式和空值 3、使用mybatis的foreach的時候要考慮拼接sql的耗時,尤其是超過10條數據 4、表字段長度,在接口層校驗字段長度, 調用三方系統的報錯要截取報錯…

CentOS 7安裝Elasticsearch7.7.0和Kibana

一. 準備安裝包 elasticsearch和kibana:官網歷史版本找到并下載(https://www.elastic.co/cn/downloads/past-releases#elasticsearch)ik分詞器:GitHub下載(https://github.com/infinilabs/analysis-ik/releases/tag/v…

【大模型】衡量巨獸:解讀評估LLM性能的關鍵技術指標

衡量巨獸:解讀評估LLM性能的關鍵技術指標 引言一、困惑度:語言模型的試金石1.1 定義與原理1.2 計算公式1.3 應用與意義 二、BLEU 分數:翻譯質量的標尺2.1 定義與原理2.2 計算方法2.3 應用與意義 三、其他評估指標:綜合考量下的多元…

設計模式之狀態機模式

一、狀態機模式介紹 狀態機模式(State Machine Pattern)是一種用于描述對象行為的軟件設計模式,屬于行為型設計模式。在狀態機模式中,對象的行為取決于其內部狀態,并且在不同的狀態下,對象可能會有不同的行…

STM32F103C8T6核心板原理圖和PCB分享

PCB圖 原理圖 資料下載地址: 原理圖PCB庫: https://545c.com/d/45573183-61875742-29897c?p7526 (訪問密碼: 7526)

[go-zero] 簡單微服務調用

文章目錄 1.注意事項2.服務劃分及創建2.1 用戶微服務2.2 訂單微服務 3.啟動服務3.1 etcd 服務啟動3.2 微服務啟動3.3 測試訪問 1.注意事項 go-zero微服務的注冊中心默認使用的是Etcd。 本小節將以一個訂單服務調用用戶服務來簡單演示一下,其實訂單服務是api服務&a…

Java 使用sql查詢mongodb

在現代應用開發中,關系型數據庫和NoSQL數據庫各有千秋。MongoDB作為一種流行的NoSQL數據庫,以其靈活的文檔模型和強大的擴展能力,受到廣泛歡迎。然而,有時開發者可能更熟悉SQL查詢語法,或者需要在現有系統中復用SQL查詢…

【ARMv8/v9 GIC 系列 5.6 -- GIC 超優先級中斷詳細介紹】

請閱讀【ARM GICv3/v4 實戰學習 】 文章目錄 Interrupt superpriority超優先級中斷的特性和應用Physical interface interrupt signalsPhysical Group 1 Non-NMI for Current Security StatePhysical Group 1 for Other Security State, or a Group 0 Non-NMIPhysical Group 1 …

進程控制-wait和waitpid進程回收

wait 阻塞函數 函數作用: 1. 阻塞并等待子進程退出 2. 回收子進程殘留資源 3. 獲取子進程結束狀態(退出原因) pid_t wait(int *wstatus); 返回值: ‐1 : 回收失敗,已經沒有子進程了 >0 : 回收子進程對應的…

一種非凸全變差正則化的信號降噪方法(以模擬信號和軸承振動信號為例,MATLAB)

以旋轉機械振動信號為例,由于旋轉機械運行中背景噪聲較強,振動信號需要進行降噪處理。常用的小波閾值降噪會在信號的不連續處產生虛假的波峰和偽吉布森震蕩,而奇異值分解SVD去噪容易產生虛假分量,全變差去噪則不會出現這樣的情況&…

美國大選特色

美國總統是間接民選的。選民不直接投票選舉總統,而是通過選舉一個稱為選舉人團(Electoral College)的機構成員來間接決定總統。具體過程如下: 1. **選民投票**:在11月的大選日,選民投票選舉他們所在州的選…

深入理解JS逆向代理與環境監測

博客文章:深入理解JS逆向代理與環境監測 1. 引言 首先要明確JavaScript(JS)在真實網頁瀏覽器環境和Node.js環境中有很多使用特性的區別。尤其是在環境監測和對象原型鏈的檢測方面。本文將探討如何使用JS的代理(Proxy&#xff09…

MySQL之備份與恢復(九)

備份與恢復 從備份中恢復 更高級的恢復技術 復制和基于時間點的恢復使用的是相同的技術:服務器的二進制日志。這意味著復制在恢復時會是個非常有幫助的工具,哪怕方式不是很明顯。下面將演示一些可以用到的方法。這里列出來的不是一個完整的列表,但應該…

STM32-USART

本內容基于江協科技STM32視頻學習之后整理而得。 文章目錄 1. 串口通信協議1.1 通信接口1.2 串口通信1.3 硬件電路1.4 電平標準1.5 串口參數及時序1.6 串口時序 2. USART串口通信2.1 USART簡介2.2 USART框圖2.3 USART基本結構2.4 數據幀2.5 數據幀-配置停止位2.6 起始位偵測2.…

DP學習——簡單工廠模式

學而時習之,溫故而知新。 敵人出招(使用場景) 不同的業務場景下要創建不同的對象,但是這些對象又有共同的特點。如何復用代碼呢?你會想到,這些對象可以抽象出一個基類/抽象類就行了,那么隨著業…

【Python】一文向您詳細介紹 argparse中 action=‘store_true’ 的作用

【Python】一文向您詳細介紹 argparse中 action‘store_true’ 的作用 下滑即可查看博客內容 🌈 歡迎蒞臨我的個人主頁 👈這里是我靜心耕耘深度學習領域、真誠分享知識與智慧的小天地!🎇 🎓 博主簡介:98…