標籤: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