Java中的IO流

来源:https://www.cnblogs.com/lyz-999/archive/2018/04/22/8907773.html
-Advertisement-
Play Games

Java中的IO流 分類 根據流的方向:輸入流和輸出流 根據讀取文字的大小:位元組流和字元流(位元組按照位元組讀取,讀取中文容易亂碼,字元流按照字元讀取,通常用於讀取中文) 根據讀取的方式:節點流和緩存流 分類 根據流的方向:輸入流和輸出流 根據讀取文字的大小:位元組流和字元流(位元組按照位元組讀取,讀取中文容 ...


Java中的IO流

 分類

  • 根據流的方向:輸入流和輸出流
  • 根據讀取文字的大小:位元組流和字元流
    (位元組按照位元組讀取,讀取中文容易亂碼,字元流按照字元讀取,通常用於讀取中文)
  • 根據讀取的方式:節點流和緩存流

(一)位元組流

 【基礎流】

FileInputStream
FileInputStream   fis=new FileInputStream("F:\\test.txt");   // 可以傳入File對象

文件讀取方式

方式一

 1 /** 2 * 按照位元組,一個個位元組讀取文件
 3 */
 4     int n=0;
 5     StringBuffer sb=new StringBuffer();
 6     while((n=fis.read())!=-1){
 7         sb.append((char)n);
 8     }
 9     System.out.println(sb);

 方式二

1 /**
2 * 文件<1024位元組,將byte數組直接聲明為輸入流的長度,一次性讀取所有文字
3  */
4     byte[] bytes=new byte[fis.available()];
5     StringBuffer sb=new StringBuffer();
6     fis.read(bytes);
7     sb.append(new String(bytes));
8     System.out.println(sb);

 方式三

1 /**
2  *文件>1024位元組, 一次讀取1024個位元組
3  */
4     StringBuffer sb=new StringBuffer();
5     byte[] bytes=new byte[20];
6     int n=0;
7     while((n=fis.read(bytes))!=-1){
8            sb.append(new String(bytes));
9         }

FileOutputStream

  • FileOutputStream fos=new FileOutputStream("F:\\out.txt",true)
  • 如果第二個參數省略或,或傳入false,則表示每次寫入時將原文件清空,從文件頭部開始寫入
  • 如果第二個參數傳入true,每次寫入時,從原文件最後追加寫入

 

1 StringBuffer sb=new StringBuffer();
2 fos.write(sb.toString().getBytes());
3 System.out.println(sb);

close

  • 輸入流關閉:fis.close();
  • 輸出流關閉:fos.close();

 


 【緩存流】

 BufferedInputStream_BufferedOutputStream

  • 在基本流的基礎上進行包裝,讀取或寫入文件時,將通過緩存進行即,先將內容寫到緩存區中,緩存區滿了以後,再進行讀取或寫入操作。
    可大大減少文件的操作次數,提高寫入效率。稱之為IO鏈。
    1 BufferedInputStream bis=null;
    2  bis=new BufferedInputStream(newFileInputStream("F:\\test.txt"));
    3 BufferedOutputStream bos=null;
    4 bos=new BufferedOutputStream(newFileOutputStream("F:\\out.txt",true));

     

  • IO鏈關閉時,我們只需關閉最外層流,內層流將自動關閉
    1 bis.close();

     

  • BufferedOutputStream在關閉前通常調用flush()方法,將緩存區剩餘的內容刷新進行寫入或讀取操作。
    1 bos.flush();
    2 bos.close();

     



 【數據流】

DataInputStream_DataOutputStream

  • Data系列流,也有read和write方法,操作與基本流相同。
  • 採用二進位對文件進行讀寫操作,與基本流相比,可以直接讀寫Java中的基本數據類型。
     1 String name="zhangsan";
     2 int age=23;
     3 DataOutputStream dos=new DataOutputStream(new FileOutputStream("F:\\zhangsan.txt"));
     4 
     5 //對基本數據進行寫入操作
     6 dos.writeUTF(name);
     7 dos.writeInt(age);
     8 
     9 DataInputStream dis=new DataInputStream(new FileInputStream("F:\\zhangsan.txt"));
    10 
    11 //對基本數據進行讀取操作
    12 String uname=dis.readUTF();
    13 int uage=dis.readInt();

     

  • 如果操作的文件是一個二進位文件,需要使用DataOutputStream替代FileOutputStream。


【對象流】

ObjectInputStream_ObjectOutputStream

  • 與基本相同,可以直接使用read、write方法進行讀寫
  • .與Data流相同,可以對Java基本數據類型進行直接讀寫,readInt(),writeInt()
  • 可以只用readObject()和writeObject(),直接對對象進行操作。
    Person user=new Person("zhangsan",23,178.5,"山東煙臺");
    ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("F:\\user.txt"));
     oos.writeObject(user);
    ObjectInputStream  ois=new ObjectInputStream(new FileInputStream("F:\\user.txt"));
     Person user1=(Person)ois.readObject();

     

【對象的序列化與反序列化】

  1. 對象的序列化:把對象的轉換成位元組序列永久地保存到硬碟上,通常存放在一個文件中;
  2. 對象的反序列化:位元組序列恢復為Java對象的過程。
    • 如果:要將對象進行序列操作,那麼實體類必須實現可序化介面
      1 class Person implements Serializable{}

       

    • 當一個實體類實現可序化介面時,可以添加一個序列化版本號ID (警告提示,根據提示添加)
      1 private static final long serialVersionUID = 1L;

       


(二)字元流

【基本流】

FileWriter_FileReader(不常用)

  • 在處理數據單元時,以一個字元作為單位。
  • 在讀寫文件時,只能使用系統預設編碼格式;無法指定編碼,如果文件格式與系統預設格式不一致,
    那使用這兩個方法讀寫將造成中文亂碼。
  • 讀寫方法也是read(),write(),用法與位元組流類似。



【位元組流轉字元流】

InputStreamReader_OutputStreamWriter

  • 將位元組流轉為字元流,同時支持自定義讀寫的編碼格式;
    InputStreamReader isr=null;
    isr=new InputStreamReader(new FileInputStream("F:\\oo.txt"),"UTF-8");
      
    OutputStreamWriter  osw=null;
    osw=new OutputStreamWriter(new FileOutputStream("F:\\text.txt"),"UTF-8");

     

  • 常見編碼格式:
    • ASCII:美國標準消息碼‘
    • ISO08859-1:歐洲碼
    • ANSI編碼:
      • 簡體中文:GB2312 GBK
      • 繁體中文:big-5
      • Unicode編碼:國際標準碼。相容絕大部分國家的編碼格式。
        UTF-6    UTF-8    UTF-16



【緩存流】

BufferedREader_BufferedWriter

  • 作用與用法與位元組流相同
     1 BufferedReader br=null;
     2 
     3 br=new BufferedReader(
     4         new InputStreamReader(
     5             new FileInputStream("F:\\oo.txt"),"UTF-8"));
     6 int n=-1;
     7 while((n=br.read())!=-1){
     8         sb.append((char)n);
     9 }
    10 System.out.println(sb);
    11     
    12 BufferedWriter bw=null;         
    13 bw=new BufferedWriter(
    14         new OutputStreamWriter(
    15             new FileOutputStream("F:\\oo.html")));
    16 String s=sb.toString()+"jijn看到福克斯";

     


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 裝載自:https://www.cnblogs.com/cisum/p/8064222.html Python3 運算符 什麼是運算符? 本章節主要說明Python的運算符。舉個簡單的例子 4 +5 = 9 。 例子中,4 和 5 被稱為操作數,"+" 稱為運算符。 Python語言支持以下類型的運 ...
  • 想要做出一個成功的 PHP 擴展包,不僅僅是簡單的將代碼放進文件夾中就可以了,除此之外,還有非常多的因素來決定你的擴展是否優秀。以下清單的內容將有助於完善你的擴展,並且在 PHP 社區中得到更多的重視。 1. 為你的擴展選擇一個正確合適的名字 確保你的命名沒有被其他項目使用。 擴展的名字需要和你的 ...
  • Lesson Eight 2018-04-23 02:07:01 封裝與隱藏:問題:當創建了類的對像以後,如果直接通過“對象.屬性”的方式對相應的對像屬性賦值的話,可能會出來不滿足實際情況的意外。 引出:通過“對像 .方法”的形式,來控制對像對屬性的訪問。對屬性的要求術可以通過方法來體現。 解決:1 ...
  • 集合的操作 集合是一個無序的,不重覆的數據組合,它的主要作用如下: 去重,把一個列表變成集合,就自動去重了 關係測試,測試兩組數據之間的交集,差集,並集等關係 集合的寫法 list_1 = set([1, 3, 4, 6, 7, 12, 5]) 集合的關係 list_1 = set([1, 3, 5 ...
  • 問題:在使用連接池和線程綁定之後需要關閉其他的參數麽(stat? con?...) ...
  • 多線程併發與線程安全相關知識整理如下: 一、線程怎麼保證安全性。 什麼是線程安全性 當多個線程訪問某個類時,不管運行時環境採用何種調度方式或者這些進程將如何交替執行,並且在主調代碼中不需要任何額外的同步或協同,這個類都能表現出正確的行為,那麼就稱這個類是線程安全的。 線程安全性的三大特征 原子性、有 ...
  • 1. 併發編程的3個概念 併發編程時,要想併發程式正確地執行,必須要保證原子性、可見性和有序性。只要有一個沒有被保證,就有可能會導致程式運行不正確。 1.1. 原子性 原子性:即一個或多個操作要麼全部執行並且執行過程中不會被打斷,要麼都不執行。 一個經典的例子就是銀行轉賬:從賬戶A向賬戶B轉賬100 ...
  • 再次整理了一下這個日誌收集系統的框,如下圖 這次要實現的代碼的整體邏輯為: 完整代碼地址為: https://github.com/pythonsite/logagent etcd介紹 高可用的分散式key-value存儲,可以用於配置共用和服務發現 類似的項目:zookeeper和consul 開 ...
一周排行
    -Advertisement-
    Play Games
  • 基於.NET Framework 4.8 開發的深度學習模型部署測試平臺,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系列下的Det、Seg、Pose、Obb、Cls等應用場景,同時支持圖像與視頻檢測。模型部署引擎使用的是OpenVINO™、TensorRT、ONNX runti... ...
  • 十年沉澱,重啟開發之路 十年前,我沉浸在開發的海洋中,每日與代碼為伍,與演算法共舞。那時的我,滿懷激情,對技術的追求近乎狂熱。然而,隨著歲月的流逝,生活的忙碌逐漸占據了我的大部分時間,讓我無暇顧及技術的沉澱與積累。 十年間,我經歷了職業生涯的起伏和變遷。從初出茅廬的菜鳥到逐漸嶄露頭角的開發者,我見證了 ...
  • C# 是一種簡單、現代、面向對象和類型安全的編程語言。.NET 是由 Microsoft 創建的開發平臺,平臺包含了語言規範、工具、運行,支持開發各種應用,如Web、移動、桌面等。.NET框架有多個實現,如.NET Framework、.NET Core(及後續的.NET 5+版本),以及社區版本M... ...
  • 前言 本文介紹瞭如何使用三菱提供的MX Component插件實現對三菱PLC軟元件數據的讀寫,記錄了使用電腦模擬,模擬PLC,直至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1. PLC開發編程環境GX Works2,GX Works2下載鏈接 https:// ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • 1、jQuery介紹 jQuery是什麼 jQuery是一個快速、簡潔的JavaScript框架,是繼Prototype之後又一個優秀的JavaScript代碼庫(或JavaScript框架)。jQuery設計的宗旨是“write Less,Do More”,即倡導寫更少的代碼,做更多的事情。它封裝 ...
  • 前言 之前的文章把js引擎(aardio封裝庫) 微軟開源的js引擎(ChakraCore))寫好了,這篇文章整點js代碼來測一下bug。測試網站:https://fanyi.youdao.com/index.html#/ 逆向思路 逆向思路可以看有道翻譯js逆向(MD5加密,AES加密)附完整源碼 ...
  • 引言 現代的操作系統(Windows,Linux,Mac OS)等都可以同時打開多個軟體(任務),這些軟體在我們的感知上是同時運行的,例如我們可以一邊瀏覽網頁,一邊聽音樂。而CPU執行代碼同一時間只能執行一條,但即使我們的電腦是單核CPU也可以同時運行多個任務,如下圖所示,這是因為我們的 CPU 的 ...
  • 掌握使用Python進行文本英文統計的基本方法,並瞭解如何進一步優化和擴展這些方法,以應對更複雜的文本分析任務。 ...
  • 背景 Redis多數據源常見的場景: 分區數據處理:當數據量增長時,單個Redis實例可能無法處理所有的數據。通過使用多個Redis數據源,可以將數據分區存儲在不同的實例中,使得數據處理更加高效。 多租戶應用程式:對於多租戶應用程式,每個租戶可以擁有自己的Redis數據源,以確保數據隔離和安全性。 ...