JAVA 必須掌握技能(二)-Java IO流學習之輸入輸出流

来源:https://www.cnblogs.com/blmlove/archive/2020/04/20/12740895.html
-Advertisement-
Play Games

Java IO流學習總結一:輸入輸出流 轉載請標明出處:http://blog.csdn.net/zhaoyanjun6/article/details/54292148本文出自【趙彥軍的博客】 感謝博主,感謝分享 Java流類圖結構: 流的概念和作用: 流是一組有順序的,有起點和終點的位元組集合,是 ...


Java IO流學習總結一:輸入輸出流

轉載請標明出處:http://blog.csdn.net/zhaoyanjun6/article/details/54292148
本文出自【趙彥軍的博客】

感謝博主,感謝分享

Java流類圖結構:


流的概念和作用:

  流是一組有順序的,有起點和終點的位元組集合,是對數據傳輸的總稱或抽象。即數據在兩設備間的傳輸稱為流,流的本質是數據傳輸,根據數據傳輸特性將流抽象為各種類,方便更直觀的進行數據操作。

IO流的分類:
  根據處理數據類型的不同分為:字元流和位元組流
  根據數據流向不同分為:輸入流和輸出流
字元流和位元組流
  字元流的由來: 因為數據編碼的不同,而有了對字元進行高效操作的流對象。本質其實就是基於位元組流讀取時,去查了指定的碼表。 位元組流和字元流的區別:

  讀寫單位不同:位元組流以位元組(8bit)為單位,字元流以字元為單位,根據碼表映射字元,一次可能讀多個位元組。

  處理對象不同:位元組流能處理所有類型的數據(如圖片、avi等),而字元流只能處理字元類型的數據。

  位元組流:一次讀入或讀出是8位二進位。

  字元流:一次讀入或讀出是16位二進位。

  設備上的數據無論是圖片或者視頻,文字,它們都以二進位存儲的。二進位的最終都是以一個8位為數據單元進行體現,所以電腦中的最小數據單元就是位元組。意味著,位元組流可以處理設備上的所有數據,所以位元組流一樣可以處理字元數據。

結論:

  只要是處理純文本數據,就優先考慮使用字元流。 除此之外都使用位元組流。

輸入流和輸出流
  輸入流只能進行讀操作,輸出流只能進行寫操作,程式中需要根據待傳輸數據的不同特性而使用不同的流。

  輸入位元組流 InputStream
    InputStream 是所有的輸入位元組流的父類,它是一個抽象類。
    ByteArrayInputStream、StringBufferInputStream、FileInputStream 是三種基本的介質流,它們分別從Byte 數組、StringBuffer、和本地文件中讀取數據。
    PipedInputStream 是從與其它線程共用的管道中讀取數據,與Piped 相關的知識後續單獨介紹。
    ObjectInputStream 和所有FilterInputStream 的子類都是裝飾流(裝飾器模式的主角)。
  輸出位元組流 OutputStream
    OutputStream 是所有的輸出位元組流的父類,它是一個抽象類。
    ByteArrayOutputStream、FileOutputStream 是兩種基本的介質流,它們分別向Byte 數組、和本地文件中寫入數據。
    PipedOutputStream 是向與其它線程共用的管道中寫入數據。
    ObjectOutputStream 和所有FilterOutputStream 的子類都是裝飾流。
總結:

  輸入流:InputStream或者Reader:從文件中讀到程式中;
  輸出流:OutputStream或者Writer:從程式中輸出到文件中;
節點流
  節點流:直接與數據源相連,讀入或讀出。
  直接使用節點流,讀寫不方便,為了更快的讀寫文件,才有了處理流。


常用的節點流
  父 類 :InputStream 、OutputStream、 Reader、 Writer
  文 件 :FileInputStream 、 FileOutputStrean 、FileReader 、FileWriter 文件進行處理的節點流
  數 組 :ByteArrayInputStream、 ByteArrayOutputStream、 CharArrayReader 、CharArrayWriter 對數組進行處理的節點流(對應的不再是文件,而是記憶體中的一個數組)
  字元串 :StringReader、 StringWriter 對字元串進行處理的節點流
  管 道 :PipedInputStream 、PipedOutputStream 、PipedReader 、PipedWriter 對管道進行處理的節點流
處理流
  處理流和節點流一塊使用,在節點流的基礎上,再套接一層,套接在節點流上的就是處理流。如BufferedReader.處理流的構造方法總是要帶一個其他的流對象做參數。一個流對象經過其他流的多次包裝,稱為流的鏈接。


常用的處理流
  緩衝流:BufferedInputStrean 、BufferedOutputStream、 BufferedReader、 BufferedWriter 增加緩衝功能,避免頻繁讀寫硬碟。
  轉換流:InputStreamReader 、OutputStreamReader實現位元組流和字元流之間的轉換。
  數據流: DataInputStream 、DataOutputStream 等-提供將基礎數據類型寫入到文件中,或者讀取出來。
轉換流
  InputStreamReader 、OutputStreamWriter 要InputStream或OutputStream作為參數,實現從位元組流到字元流的轉換。

構造函數

InputStreamReader(InputStream); //通過構造函數初始化,使用的是本系統預設的編碼表GBK。
  InputStreamReader(InputStream,String charSet); //通過該構造函數初始化,可以指定編碼表。
  OutputStreamWriter(OutputStream); //通過該構造函數初始化,使用的是本系統預設的編碼表GBK。
  OutputStreamwriter(OutputStream,String charSet); //通過該構造函數初始化,可以指定編碼表。

實戰演練
  FileInputStream類的使用:讀取文件內容

package com.app;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class A1 {
    public static void main(String[] args) {
        A1 a1 = new A1();

        //電腦d盤中的abc.txt 文檔
        String filePath = "D:/abc.txt" ;
        String reslut = a1.readFile( filePath ) ;
        System.out.println( reslut ); 
    }

    /**
    * 讀取指定文件的內容
    * @param filePath : 文件的路徑
    * @return 返回的結果
    */
    public String readFile( String filePath ){
        FileInputStream fis=null;
        String result = "" ;
      try {
          // 根據path路徑實例化一個輸入流的對象
          fis = new FileInputStream( filePath );

          //2. 返回這個輸入流中可以被讀的剩下的bytes位元組的估計值;
          int size = fis.available() ;
          //3. 根據輸入流中的位元組數創建byte數組;
          byte[] array = new byte[size];
          //4.把數據讀取到數組中;
          fis.read( array ) ;

          //5.根據獲取到的Byte數組新建一個字元串,然後輸出;
          result = new String(array);

      } catch (FileNotFoundException e) {
          e.printStackTrace();
      }catch (IOException e) {
          e.printStackTrace();
      }finally{
          if ( fis != null) {
              try {
                  fis.close();
              } catch (IOException e) {
                  e.printStackTrace();
              }
          }
      }
  
      return result ;
    }
  }    
}

FileOutputStream 類的使用:

  將內容寫入文件

package com.app;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class A2 {

public static void main(String[] args) {
  A2 a2 = new A2();

  //電腦d盤中的abc.txt 文檔
  String filePath = "D:/abc.txt" ;

  //要寫入的內容
  String content = "今天是2017/1/9,天氣很好" ;
  a2.writeFile( filePath , content ) ;
}
/** * 根據文件路徑創建輸出流 * @param filePath : 文件的路徑 * @param content : 需要寫入的內容 */ public void writeFile( String filePath , String content ){   FileOutputStream fos = null ;   try {     //1、根據文件路徑創建輸出流     fos = new FileOutputStream( filePath );     //2、把string轉換為byte數組;     byte[] array = content.getBytes() ;     //3、把byte數組輸出;     fos.write( array );   } catch (FileNotFoundException e) {     e.printStackTrace();   }catch (IOException e) {     e.printStackTrace();   }finally{     if ( fos != null) {       try {         fos.close();       } catch (IOException e) {         e.printStackTrace();       }     }   }  }
}

註意:

  在實際的項目中,所有的IO操作都應該放到子線程中操作,避免堵住主線程。
  FileInputStream在讀取文件內容的時候,我們傳入文件的路徑("D:/abc.txt"), 如果這個路徑下的文件不存在,那麼在執行readFile()方法時會報FileNotFoundException異常。
  FileOutputStream在寫入文件的時候,我們傳入文件的路徑("D:/abc.txt"), 如果這個路徑下的文件不存在,那麼在執行writeFile()方法時, 會預設給我們創建一個新的文件。還有重要的一點,不會報異常。
效果圖:

  綜合練習,實現複製文件,從D盤複製到E盤

package com.app;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class A3 {

public static void main(String[] args) {
  A3 a2 = new A3();

  //電腦d盤中的cat.png 圖片的路徑
  String filePath1 = "D:/cat.png" ;

  //電腦e盤中的cat.png 圖片的路徑
  String filePath2 = "E:/cat.png" ;

  //複製文件
  a2.copyFile( filePath1 , filePath2 );

}

/**
* 文件複製 
* @param filePath_old : 需要複製文件的路徑
* @param filePath_new : 複製文件存放的路徑
*/
public void copyFile( String filePath_old , String filePath_new){
  FileInputStream fis=null ;
  FileOutputStream fout = null ;
  try {
    // 根據path路徑實例化一個輸入流的對象
    fis = new FileInputStream( filePath_old );

    //2. 返回這個輸入流中可以被讀的剩下的bytes位元組的估計值;
    int size = fis.available() ;
    //3. 根據輸入流中的位元組數創建byte數組;
    byte[] array = new byte[size];
    //4.把數據讀取到數組中;
    fis.read( array ) ;

    //5、根據文件路徑創建輸出流
    fout = new FileOutputStream( filePath_new ) ;

    //5、把byte數組輸出;
    fout.write( array );

  } catch (FileNotFoundException e) {
    e.printStackTrace();
  }catch (IOException e) {
    e.printStackTrace();
  }finally{
    if ( fis != null) {
      try {
        fis.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
  }
  if ( fout != null ) {
    try {
      fout.close();
    } catch (IOException e) {
       e.printStackTrace();
    }    
  }
 }
}
}

 


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

-Advertisement-
Play Games
更多相關文章
  • 在讀取txt文件時遇到IndexError: list index out of range如下圖: 加入如下代碼,檢查原因: 已經知道rows一共有20662行,往下翻結果,還是報錯了: 意味著在讀取rows的第9411行時出錯了,這意味在9411可能存在list[index]的index超出範圍 ...
  • 題目:用*號輸出字母C的圖案。 程式分析:可先用'*'號在紙上寫出字母C,再分行輸出。 程式源代碼: 1 #include "stdio.h" 2 int main() 3 { 4 printf("用 * 號輸出字母 C!\n"); 5 printf(" ****\n"); 6 printf(" * ...
  • datetime.date()方法 用法:targetDay = datetime.date(year, month, day),傳入年月日,返回一個date類型的時間 date類型的對象的方法 1. targetDay.year # 返回targetDay年份 2. targetDay.month ...
  • C++的核心理念之一是RAII,Resource Acquisition Is Initialization,資源獲取即初始化。資源有很多種,記憶體、互斥鎖、文件、套接字等;RAII可以用來實現一種與作用域綁定的資源管理方法(如 );這些都不在本文的討論範圍之內。 記憶體是一種資源。從字面上來看,“資源 ...
  • @2020-4-20 作業: 1、編寫遠程執行命令的CS架構軟體 # 服務端 # _*_coding:utf-8_*_ __author__ = 'cc' from socket import * import subprocess ip_port = ('127.0.0.1', 1080) buf ...
  • Java初學者有必要來一張JAVA知識結構圖,首先知道總體有哪些知識分類,進而繼續更細化各個知識。 來一起細品吧! ...
  • 前言 創建型:單例模式,工廠模式,建造者模式,原型模式 結構型:橋接模式,代理模式,裝飾器模式,適配器模式,門面模式,組合模式,享元模式 行為型:觀察者模式,模板模式,策略模式,責任鏈模式,狀態模式,迭代器模式,訪問者模式 介紹 在工作中,我們經常要和Servlet Filter,Spring MV ...
  • 輸入三角形的三邊,判斷是否能構成三角形。若能構成輸出yes,否則輸出no。輸入格式:在一行中直接輸入3個整數,3個整數之間各用一個空格間隔,沒有其他任何附加字元。輸出格式:直接輸出yes或no,沒有其他任何附加字元。代碼如下:#!/usr/bin/python# -*- coding: utf-8 ... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...