1. 程式人生 > >java基本IO操作

java基本IO操作

1.1. InputStream與OutputStream

1.1.1. 輸入與輸出

我們編寫的程式除了自身會定義一些資料資訊外,經常還會引用外界的資料,或是將自身的資料傳送到外界。比如,我們編寫的程式想讀取一個文字檔案,又或者我們想將程式中的某些資料寫入到一個檔案中。這時我們就要使用輸入與輸出。

什麼是輸入:輸入是一個從外界進入到程式的方向,通常我們需要“讀取”外界的資料時,使用輸入。所以輸入是用來讀取資料的。

什麼是輸出:輸出是一個從程式傳送到外界的方向,通常我們需要”寫出”資料到外界時,使用輸出。所以輸出是用來寫出資料的。

1.1.2. 節點流與處理流

按照流是否直接與特定的地方 (如磁碟、記憶體、裝置等) 相連,分為節點流和處理流兩類。

節點流:可以從或向一個特定的地方(節點)讀寫資料。

處理流:是對一個已存在的流的連線和封裝,通過所封裝的流的功能呼叫實現資料讀寫。

處理流的構造方法總是要帶一個其他的流物件做引數。一個流物件經過其他流的多次包裝,稱為流的連結。

1.1.3. InputStream與OutputStream常用方法

InputStream是所有位元組輸入流的父類,其定義了基礎的讀取方法,常用的方法如下:

  1. int read()

讀取一個位元組,以int形式返回,該int值的”低八位”有效,若返回值為-1則表示EOF。

  1. int read(byte[] d)

嘗試最多讀取給定陣列的length個位元組並存入該陣列,返回值為實際讀取到的位元組量。

OutputStream是所有位元組輸出流的父類,其定義了基礎的寫出方法,常用的方法如下:

  1. void write(int d)

寫出一個位元組,寫的是給定的int的”低八位”

  1. void write(byte[] d)

將給定的位元組陣列中的所有位元組全部寫出

1.2. 檔案流

1.2.1. 建立FOS物件(重寫模式)

FileOutputStream是檔案的位元組輸出流,我們使用該流可以以位元組為單位將資料寫入檔案。

構造方法:

  1. FileOutputStream(Filefile)

建立一個向指定 File 物件表示的檔案中寫入資料的檔案輸出流。

例如:

  1. FIlefile = new File("demo.dat"
    );
  2. FileOutputStreamfos = new FileOutputStream(file);

構造方法:

  1. FileOutputStream(Stringfilename):

建立一個向具有指定名稱的檔案中寫入資料的輸出文 件流。

例如:

  1. FileOutputStreamfos = new FileOutputStream("demo.dat");

這裡需要注意,若指定的檔案已經包含內容,那麼當使用FOS對其寫入資料時,會將該檔案中原有資料全部清除。

1.2.2. 建立FOS物件(追加模式)

通過上一節的構造方法建立的FOS對檔案進行寫操作時會覆蓋檔案中原有資料。若想在檔案的原有資料之後追加新資料則需要以下構造方法建立FOS

構造方法:

  1. FileOutputStream(Filefile,boolean append)

建立一個向指定 File 物件表示的檔案中寫入資料的檔案輸出流。

例如:

  1. Filefile = new File("demo.dat");
  2. FileOutputStreamfos = new FileOutputStream(file,true);

構造方法:

  1. FileOutputStream(Stringfilename,boolean append):

建立一個向具有指定名稱的檔案中寫入資料的輸出文 件流。

例如:

  1. FileOutputStreamfos = new FileOutputStream("demo.dat",true);

以上兩個構造方法中,第二個引數若為true,那麼通過該FOS寫出的資料都是在檔案末尾追加的。

1.2.3. 建立FIS物件

FileInputStream是檔案的位元組輸入流,我們使用該流可以以位元組為單位讀取檔案內容。

FileInputStream有兩個常用的構造方法:

  1. FileInputStream(Filefile):

建立用於讀取給定的File物件所表示的檔案FIS

例如:

  1. Filefile = new File("demo.dat");
  2. FileInputStream fis
  3.     = new FileInputStream(file);//建立一個用於讀取demo.dat檔案的輸入流

另一個構造方法:

  1. FileInputStream(Stringname):

建立用於讀取給定的檔案系統中的路徑名name所指定的檔案的FIS

例如

  1. FileInputStream fis
  2.     //建立一個用於讀取demo.dat檔案的輸入流
  3.     = new FileInputStream("demo");

1.2.4. read()和write(int d)方法

FileInputStream繼承自InputStream,其提供了以位元組為單位讀取檔案資料的方法read。

  1. int read()

從此輸入流中讀取一個數據位元組,若返回-1則表示EOF(End Of File)

FileOutputStream繼承自OutputStream,其提供了以位元組為單位向檔案寫資料的方法write。

  1. void write(int d)

將指定位元組寫入此檔案輸出流。,這裡只寫給定的int值的”低八位”

例如

  1. FileOutputStreamfos = new FileOutputStream("demo.dat");
  2. fos.write('A');//這裡要注意,char佔用2個位元組,但這裡只寫入了1個位元組。

1.2.5. read(byte[] d)和write(byte[] d)方法

FileInputStream也支援批量讀取位元組資料的方法:

  1. int read(byte[] b)

從此輸入流中將最多 b.length 個位元組的資料讀入一個 byte 陣列中 。

FileOutputStream也支援批量寫出位元組資料的方法:

  1. void write(byte[] d)

將 b.length 個位元組從指定 byte 陣列寫入此檔案輸出流中。

例如:

  1. FileOutputStreamfos = new FileOutputStream("demo.txt");
  2. byte[] data = "HelloWorld".getBytes();
  3. fos.write(data);//會將HelloWorld的所有位元組寫入檔案。

將指定 byte 陣列中從偏移量 off 開始的 len 個位元組寫入此檔案輸出流的方法:

  1. void write(byte[] d,int offset,int len)

例如:

  1. FileOutputStreamfos = new FileOutputStream("demo.txt");
  2. byte[] data = "HelloWorld".getBytes();
  3. fos.write(data,5,5);//只會將world這5個位元組寫入檔案。

1.3. 緩衝流

1.3.1. BOS基本工作原理

與緩衝輸入流相似,在向硬體裝置做寫出操作時,增大寫出次數無疑也會降低寫出效率,為此我們可以使用緩衝輸出流來一次性批量寫出若干資料減少寫出次數來提高寫 出效率。

BufferedOutputStream緩衝輸出流內部也維護著一個緩衝區,每當我們向該流寫資料時,都會先將資料存入緩衝區,當緩衝區已滿時,緩衝流會將資料一次性全部寫出。

1.3.2. BOS實現寫出緩衝

實現寫出緩衝:

  1. public void testBos()throws Exception {
  2.     FileOutputStreamfos = new FileOutputStream("demo.dat");
  3.     //建立緩衝位元組輸出流
  4.     BufferedOutputStream bos
  5.             = new BufferedOutputStream(fos);
  6. //所有位元組被存入緩衝區,等待一次性寫出
  7.     bos.write("helloworld".getBytes());
  8.     //關閉流之前,緩衝輸出流會將緩衝區內容一次性寫出
  9.     bos.close();
  10. }

1.3.3. BOS的flush方法

使用緩衝輸出流可以提高寫出效率,但是這也存在著一個問題,就是寫出資料缺乏即時性。有時我們需要在執行完某些寫出操作後,就希望將這些資料確實寫出,而非在緩衝區中儲存直到緩衝區滿後才寫出。這時我們可以使用緩衝流的一個方法flush。

  1. void flush()

清空緩衝區,將緩衝區中的資料強制寫出。

例如:

  1. BufferedOutputStream bos
  2.             = new BufferedOutputStream(
  3.                 new FileOutputStream("demo.dat")
  4.             );
  5. bos.write('a');//並沒有向磁碟寫出,而是寫入到了BOS的快取中
  6. bos.flush();//強制將快取中的資料一次性寫出,這時‘a’才會被寫入磁碟
  7. bos.close();//實際上,close()方法在變比緩衝流前也呼叫了flush()

1.3.4. BIS基本工作原理

在讀取資料時若以位元組為單位讀取資料,會導致讀取次數過於頻繁從而大大的降低讀取效率。為此我們可以通過提高一次讀取的位元組數量減少讀寫次數來提高讀取的效率。

BufferedInputStream是緩衝位元組輸入流。其內部維護著一個緩衝區(位元組陣列),使用該流在讀取一個位元組時,該流會盡可能多的一次性讀取若干位元組並存入緩衝區,然後逐一的將位元組返回,直到緩衝區中的資料被全部讀取完畢,會再次讀取若干位元組從而反覆。這樣就減少了讀取的次數,從而提高了讀取效率。

BIS是一個處理流,該流為我們提供了緩衝功能。

1.3.5. BIS實現輸入緩衝

使用緩衝流來實現檔案複製:

  1. FileInputStreamfis = new FileInputStream("java.zip");
  2. BufferedInputStreambis = new BufferedInputStream(fis);
  3. FileOutputStreamfos = new FileOutputStream("copy_java.zip");
  4. BufferedOutputStreambos = new BufferedOutputStream(fos);
  5. int d = -1;
  6. while((d = bis.read())!=-1){
  7.     bos.write(d);
  8. }
  9. bis.close();//讀寫完畢後要關閉流,只需要關閉最外層的流即可
  10. bos.close();

1.4. 物件流

1.4.1. 物件序列化概念

物件是存在於記憶體中的。有時候我們需要將物件儲存到硬碟上,又有時我們需要將物件傳輸到另一臺計算機上等等這樣的操作。這時我們需要將物件轉換為一個位元組序列,而這個過程就稱為物件序列化。相反,我們有這樣一個位元組序列需要將其轉換為對應的物件,這個過程就稱為物件的反序列化。

1.4.2. 使用OOS實現物件序列化

ObjectOutputStream是用來對物件進行序列化的輸出流。

其實現物件序列化的方法為:

  1. void writeObject(Objecto)

該方法可以將給定的物件轉換為一個位元組序列後寫出。

例如:

  1. Empemp = new Emp("張三",12"男");
  2. FileOutputStreamfos = new FileOutputStream("Emp.obj");
  3. ObjectOutputStreamoos = new ObjectOutputStream(fos);
  4. oos.writeObject(emp);//將emp物件序列化後寫入檔案
  5. oos.close();

1.4.3. 使用OIS實現物件反序列化

ObjectInputStream是用來對物件進行反序列化的輸入流。

其實現物件反序列化的方法為:

  1. ObjectreadObject()

該方法可以從流中讀取位元組並轉換為對應的物件。

例如:

  1. FileInputStreamfis = new FileInputStream("Emp.obj");
  2. ObjectInputStreamois = new ObjectInputStream(fis);
  3. Empemp = (Emp)ois.readObject();//將Emp物件從檔案中讀取並反序列
  4. ....
  5. ois.close();

1.4.4. Serializable介面

ObjectOutputStream在對物件進行序列化時有一個要求,就是需要序列化的物件所屬的類必須實現Serializable介面。

實現該介面不需要重寫任何方法。其只是作為可序列化的標誌。

通常實現該介面的類需要提供一個常量serialVersionUID,表明該類的版本。若不顯示的宣告,在物件序列化時也會根據當前類的各個方面計算該類的預設serialVersionUID,但不同平臺編譯器實現有所不同,所以若向跨平臺,都應顯示的宣告版本號。

如果宣告的類序列化存到硬碟上面,之後隨著需求的變化更改了類別的屬性(增加或減少或改名),那麼當反序列化時,就會出現InvalidClassException,這樣就會造成不相容性的問題。 但當serialVersionUID相同時,它就會將不一樣的field以type的預設值反序列化,可避開不相容性問題。

例如:

  1. public classEmp implements Serializable{
  2.     private static final long serialVersionUID = 1L;
  3.     private Stringname;
  4.     private int age;
  5.     private Stringgender;
  6.     //getter and setter and other
  7.     ...
  8. }

1.4.5. transient關鍵字

物件在序列化後得到的位元組序列往往比較大,有時我們在對一個物件進行序列化時可以忽略某些不必要的屬性,從而對序列化後得到的位元組序列”瘦身”。

關鍵字 transient

被該關鍵字修飾的屬性在序列化時其值將被忽略

例如:

  1. public classEmp implements Serializable{
  2.     private static final long serialVersionUID = 1L;
  3.     private Stringname;
  4.     private transient int age;//該屬性在序列化時會被忽略
  5.     private Stringgender;
  6.     //getter and setter and other
  7.     ...
  8. }

2. 檔案資料IO操作

2.1. Reader和Writer

2.1.1. 字元流原理

Reader是所有字元輸入流的父類,而Writer是所有字元輸出流的父類。字元流是以字元(char)為單位讀寫資料的。一次處理一個unicode。字元流都是高階流,其底層都是依靠位元組流進行讀寫資料的,所以底層仍然是基於位元組讀寫資料的。

2.1.2. 常用方法

相關推薦

Java基本IO操作(流)

一、 流的概述 1、什麼是流 流根據方向不同分為輸入流與輸出流,參照點為當前程式。輸入流用來讀取資料,輸出流用來寫資料。 2、流的分類(2類) 節點流(也叫低階流) 是真實負責讀寫資料的流,讀寫操作中必須要有低階流。資料來源明確。 處理流(也

java基本IO操作

1.1. InputStream與OutputStream1.1.1. 輸入與輸出我們編寫的程式除了自身會定義一些資料資訊外,經常還會引用外界的資料,或是將自身的資料傳送到外界。比如,我們編寫的程式想讀取一個文字檔案,又或者我們想將程式中的某些資料寫入到一個檔案中。這時我們就

Java(五)IO操作2.File的基本操作

import java.io.File; public class FileDemo2 { public static void main(String[] args) { text1(); text2(); } private static

89、javaIO操作-基本資料操作

/* * 可以讀寫基本資料型別的資料 * 資料輸入流:DataInputStream * DataInputStream(InputStream in) * 資料輸出流:DataOutputStream * DataOutputStream(Outpu

java基本io流的操作

1.將控制檯輸入的寫入到txt檔案中 package com.soulant.main; import java.io.BufferedReader; import java.io.Bu

JavaIO操作中關閉流的注意點

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

javaIO操作之 節點流

轉換流:位元組流轉字元流(處理亂碼) 二進位制(計算機)  解碼 字元(人類) 字元(人類) 編碼   二進位制(計算機) 亂碼原因:編碼與解碼字符集不一致   位元組缺少,長度丟失 package learn_java.io.oth

java標準IO操作(二)

java按照讀寫的資料單位將流劃分為兩大類 位元組流,字元流 位元組流是以位元組為單位讀寫資料的流,由於計算機底層都是2進位制,所以位元組流可以讀寫任意資料 字元流是以字元為單位讀寫資料的流,實際底層還是讀寫位元組 但是字元流會自動將位元組與字元進行對應的轉換工作, 因此字元流天

java標準IO操作(一)

IO指的是Input,Output.即:輸入與輸出 流按照方向實際是按照功能進行劃分,參照方向是我們的程式 輸入流用於讀取,即:從外界進入程式的過程,獲取資料 輸出流用於寫出,即:程式傳送到外界的過程,傳送資料 流劃分為兩類: 節點流,處理流 節點流:又稱為低階流,是真實連線

JAVA——基本字元操作(二)

JAVA——基本字元操作、 本文通過一個例子,來展示兩個字元集合間的對比結果。 1.要求 設有兩字串構成的集合,字串內容值為 A:{a,b,c,d,e,f,g,in,off,about,get} B:{f,g,a,come,get,go

Java(五)IO操作4.位元組輸出流

import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; public class FileOutputStreamDemo { p

javaio操作(將字串寫入到txt檔案中)

import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOEx

Java基礎---IO操作1

        輸入字元流         -----| Reader                       輸入字元流基類             -----------| FileReader      輸入字元流管道             -----------| BUfferedReader

JAVA基本輸入操作

JAVA語言輸入語句操作 Java中輸入一般是通過Scanner類來實現的: 具體步驟如下: (1)建立Scanner物件,接受從控制檯輸入 Scanner input=new Scanner(System.in); (2) 接受String型別 String

【轉載】JAVAIO操作基本規律總結

reader 對象 作文 若是 gpo 是否 目的 io流 基本 流操作的基本規律:三個明確 1.明確源和目的; 源:輸入流即讀取流 InputStream,Reader 目的:輸出流即寫入流 OutputStream, Writer 2.明確操作的數據是

最全面的Java字節byte操作,處理Java基本數據的轉換及進制轉換操作工具,流媒體及java底層開發項目常用工具類

進制 string 常用工具類 cat i++ logs 指定位置 tput off 前言:用於處理Java基本數據的轉換及進制轉換操作工具 一、實現功能 1、int預byte互轉 2、int與byte[]互轉 3、short與byte互轉 4、short與byte[]互轉

20170831 - A - Java IO操作

throw 發生 輸入 連接 char gbk erro 二進制 utf 1 當需要將對象轉化為字節用什麽?對象流Person p = new Person("蒼老師",18,"男" ,list);System.out.println(p); FileOutputStre

Java中的IO操作 字符流:FileReader和 FileWriter

void contain desc method eno exceptio contains args http FileReader和 FileWriter 讀寫字符串 1 package object.io; 2 3 import java.io.Buff

java IO操作:FileInputStream,FileOutputStream,FileReader,FileWriter實例

tput stream com -h port pri exc public 父類 FileInputStream <span style="font-family:Verdana;">import java.io.File; impo

Java 常用IO操作詳解

字符集 -s fileinput 顯式 print OS 數值 重寫 目錄 1.基本概念 IO:Java對數據的操作是通過流的方式,IO流用來處理設備之間的數據傳輸,上傳文件和下載文件,Java用於操作流的對象都在IO包中。 2.IO流的分類 圖示:(主要IO流)