1. 程式人生 > >java-IO-基本概念

java-IO-基本概念

1.什麼是IO

      Java中I/O操作主要是指使用Java進行輸入,輸出操作. Java所有的I/O機制都是基於資料流進行輸入輸出,這些資料流表示了字元或者位元組資料的流動序列。Java的I/O流提供了讀寫資料的標準方法。任何Java中表示資料來源的物件都會提供以資料流的方式讀寫它的資料的方法。 

      Java.io是大多數面向資料流的輸入/輸出類的主要軟體包。此外,Java也對塊傳輸提供支援,在核心庫 java.nio中採用的便是塊IO。

  流IO的好處是簡單易用,缺點是效率較低。塊IO效率很高,但程式設計比較複雜。       Java IO模型  :       Java的IO模型設計非常優秀,它使用Decorator模式,按功能劃分Stream,您可以動態裝配這些Stream,以便獲得您需要的功能。例如,您需要一個具有緩衝的檔案輸入流,則應當組合使用FileInputStream和BufferedInputStream。

2.資料流的基本概念

       資料流是一串連續不斷的資料的集合,就象水管裡的水流,在水管的一端一點一點地供水,而在水管的另一端看到的是一股連續不斷的水流。資料寫入程式可以是一段、一段地向資料流管道中寫入資料,這些資料段會按先後順序形成一個長的資料流。對資料讀取程式來說,看不到資料流在寫入時的分段情況,每次可以讀取其中的任意長度的資料,但只能先讀取前面的資料後,再讀取後面的資料。不管寫入時是將資料分多次寫入,還是作為一個整體一次寫入,讀取時的效果都是完全一樣的。

      “流是磁碟或其它外圍裝置中儲存的資料的源點或終點。”

    在電腦上的資料有三種儲存方式,一種是外存,一種是記憶體,一種是快取。比如電腦上的硬碟,磁碟,U盤等都是外存,在電腦上有記憶體條,快取是在CPU裡面的。外存的儲存量最大,其次是記憶體,最後是快取,但是外存的資料的讀取最慢,其次是記憶體,快取最快。這裡總結從外存讀取資料到記憶體以及將資料從記憶體寫到外存中。對於記憶體和外存的理解,我們可以簡單的理解為容器,即外存是一個容器,記憶體又是另外一個容器。那又怎樣把放在外存這個容器內的資料讀取到記憶體這個容器以及怎麼把記憶體這個容器裡的資料存到外存中呢?

     在Java類庫中,IO部分的內容是很龐大的,因為它涉及的領域很廣泛:

         標準輸入輸出,檔案的操作,網路上的資料流,字串流,物件流,zip檔案流等等,java中將輸入輸出抽象稱為流,就好像水管,將兩個容器連線起來。將資料衝外存中讀取到記憶體中的稱為輸入流,將資料從記憶體寫入外存中的稱為輸出流。

    流是一個很形象的概念,當程式需要讀取資料的時候,就會開啟一個通向資料來源的流,這個資料來源可以是檔案,記憶體,或是網路連線。類似的,當程式需要寫入資料的時候,就會開啟一個通向目的地的流。

      總結的基本概念如下:

1) 資料流

    一組有序,有起點和終點的位元組的資料序列。包括輸入流和輸出流。

  

2) 輸入流(Input  Stream):

      程式從輸入流讀取資料來源。資料來源包括外界(鍵盤、檔案、網路…),即是將資料來源讀入到程式的通訊通道

     

3) 輸出流

    程式向輸出流寫入資料。將程式中的資料輸出到外界(顯示器、印表機、檔案、網路…)的通訊通道。

        

採用資料流的目的就是使得輸出輸入獨立於裝置。

Input Stream不關心資料來源來自何種裝置(鍵盤,檔案,網路) Output Stream不關心資料的目的是何種裝置(鍵盤,檔案,網路)

4 資料流分類:

流序列中的資料既可以是未經加工的原始二進位制資料,也可以是經一定編碼處理後符合某種格式規定的特定資料。因此Java中的流分為兩種: 1) 位元組流:資料流中最小的資料單元是位元組 2)  字元流:資料流中最小的資料單元是字元, Java中的字元是Unicode編碼,一個字元佔用兩個位元組。

3. 標準I/O

Java程式可通過命令列引數與外界進行簡短的資訊交換,同時,也規定了與標準輸入、輸出裝置,如鍵盤、顯示器進行資訊交換的方式。而通過檔案可以與外界進行任意資料形式的資訊交換。

1. 命令列引數

  1. public class TestArgs { 
  2.     public static void main(String[] args) { 
  3.         for (int i = 0; i < args.length; i++) { 
  4.             System.out.println("args[" + i + "] is <" + args[i] + ">"); 
  5.         } 
  6.     } 
public class TestArgs {
	public static void main(String[] args) {
		for (int i = 0; i < args.length; i++) {
			System.out.println("args[" + i + "] is <" + args[i] + ">");
		}
	}
}

執行命令:java Java C VB

執行結果:

args[0] is <Java>

args[1] is <C>

args[2] is <VB>

2. 標準輸入,輸出資料流

java系統自帶的標準資料流:java.lang.System:

  1. java.lang.System  
  2. public final class System  extends Object{  
  3.    static  PrintStream  err;//標準錯誤流(輸出)  
  4.    static  InputStream  in;//標準輸入(鍵盤輸入流)  
  5.    static  PrintStream  out;//標準輸出流(顯示器輸出流)  
java.lang.System 
public final class System  extends Object{ 
   static  PrintStream  err;//標準錯誤流(輸出)
   static  InputStream  in;//標準輸入(鍵盤輸入流)
   static  PrintStream  out;//標準輸出流(顯示器輸出流)
}

注意: (1)System類不能建立物件,只能直接使用它的三個靜態成員。 (2)每當main方法被執行時,就自動生成上述三個物件。

1) 標準輸出流 System.out

  System.out向標準輸出裝置輸出資料,其資料型別為PrintStream。方法:

      Void print(引數)       Void println(引數)

2)標準輸入流 System.in

    System.in讀取標準輸入裝置資料(從標準輸入獲取資料,一般是鍵盤),其數 據型別為InputStream。方法:

        int read()  //返回ASCII碼。若,返回值=-1,說明沒有讀取到任何位元組讀取工作結束。          int read(byte[] b)//讀入多個位元組到緩衝區b中返回值是讀入的位元組數 例如:
  1. import java.io.*; 
  2. public class StandardInputOutput { 
  3.     public static void main(String args[]) { 
  4.         int b; 
  5.         try { 
  6.             System.out.println("please Input:"); 
  7.             while ((b = System.in.read()) != -1) { 
  8.                 System.out.print((char) b); 
  9.             } 
  10.         } catch (IOException e) { 
  11.             System.out.println(e.toString()); 
  12.         } 
  13.     } 
import java.io.*;
public class StandardInputOutput {
	public static void main(String args[]) {
		int b;
		try {
			System.out.println("please Input:");
			while ((b = System.in.read()) != -1) {
				System.out.print((char) b);
			}
		} catch (IOException e) {
			System.out.println(e.toString());
		}
	}
}
等待鍵盤輸入,鍵盤輸入什麼,就打印出什麼:

3)標準錯誤流

  System.err輸出標準錯誤,其資料型別為PrintStream。可查閱API獲得詳細說明。

    標準輸出通過System.out呼叫println方法輸出引數並換行,而print方法輸出引數但不換行。println或print方法都通 過過載實現了輸出基本資料型別的多個方法,包括輸出引數型別為boolean、char、int、long、float和double。同時,也過載實現 了輸出引數型別為char[]、String和Object的方法。其中,print(Object)和println(Object)方法在執行時將調 用引數Object的toString方法。

  1. import java.io.BufferedReader; 
  2. import java.io.IOException; 
  3. import java.io.InputStreamReader; 
  4. public class StandardInputOutput { 
  5.     public static void main(String args[]) { 
  6.         String s; 
  7.         // 建立緩衝區閱讀器從鍵盤逐行讀入資料  
  8.         InputStreamReader ir = new InputStreamReader(System.in); 
  9.         BufferedReader in = new BufferedReader(ir); 
  10.         System.out.println("Unix系統: ctrl-d 或 ctrl-c 退出" 
  11.                 + "\nWindows系統: ctrl-z 退出"); 
  12.         try { 
  13.             // 讀一行資料,並標準輸出至顯示器  
  14.             s = in.readLine(); 
  15.             // readLine()方法執行時若發生I/O錯誤,將丟擲IOException異常  
  16.             while (s != null) { 
  17.                 System.out.println("Read: " + s); 
  18.                 s = in.readLine(); 
  19.             } 
  20.             // 關閉緩衝閱讀器  
  21.             in.close(); 
  22.         } catch (IOException e) { // Catch any IO exceptions.  
  23.             e.printStackTrace(); 
  24.         } 
  25.     } 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class StandardInputOutput {
	public static void main(String args[]) {
		String s;
		// 建立緩衝區閱讀器從鍵盤逐行讀入資料
		InputStreamReader ir = new InputStreamReader(System.in);
		BufferedReader in = new BufferedReader(ir);
		System.out.println("Unix系統: ctrl-d 或 ctrl-c 退出"
				+ "\nWindows系統: ctrl-z 退出");
		try {
			// 讀一行資料,並標準輸出至顯示器
			s = in.readLine();
			// readLine()方法執行時若發生I/O錯誤,將丟擲IOException異常
			while (s != null) {
				System.out.println("Read: " + s);
				s = in.readLine();
			}
			// 關閉緩衝閱讀器
			in.close();
		} catch (IOException e) { // Catch any IO exceptions.
			e.printStackTrace();
		}
	}
}

4.java.IO層次體系結構

     在整個Java.io包中最重要的就是5個類和一個介面。5個類指的是File、OutputStream、InputStream、Writer、Reader;一個介面指的是Serializable.掌握了這些IO的核心操作那麼對於Java中的IO體系也就有了一個初步的認識了

      Java I/O主要包括如下幾個層次,包含三個部分:

  1.流式部分――IO的主體部分;

   2.非流式部分――主要包含一些輔助流式部分的類,如:File類、RandomAccessFile類和FileDescriptor等類;

  3.其他類--檔案讀取部分的與安全相關的類,如:SerializablePermission類,以及與本地作業系統相關的檔案系統的類,如:FileSystem類和Win32FileSystem類和WinNTFileSystem類。

  主要的類如下:

     1. File(檔案特徵與管理):用於檔案或者目錄的描述資訊,例如生成新目錄,修改檔名,刪除檔案,判斷檔案所在路徑等。

     2. InputStream(二進位制格式操作):抽象類,基於位元組的輸入操作,是所有輸入流的父類。定義了所有輸入流都具有的共同特徵。

     3. OutputStream(二進位制格式操作):抽象類。基於位元組的輸出操作。是所有輸出流的父類。定義了所有輸出流都具有的共同特徵。

     Java中字元是採用Unicode標準,一個字元是16位,即一個字元使用兩個位元組來表示。為此,JAVA中引入了處理字元的流。

     4. Reader(檔案格式操作):抽象類,基於字元的輸入操作。

     5. Writer(檔案格式操作):抽象類,基於字元的輸出操作。

     6. RandomAccessFile(隨機檔案操作):它的功能豐富,可以從檔案的任意位置進行存取(輸入輸出)操作

     Java中IO流的體系結構如圖:

     

5. 非流式檔案類--File類

在Java語言的java.io包中,由File類提供了描述檔案和目錄的操作與管理方法。但File類不是InputStream、OutputStream或Reader、Writer的子類,因為它不負責資料的輸入輸出,而專門用來管理磁碟檔案與目錄。 作用:File類主要用於命名檔案、查詢檔案屬性和處理檔案目錄。
  1. public    class   File   extends Object  
  2.     implements Serializable,Comparable 
  3. {} 
public    class   File   extends Object 
    implements Serializable,Comparable
{}
File類共提供了三個不同的建構函式,以不同的引數形式靈活地接收檔案和目錄名資訊。建構函式: 1)File (String   pathname)        例:File  f1=new File("FileTest1.txt"); //建立檔案物件f1,f1所指的檔案是在當前目錄下建立的FileTest1.txt 2)File (String  parent  ,  String child)      例:File f2=new  File(“D:\\dir1","FileTest2.txt") ;// 注意:D:\\dir1目錄事先必須存在,否則異常 3)File (File    parent  , String child)      例:File  f4=new File("\\dir3");           File  f5=new File(f4,"FileTest5.txt");  //在如果 \\dir3目錄不存在使用f4.mkdir()先建立         一個對應於某磁碟檔案或目錄的File物件一經建立, 就可以通過呼叫它的方法來獲得檔案或目錄的屬性。           1)public boolean exists( )判斷檔案或目錄是否存在        2)public boolean isFile( ) 判斷是檔案還是目錄        3)public boolean isDirectory( ) 判斷是檔案還是目錄       4)public String getName( ) 返回檔名或目錄名        5)public String getPath( ) 返回檔案或目錄的路徑。        6)public long length( ) 獲取檔案的長度        7)public String[ ] list ( ) 將目錄中所有檔名儲存在字串陣列中返回。        File類中還定義了一些對檔案或目錄進行管理、操作的方法,常用的方法有:        1) public boolean renameTo( File newFile );    重新命名檔案        2) public void delete( );   刪除檔案        3)  public boolean mkdir( ); 建立目錄 例子:
  1. import java.io.File; 
  2. import java.io.IOException; 
  3. public class TestFile { 
  4.     public static void main(String args[]) throws IOException { 
  5.         File dir = new File("\\root"); 
  6.         File f1 = new File(dir, "fileOne.txt"); 
  7.         File f2 = new File(dir, "fileTwo.java"); 
  8.         // 檔案物件建立後,指定的檔案或目錄不一定物理上存在  
  9.         if (!dir.exists()) 
  10.             dir.mkdir(); 
  11. 相關推薦

    java-IO-基本概念

    1.什麼是IO       Java中I/O操作主要是指使用Java進行輸入,輸出操作. Java所有的I/O機制都是基於資料流進行輸入輸出,這些資料流表示了字元或者位元組資料的流動序列。Java的I/O流提供了讀寫資料的標準方法。任何Java中表示資料來源的物

    Java程序基本概念

    存在 劃分 操作數 catch this col 發生 con nbsp 大家好,在這裏跟大家講解一下關於Java程序的基本概念應用。 以下本人的介紹包括有以下的幾點: 一、標識符的定義 二、數據類型的劃分 三、運算符的應用 四、分支結構、循環結構、循環控制語法的應用 五、

    Java容器---基本概念

    一個 reac 通過 java容器 list 相同 -i order 元素 1.持有對象 Java容器類類庫的用途是“保存對象”,並將其劃分為兩個不同的概念: (1) Collection: 一個獨立元素的序列,這些元素都服從一條或多條規則。L

    監視器–JAVA同步基本概念

    原文連結  作者:X Wang  譯者:candy 大學有一門課程叫作業系統,學習過的同學應該都記得,監視器是作業系統實現同步的重要基礎概念,同樣它也用在JAVA的執行緒同步中,這篇文章用一種類推的思想解釋監視器”monitor”。 1.什麼是監視器 監視器可以看做是經過特殊佈置的建築,這個建

    java陣列基本概念

    陣列動態初始化 陣列是引用資料型別,有記憶體分配問題。 陣列動態初始化(宣告並開闢陣列): 陣列型別[] 陣列名稱 = new 陣列型別[長度]; int[] data = new int[5]; a.陣列通過下標索引來取得元素,預設從0開始。陣列下標超出陣

    Java基本概念-三大迴圈

    程式的三種結構:順序結構 分支結構和迴圈結構 1 正常迴圈的4個條件:迴圈條件:迴圈的入口                                             迴圈變數:用來控制迴圈次數                                

    Java web的基本概念

    一定的 本質 解析 計算機系統 tom 調用 war 保存 web模塊 概念一直是學習計算機軟件開發中經常遇到的問題,也是軟件行業最喜歡創造的東西。很多時候,學習計算機軟件開發遇到困難都是因為對某些概念的不理解,而不是因為技術本身有多麽復雜。Java Web作為Java

    java多線程_01_線程的基本概念

    bool 我們 優先 try 立即執行 合並 abcde rup unix 線程:一個程序裏邊不同的執行路徑 例子程序:這個例子程序是一條執行路徑。這個程序只有一個分支,就是main方法,叫主線程 public static void main(String[]

    java基本概念

    java gc一、JVM和jdk概念說明:1.JVM是Java虛擬機,所有的Java程序都在Java虛擬機中運。2.JDK是Java開發工具包,用來開發Java程序,是整個Java的核心,包括了Java運行環境、Java工具和Java基礎類庫3.jdk中有一個編譯器,可以把你的java源代碼編譯成可以在虛擬機

    Java - 線程基本概念

    完整 顯式 數據訪問 基本概念 重新 object www 外部 object類 【java並發編程實戰】-----線程基本概念 線程狀態圖 說明:線程共包括以下5種狀態。1. 新建狀態(New) : 線程對象被創建後,就進入了新建狀態。例如,Thre

    Java-Java程序設計的基本概念

    科學 獲取 img 32位 基本 含義 科學計數 而且 變量 2017-10-06 15:31:39 一、Java程序的基本構成 二、數據類型與標識符 數據類型 標識符 廣義的用於定義各種對象名稱的字符串集合稱為標識符,標識符一般分為用戶

    java程序設計基本概念

    pan 內部 創建 編譯期 內存 nbsp blog 區別 strong JVM (1)對於字符串:其對象的引用都是存儲在棧中的,如果是編譯期已經創建好(直接用雙引號定義的)的就存儲在常量池中,如果是運行期(new出來的)才能確定的就存儲在堆中。對於equals相等

    java:io基本實例

    target close package fileread 取數 mem nload 方法 ace 一,io的常用類:   1,File類   2,OutputStream 字節輸出流   3,InputStream 字節輸入流   4,Writer 字符輸出流

    java並發的基本概念和級別

    結構 樂觀 live 執行 完成後 不成功 CP 被占用 如果 並發的概念: 並發(Concurrency)和並行(Parallelism) 並發偏重於多個任務交替執行,而多個任務之間有可能還是串行的。而並行是真正意義上的“同時執行”。嚴格意義上

    java 多線程的基本概念

    java 概念 操作 進程 多線程 數據 進行 發生 程序 進程: 進程是操作系統結構的基礎,是程序的一次運行,是一個程序及其數據在處理機上順序執行時所發生的活動,是程序在一個數據集合上運行的過程,它是系統進行資源分配和調度的一個單位 線程: 線程是程序執行的一

    輕松學會Java高並發第一課-並發的基本概念

    並行 運行 設計 多核處理器 區別 聯網 ava 行處理 互聯網 概念 並發:同時擁有兩個或者多個線程,如果程序在單核處理器上運行,多個線程將交替地換入或者換出內存,每個線程都處於執行過程中的某個狀態。如果運行在多核處理器上,此時,程序中的每個線程都將分配到一個處理器核上

    Java新手入門的三十個基本概念

    在我們學習Java的過程中,掌握其中的基本概念對我們的學習無論是J2SE,J2EE,J2ME都是很重要的,J2SE是Java的基礎,所以有必要對其中的基本概念做以歸納,以便大家在以後的學習過程中更好的理解java的精髓,在此我總結了30條基本的概念。  Java概述: 

    java併發程式設計實戰】—–執行緒基本概念

    轉自 http://cmsblogs.com/?p=1638 共享和可變 要編寫執行緒安全的程式碼,其核心在於對共享的和可變的狀態進行訪問。 “共享”就意味著變數可以被多個執行緒同時訪問。我們知道系統中的資源是有限的,不同的執行緒對資源都是具有著同等的使用權。有限、公平就意味著競爭

    JAVA併發程式設計之基本概念

    1、鎖是對物件訪問的時候,通過對物件加鎖,防止並行訪問的控制手段;對物件加鎖成功,代表我持有這個物件的監視器,解鎖,代表釋放了這個物件的監視器。 拿到物件的監視器,肯定是對物件加鎖成功的;對物件加鎖成功 ,程式可以主動Watiing或者Time_waiting在物件監視器上。 2、鎖與監

    Java 面向物件基本概念

    我自己根據我的經驗,自己歸檔總結了下, 所謂面向物件,就是 以基於物件的思維去分析和解決問題,萬物皆物件;   面向物件經常和麵向過程放一起討論;   這裡舉例, 比如要造一輛自行車,假如以面向過程的思維搞,張三先搞輪子, 李四再搞車架,王五再搞鏈條,趙六再搞腳踏板...最終