Java I/O

來源:互聯網
上載者:User

標籤:apple   讀寫   null   升級   讀取方法   image   abc   play   iter   

在Java數組,變數和對象中儲存資料是暫時的,為保證永久地儲存資料,就需要將其儲存在硬碟檔案中,Java的I/O技術就可以將資料儲存為硬碟的文字檔。在瞭解“流”之前,我們需要先來看什麼是電腦的記憶體和硬碟。

 

記憶體是電腦的資料存放區裝置之一,用來存放正在啟動並執行程式和資料,可直接與運算器及控制器交換資訊。記憶體是電腦中重要的組件之一,它是與CPU進行溝通的橋樑。電腦中所有程式的運行都是在記憶體中進行的,其作用是用於暫時存放CPU中的運算資料,以及與硬碟等外部儲存空間交換的資料。只要電腦在運行中,CPU就會把需要運算的資料調到記憶體中進行運算,當運算完成後CPU再將結果傳送出來。硬碟是電腦重要的外部存放裝置,電腦的作業系統、應用軟體、文檔、資料等,都可以存放在硬碟上。

知道了記憶體和硬碟的區別,來看“流”的概念。

 

 

 

上面這幅圖展示了我們平常下載東西的過程。相對於記憶體而言,“流”根據方向可以分為輸入資料流和輸出資料流,輸入資料流是進入記憶體的方向,輸出資料流是離開記憶體的方向。根據讀取資料的格式,可以將記憶體分為位元組流和字元流,位元組流是按位元組方式讀取資料的,通常用來讀取圖片,聲音,視頻等二進位檔案,而字元流是按字元格式設定進行讀取資料的,可以用來讀取純文字檔案,比如我們電腦上的txt檔案,像doc文檔是有格式的,是非純文字檔案,就需要使用位元組流來進行讀取。

 

Java中處理這些輸入輸出的類都放在java.io包中,所有的輸入類都是位元組輸入類(InputStream)和字元輸入類(Reader)的子類,而所有的輸出類都是位元組輸出類(OutputStream)和字元輸出類(Writer)的子類。

 

我們需要重點掌握的主要有以下16個類:

 

檔案讀寫位元組流字元流

FileInputStream     

FileOutputStream

FileReader

FileWriter

 

帶緩衝的讀寫位元組流字元流

BufferedReader

BufferedWriter

BufferedInputStream

BufferedOutputStream

 

專門處理資料的位元組流字元流

DataInputStream

DataOutputStream

 

讀取對象的位元組流字元流

ObjectInputStream

ObjectOutputStream

 

轉換流(位元組流轉換成字元流)

InputStreamReader

OutputStreamWriter

 

PrintWriter

PrintStream(標準的輸出資料流,預設輸出到控制台)

 

Java輸入輸出資料流主要有InputStream,OutputStream, Reader和Writer四大類,下面通過這兩張圖來瞭解這四類中的子類的繼承關係。

 

 

 

 

 

接下來看InputStream類的基本讀取方法。看以下代碼:

 

import java.io.*;
public class FileInputStreamTest01{
 public static void main(String[] args){
   FileInputStream fis=null;
   try{
   //要讀取一個檔案,先要給這個檔案建立一個輸入資料流
   //檔案路徑  
   String filepath="abc.txt";   // 絕對路徑
   //String filepath="F:\\bianchenglianxi\\java\\abc.txt";  // 相對路徑
   fis=new FileInputStream(filepath);
   //讀取檔案
   int i1=fis.read();
   int i2=fis.read();
   int i3=fis.read();
   int i4=fis.read();
   int i5=fis.read();
   int i6=fis.read();
   int i7=fis.read();
   System.out.println(i1);
   System.out.println(i2);
   System.out.println(i3);
   System.out.println(i4);
   System.out.println(i5);
   System.out.println(i6);
   System.out.println(i7);
   }catch(FileNotFoundException e){
     e.printStackTrace();
   s}
   catch(IOException e){
     e.printStackTrace();
   }finally{
     if(fis!=null){
       try{
         fis.close();
       }catch(IOException e){
         e.printStackTrace();
       }
     }
   }
 }
}

 

編譯運行後輸出:

 

/*
97
98
99
100
101
102
103
*/

 

1.先匯入包java.io.*;

2.要讀取一個檔案,先要給這個檔案建立一個輸入資料流,即FileInputStream fis=new FileInputStream(filepath); 其中filepath是要讀入的檔案所在的路徑,可以是絕對路徑,也可以是相對路徑。

3.使用read()方法讀取檔案。

4.處理異常時要注意,IOException的範圍比FileNotFoundException的範圍大,所以前者要寫在後面,或者直接catch IOException即可。

5.最後使用close()方法關閉檔案。

以上就是基本的讀取檔案的方法。看第二個程式,直接使用throws拋出異常。

 

import java.io.*;
public class FileInputStreamTest02{
 public static void main(String[] args) throws Exception{
   FileInputStream fis=new FileInputStream("abc.txt");
   while(true){
     int temp=fis.read();
     if(temp==-1)break;
     System.out.println(temp);
   }
   fis.read();
 }
}

 

以上程式使用while迴圈讀取檔案,因為是一個位元組一個位元組進行讀取,所以存在缺點,頻繁地訪問磁碟,傷害磁碟,並且訪問效率低。接下來看使用數組讀取檔案的方法,看以下代碼:

 

import java.io.*;
public class FileInputStreamTest03{
 public static void main(String[] args)throws Exception{
   FileInputStream fis=new FileInputStream("abc.txt");
   byte[] bytes=new byte[3];//每一次最多讀取三個位元組
   //int read(byte[] bytes); 該方法返回的int類型的值代表的是這次讀取了多少個位元組
   int i1=fis.read(bytes);
   //將bytes數群組轉換成字串
   System.out.println(new String(bytes));  //abc
   int i2=fis.read(bytes);
   System.out.println(new String(bytes));  //def
   int i3=fis.read(bytes);
   System.out.println(new String(bytes,0,i3));  //gef
   System.out.println(i1);  //3
   System.out.println(i2);  //3
   System.out.println(i3);  //1
   
   fis.close();
 }
}

 

編譯運行後輸出:

 

/*
abc
def
g
3
3
1
*/

 

1.數組讀取的方法為int read(byte[] bytes),讀取之前在記憶體中準備一個數組,每次讀取多個位元組儲存到byte數組中。

2.byte[] bytes=new byte[3]; 設定數組的大小,每次最多讀取三個位元組。

3.int i1=fis.read(bytes);   System.out.println(new String(bytes)); 將檔案中的內容按位元組讀取到數組中後,再將bytes數群組轉換成字串。

最後升級一下,看迴圈讀取檔案內容,代碼如下:

 

/*
迴圈讀取
*/
import java.io.*;
public class FileInputStreamTest04{
 public static void main(String[] args)throws Exception{
   FileInputStream fis=new FileInputStream("abc.txt");
   byte[] bytes=new byte[1024];
   while(true){
     int temp=fis.read(bytes);
     if(temp==-1)break;
     System.out.print(new String(bytes,0,temp));
   }
   fis.close();
 }
}

 

編譯運行後輸出:

 

//abcdefg

Java I/O

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.