IO 流的常用總結
阿新 • • 發佈:2018-11-10
IO 流主要是用來處理裝置之間的資料傳輸,Java對於資料的操作都是通過流實現,而java用於操作流的物件都在IO包中。
IO流常用的基類:
* InputStream OutputStream
字元流的抽象基類:
* Reader Writer
由上面四個類派生的子類名稱都是以其父類名作為子類的字尾:
如:FileReader、FileWriter、FileInputStream、FileOutputStream
當然還有一些緩衝流:
如:BufferedReader、BufferedWriter、BufferedInputStream 、BufferedOutputStream
緩衝的作用都是為了提高效率,拓展功能!
IO 流常用的操作方法:
// 輸入位元組流
public static void readTest4() throws IOException{
File file = new File("F:\\a.txt"); //找到目標檔案
FileInputStream fis = new FileInputStream(file); //建立資料輸入通道
int length = 0; //為什麼要用length ?下面會提到
byte[] buf = new byte[4]; //建立緩衝陣列,一次讀取4個長度,最後如不夠4個長度,只讀取剩下的長度內容
while((length = fis.read(buf))!=-1){
System.out.print(new String(buf,0,length));
}
fis.close();
}
// 輸入字元流
public static void readTest1() throws IOException{
File file = new File("E:\\a.txt");
FileReader fr = new FileReader(file);
int length=0;
char[] buf = new char[1024];
while((length=fr.read(buf))!=-1){
System.out.print(new String(buf,0,length));
}
//緩衝輸入位元組流
public static void readTest1() throws IOException{
File file = new File("F:\\a.txt"); //找到目標檔案
FileInputStream fis = new FileInputStream(file); //建立資料輸入通道
BufferedInputStream bis = new BufferedInputStream(fis); //建立緩衝輸入位元組流
int content = 0;
while((content=bis.read())!=-1){
System.out.print((char)content);
}
bis.close();
}
//緩衝輸入字元流
public static void readTest1() throws IOException{
File file = new File("E:\\a.txt"); //找到目標檔案
FileReader fr = new FileReader(file); //建立資料輸入通道
BufferedReader br = new BufferedReader(fr);
String line = null;
while((line=br.readLine())!=null){ //readline一次讀取一行
System.out.print(line);
}
br.close();
}
//輸出位元組流
public static void writeTest2() throws IOException{
File file = new File("F:\\a.txt"); //找到目標檔案,如果不存在,自動建立,如果存在,先清空資料再寫入
FileOutputStream fos = new FileOutputStream(file,true); //建立資料輸出通道,加true表示不清空,在原檔案後面新增
String data="hello word";
fos.write(data.getBytes());
fos.close();
}
//輸出字元流
public static void writerTest1() throws IOException{
File file = new File("E:\\a.txt");
FileWriter fw = new FileWriter(file);
String data="今天很好!";
fw.write(data);
fw.close();
}
//緩衝輸出位元組流
public static void writeTest1() throws IOException{
File file = new File("F:\\a.txt"); //找到目標檔案
FileOutputStream fos = new FileOutputStream(file); //建立資料輸入通道
BufferedOutputStream bos = new BufferedOutputStream(fos); //建立緩衝輸入位元組流
bos.write("hello world".getbytes());
bos.close(); //只有呼叫close方法才會寫到硬碟,否則只是寫到內部的位元組陣列中
}
//緩衝輸出字元流
public static void writerTest1() throws IOException{
File file = new File("E:\\a.txt"); //找到目標檔案
FileWriter fw = new FileWriter(file); //建立資料輸出通道
BufferedWriter bw = new BufferedWriter(fw);
bw.write("大家好!");
bw.close();
}
至於為什麼要用length ?
public static void runio() throws IOException{
File file=new File("E:\\a.txt");
FileInputStream fis=new FileInputStream(file);
byte[] bytes= new byte[4];
int length=-1;
while ((length=fis.read(bytes,0,2))!=-1){
//雖然陣列長度為4,但是這裡我們設定了2所以每次輸出2
System.out.println(length);
//因為每次得到的是新的陣列,所以每次都是新陣列的"0-length"
System.out.println(new String(bytes,0,length));
}
}
//上述只是讀資料,當寫資料時:
public static void runio() throws IOException{
File file=new File("E:\\a.txt");
FileInputStream fis=new FileInputStream(file);
FileOutputStream fos = new FileOutputStream("E:\\b.txt");
byte[] bytes= new byte[4];
int length=-1;
while ((length=fis.read(bytes,0,2))!=-1){
//往流裡邊寫入緩衝位元組陣列中的所有內容,,如果不使用length,不滿整個陣列長度的”空餘內容”也會加入
fos.write(bytes,0,length);
}
}