Java 流(Stream)、文件(File)和IO

来源:https://www.cnblogs.com/zmy-520131499/archive/2019/07/14/11182752.html
-Advertisement-
Play Games

Java 流(Stream)、文件(File)和IO Java.io包幾乎包含了所有操作輸入、輸出需要的類。所有這些流類代表了輸入源和輸出目標。 Java.io包中的流支持很多種格式,比如:基本類型、對象、本地化字元集等等。 一個流可以理解為一個數據的序列。輸入流表示從一個源讀取數據,輸出流表示向一 ...


Java 流(Stream)、文件(File)和IO

Java.io包幾乎包含了所有操作輸入、輸出需要的類。所有這些流類代表了輸入源和輸出目標。

Java.io包中的流支持很多種格式,比如:基本類型、對象、本地化字元集等等。

一個流可以理解為一個數據的序列。輸入流表示從一個源讀取數據,輸出流表示向一個目標寫數據。

Java為I/O提供了強大的而靈活的支持,使其更廣泛地應用到文件傳輸和網路編程中。

但本節講述最基本的和流與I/O相關的功能。我們將通過一個個例子來學習這些功能。

讀取控制台輸入

Java的控制台輸入由System.in完成。

為了獲得一個綁定到控制台的字元流,你可以把System.in包裝在一個BufferedReader 對象中來創建一個字元流。

下麵是創建BufferedReader的基本語法:

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

BufferedReader對象創建後,我們便可以使用read()方法從控制台讀取一個字元,或者用readLine()方法讀取一個字元串。

從控制台讀取多字元輸入

從BufferedReader對象讀取一個字元要使用read()方法,它的語法如下:

int read( ) throws IOException

 

 

每次調用read()方法,它從輸入流讀取一個字元並把該字元作為整數值返回。 當流結束的時候返回-1。該方法拋出IOException。

下麵的程式示範了用read()方法從控制台不斷讀取字元直到用戶輸入"q"。

// 使用 BufferedReader 在控制台讀取字元

import java.io.*;

public class BRRead {
   public static void main(String args[]) throws IOException
   {
      char c;
      // 使用 System.in 創建 BufferedReader 
      BufferedReader br = new BufferedReader(new 
                         InputStreamReader(System.in));
      System.out.println("Enter characters, 'q' to quit.");
      // 讀取字元
      do {
         c = (char) br.read();
         System.out.println(c);
      } while(c != 'q');
   }
}

 

 

以上實例編譯運行結果如下:

Enter characters, 'q' to quit.
123abcq
1
2
3
a
b
c
q

 

 

從控制台讀取字元串

 

從標準輸入讀取一個字元串需要使用BufferedReader的readLine()方法。

它的一般格式是:

String readLine( ) throws IOException

 

 

下麵的程式讀取和顯示字元行直到你輸入了單詞"end"。

// 使用 BufferedReader 在控制台讀取字元
import java.io.*;
public class BRReadLines {
   public static void main(String args[]) throws IOException
   {
      // 使用 System.in 創建 BufferedReader 
      BufferedReader br = new BufferedReader(new
                              InputStreamReader(System.in));
      String str;
      System.out.println("Enter lines of text.");
      System.out.println("Enter 'end' to quit.");
      do {
         str = br.readLine();
         System.out.println(str);
      } while(!str.equals("end"));
   }
}

 

以上實例編譯運行結果如下:

Enter lines of text.
Enter 'end' to quit.
This is line one
This is line one
This is line two
This is line two
end
end
 

 

控制台輸出

 

在此前已經介紹過,控制台的輸出由 print( ) 和println( )完成。這些方法都由類PrintStream 定義,System.out是該類對象的一個引用。

PrintStream 繼承了OutputStream類,並且實現了方法write()。這樣,write()也可以用來往控制台寫操作。

PrintStream 定義write()的最簡單格式如下所示:

void write(int byteval)

 

該方法將byteval的低八位位元組寫到流中。

實例

下麵的例子用write()把字元"A"和緊跟著的換行符輸出到屏幕:

import java.io.*;

// 演示 System.out.write().
public class WriteDemo {
   public static void main(String args[]) {
      int b; 
      b = 'A';
      System.out.write(b);
      System.out.write('\n');
   }
}

 

 

運行以上實例在輸出視窗輸出"A"字元

A

 

註意:write()方法不經常使用,因為print()和println()方法用起來更為方便。

讀寫文件

 

如前所述,一個流被定義為一個數據序列。輸入流用於從源讀取數據,輸出流用於向目標寫數據。

下圖是一個描述輸入流和輸出流的類層次圖。

下麵將要討論的兩個重要的流是FileInputStream 和FileOutputStream:

FileInputStream

 

該流用於從文件讀取數據,它的對象可以用關鍵字new來創建。

有多種構造方法可用來創建對象。

可以使用字元串類型的文件名來創建一個輸入流對象來讀取文件:

InputStream f = new FileInputStream("C:/java/hello");

 

 

也可以使用一個文件對象來創建一個輸入流對象來讀取文件。我們首先得使用File()方法來創建一個文件對象:

File f = new File("C:/java/hello");
InputStream f = new FileInputStream(f);

 

 

創建了InputStream對象,就可以使用下麵的方法來讀取流或者進行其他的流操作。

序號方法及描述
1 public void close() throws IOException{}
關閉此文件輸入流並釋放與此流有關的所有系統資源。拋出IOException異常。
2 protected void finalize()throws IOException {}
這個方法清除與該文件的連接。確保在不再引用文件輸入流時調用其 close 方法。拋出IOException異常。
3 public int read(int r)throws IOException{}
這個方法從InputStream對象讀取指定位元組的數據。返回為整數值。返回下一位元組數據,如果已經到結尾則返回-1。
4 public int read(byte[] r) throws IOException{}
這個方法從輸入流讀取r.length長度的位元組。返回讀取的位元組數。如果是文件結尾則返回-1。
5 public int available() throws IOException{}
返回下一次對此輸入流調用的方法可以不受阻塞地從此輸入流讀取的位元組數。返回一個整數值。

除了InputStream外,還有一些其他的輸入流,更多的細節參考下麵鏈接:

FileOutputStream

 

該類用來創建一個文件並向文件中寫數據。

如果該流在打開文件進行輸出前,目標文件不存在,那麼該流會創建該文件。

有兩個構造方法可以用來創建FileOutputStream 對象。

使用字元串類型的文件名來創建一個輸出流對象:

OutputStream f = new FileOutputStream("C:/java/hello")

 

 

也可以使用一個文件對象來創建一個輸出流來寫文件。我們首先得使用File()方法來創建一個文件對象:

File f = new File("C:/java/hello");
OutputStream f = new FileOutputStream(f);

 

 

創建OutputStream 對象完成後,就可以使用下麵的方法來寫入流或者進行其他的流操作。

序號方法及描述
1 public void close() throws IOException{}
關閉此文件輸入流並釋放與此流有關的所有系統資源。拋出IOException異常。
2 protected void finalize()throws IOException {}
這個方法清除與該文件的連接。確保在不再引用文件輸入流時調用其 close 方法。拋出IOException異常。
3 public void write(int w)throws IOException{}
這個方法把指定的位元組寫到輸出流中。
4 public void write(byte[] w)
把指定數組中w.length長度的位元組寫到OutputStream中。

除了OutputStream外,還有一些其他的輸出流,更多的細節參考下麵鏈接:

實例

 

下麵是一個演示InputStream和OutputStream用法的例子:

import java.io.*;

public class fileStreamTest{

   public static void main(String args[]){
   
   try{
      byte bWrite [] = {11,21,3,40,5};
      OutputStream os = new FileOutputStream("test.txt");
      for(int x=0; x < bWrite.length ; x++){          os.write( bWrite[x] ); // writes the bytes       }       os.close();             InputStream is = new FileInputStream("test.txt");       int size = is.available();        for(int i=0; i< size; i++){          System.out.print((char)is.read() + "  ");       }       is.close();    }catch(IOException e){       System.out.print("Exception");    }        } }
 

 

上面的程式首先創建文件test.txt,並把給定的數字以二進位形式寫進該文件,同時輸出到控制臺上。

以上代碼由於是二進位寫入,可能存在亂碼,你可以使用以下代碼實例來解決亂碼問題:

//文件名 :fileStreamTest2.java
import java.io.*;

public class fileStreamTest2{
    public static void main(String[] args) throws IOException {
        
        File f = new File("a.txt");
        FileOutputStream fop = new FileOutputStream(f);
        // 構建FileOutputStream對象,文件不存在會自動新建
        
        OutputStreamWriter writer = new OutputStreamWriter(fop, "UTF-8");
        // 構建OutputStreamWriter對象,參數可以指定編碼,預設為操作系統預設編碼,windows上是gbk
        
        writer.append("中文輸入");
        // 寫入到緩衝區
        
        writer.append("\r\n");
        //換行
        
        writer.append("English");
        // 刷新緩存沖,寫入到文件,如果下麵已經沒有寫入的內容了,直接close也會寫入
        
        writer.close();
        //關閉寫入流,同時會把緩衝區內容寫入文件,所以上面的註釋掉
        
        fop.close();
        // 關閉輸出流,釋放系統資源

        FileInputStream fip = new FileInputStream(f);
        // 構建FileInputStream對象
        
        InputStreamReader reader = new InputStreamReader(fip, "UTF-8");
        // 構建InputStreamReader對象,編碼與寫入相同

        StringBuffer sb = new StringBuffer();
        while (reader.ready()) {
            sb.append((char) reader.read());
            // 轉成char加到StringBuffer對象中
        }
        System.out.println(sb.toString());
        reader.close();
        // 關閉讀取流
        
        fip.close();
        // 關閉輸入流,釋放系統資源

    }
}

 

 

文件和I/O

 

還有一些關於文件和I/O的類,我們也需要知道:

Java中的目錄

創建目錄:

 

File類中有兩個方法可以用來創建文件夾:

  • mkdir( )方法創建一個文件夾,成功則返回true,失敗則返回false。失敗表明File對象指定的路徑已經存在,或者由於整個路徑還不存在,該文件夾不能被創建。

  • mkdirs()方法創建一個文件夾和它的所有父文件夾。

下麵的例子創建 "/tmp/user/java/bin"文件夾:

import java.io.File;

public class CreateDir {
   public static void main(String args[]) {
      String dirname = "/tmp/user/java/bin";
      File d = new File(dirname);
      // 現在創建目錄
      d.mkdirs();
  }
}

 

 

編譯並執行上面代碼來創建目錄"/tmp/user/java/bin"。

註意:Java在UNIX和Windows自動按約定分辨文件路徑分隔符。如果你在Windows版本的Java中使用分隔符(/) ,路徑依然能夠被正確解析。

讀取目錄

 

一個目錄其實就是一個File對象,它包含其他文件和文件夾。

如果創建一個File對象並且它是一個目錄,那麼調用isDirectory( )方法會返回true。

可以通過調用該對象上的list()方法,來提取它包含的文件和文件夾的列表。

下麵展示的例子說明如何使用list()方法來檢查一個文件夾中包含的內容:

import java.io.File;

public class DirList {
   public static void main(String args[]) {
      String dirname = "/tmp";
      File f1 = new File(dirname);
      if (f1.isDirectory()) {
         System.out.println( "Directory of " + dirname);
         String s[] = f1.list();
         for (int i=0; i < s.length; i++) {             File f = new File(dirname + "/" + s[i]);             if (f.isDirectory()) {                System.out.println(s[i] + " is a directory");             } else {                System.out.println(s[i] + " is a file");             }          }       } else {          System.out.println(dirname + " is not a directory");     }   } }
 

 

以上實例編譯運行結果如下:

Directory of /tmp
bin is a directory
lib is a directory
demo is a directory
test.txt is a file
README is a file
index.html is a file
include is a directory

 


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

-Advertisement-
Play Games
更多相關文章
  • 可以使用 window.location 獲取當前頁面url。以下是一些簡單應用。 ...
  • html代碼: js代碼: ...
  • 史上最全的,web前端零基礎,系統學習路線圖!學好web前端,前途寬廣!如今隨著“互聯網+”上升到國家戰略,軟體行業與國民經濟關係密,幾乎絕大多數行業的發展都會促進軟體行業的發展。 ...
  • 編譯原理課程設計詞法分析任務書 5)參考文獻: (1)張素琴,呂映芝. 編譯原理[M]., 清華大學出版社 (2)蔣立源、康慕寧等,編譯原理(第2版)[M],西安:西北工業大學出版社 6)課程設計進度安排 1.準備階段(4學時):選擇設計題目、瞭解設計目的要求、查閱相關資料 2.程式模塊設計分析階段 ...
  • 舉個慄子 問題描述 要求有一個簡歷類,必須要有姓名,可以設置性別和年齡,可以設置工作經歷,最終需要三份簡歷。 簡單實現 簡歷類 測試 測試結果 存在的問題 跟手寫簡歷沒有差別,三份簡歷需要三份實例化,如果客戶需要二十份簡歷,那就得實例化二十次。 原型模式 定義 用原型實例指定創建對象的種類,並且通過 ...
  • SpringCloud系列教程 | 第十三篇:Spring Cloud Gateway服務化和過濾器 Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR1 如無特殊說明,本系列教程全採用以上版本 上一篇文章服務網關 Spring Cloud Gat ...
  • 最近這破事賊多,都沒有什麼時間寫寫博客,都好久都沒有更新博客了!不過平常看jdk源碼的時候有很大的感觸,就是基礎真的很重要,那什麼是基礎呢?除了java的基本語法之外,最基礎的莫過於原碼,反碼和補碼了以及基本的運算了! 又是我是編程半路出家,最開始的時候學過一點這些東西,當時只是感覺,擦!我是寫代碼 ...
  • Java線程池的原理,主要參數的作用。ThreadPoolExecutor內部有重要的成員變數ctl,類型是AtomicInteger,低29位表示線程池中線程數,通過高3位表示線程池的運行狀態。addWorker的邏輯,runWorker的邏輯 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...