java筆記--java IO流

1、java中的流
Java中的流,可以從不同的角度進行分類。
(1)按照數據流的方向不同可以分爲:輸入流和輸出流。
輸出流:程序---->文件
輸入流:程序<----文件
(2)按照處理數據單位不同可以分爲:字節流和字符流。
字節流:一次讀入或讀出是8位二進制。
字符流:一次讀入或讀出是16位二進制。
字節流和字符流的原理是相同的,只不過處理的單位不同而已。後綴是Stream是字節流,而後綴是Reader,Writer是字符流。
(3)按照實現功能不同可以分爲:節點流和處理流。
節點流:直接與數據源相連,讀入或讀出。直接使用節點流,讀寫不方便,爲了更快的讀寫文件,纔有了處理流。
處理流:與節點流一塊使用,在節點流的基礎上,再套接一層,套接在節點流上的就是處理流。
2、File文件
java 處理文件的類 File提供了十分詳細的文件處理方法。
(1)File(String pathName)可以通過將給定路徑名字符串轉換爲抽象路徑名來創建一個新 File 實例。
(2)createNewFile()當且僅當不存在具有此抽象路徑名指定名稱的文件時,不可分地創建一個新的空文件。
(3)getName()返回由此抽象路徑名錶示的文件或目錄的名稱。
(4)delete()刪除刪除此抽象路徑名錶示的文件或目錄。
(5)......
例子:
import java.io.*;
class FileDemo
{
public static void main(String[] args)
{
File f=new File("test.txt");
try
{
if(f.exists())
{
System.out.println("file exists");
}
else
{
System.out.println("file not exists");
f.createNewFile();
System.out.println("a new file:"+f.getName()+" has created ");
}
}
catch(IOException e)
{
e.printStackTrace();
}
finally
{
f.delete();
System.out.println(f.getName()+" has been deleted");
}

}
}


3、字節流
字節流包含InputStream和OutputStream,分別對應輸入流和輸出流。先來看看常用的FileInputStream
FileInputStream(File f)構造方法接收一個File實例對象,用該對象創建一個輸入流。同理可以使用
FileOutputStream(File f)構造方法創建一個輸出流。
看如下一個文件拷貝額實例:
import java.io.*;


/**
*byte stream demo
*/
class FileCopy
{
public static void main(String[] args)
{
FileInputStream fis=null;
FileOutputStream fos=null;
int read_num=0;
byte[] buffer=new byte[1024];
try
{
fis=new FileInputStream(new File("F:\\Java\\example\\Lesson\\IOStream\\0014.jpg"));
fos=new FileOutputStream(new File("F:\\Java\\example\\Lesson\\IOStream\\0015.jpg"));
while((read_num=fis.read(buffer))!=-1)
{
fos.write(buffer,0,read_num);
}


}
catch(IOException e)
{
e.printStackTrace();
}
finally
{
try
{
fis.close();
fos.close();
}
catch(IOException e)
{
e.printStackTrace();
}
}


}
}
還有很多其他的輸入輸出字節流,如:
BufferedInputStream和BufferedOutputStream它們是過濾器流,其作用是提高輸入輸出的效率。
DataInputStream和DataOutputStream這兩個類創建的對象分別被稱爲數據輸入流和數據輸出流。這是很有用的兩個流,
它們允許程序按與機器無關的風格讀寫Java數據。所以比較適合於網絡上的數據傳輸。這兩個流也是過濾器流,常以其它流如InputStream或OutputStream作爲它們的輸入或輸出。


4、字符流
字符流主要是用來處理字符的。Java採用16位的Unicode來表示字符串和字符,對應的字符流按輸入和輸出分別稱爲readers和writers。
InputStreamReader和OutputStreamWriter
在構造這兩個類對應的流時,它們會自動進行轉換,將平臺缺省的編碼集編碼的字節轉換爲Unicode字符。對英語環境,其缺省的編碼集一般爲ISO8859-1。
BufferedReader和BufferedWriter
這兩個類對應的流使用了緩衝,能大大提高輸入輸出的效率。這兩個也是過濾器流,常用來對InputStreamReader和OutputStreamWriter進行處理。
從標準輸入讀取一行回顯到標準輸出上:
import java.io.*;
public class TextRead{


public static void main(String[] args){
   BufferedReader bf = null;/*BufferedReader相當於一個大桶,其實就是內存,這裏實現了大量大量的讀寫 ,而不是讀一個字節或字符就直接寫如硬盤,加強了對硬盤的保護。*/
   try{
    while(true){ // while(true){}循環保證程序不會結束
    
       bf = new BufferedReader(new InputStreamReader(System.in));
       /*System.in 爲標準輸入,System.out爲標準輸出*/
       /*InputStreamReader用語將字節流到字符流的轉化,這也就是處理流了
        *在這裏相當與2個管道接在System.in與程序之間。
        *readLine()方法功能比較好用,也就通過處理流來實現更好功能。
        **/
     String line = bf.readLine();
     System.out.println(line);
    }  
   }catch(Exception e){
    e.printStackTrace();
   }finally{
    //一定要關閉流,用完後。最好放在


filally 裏面。  
    try{   
     if(bf!=null){
      bf.close();
     }
    }catch(Exception e){
       e.printStackTrace();
    }  
   }  
}
}
以下例子實現文件的拷貝:
import java.io.*;
public class TextRead{


public static void main(String[] args){
   File fin,fout;  
   BufferedReader bf = null;
   PrintWriter pw = null;
   try{
    fin = new File("aaa.txt"); //注意文件與程序都要在同一個文件夾下。zzc.txt爲要被複制的文件。
    fout = new File("copyaaa.txt"); //如果沒有會自動創建。
    bf = new BufferedReader(new FileReader(fin));
    pw = new PrintWriter(fout); //PrintWriter爲打印流,也可以使用BufferedWriter.
    String line = bf.readLine();
    while(line!=null){
    pw.println(line);
     line = bf.readLine();
    }
   }catch(Exception e){
    e.printStackTrace();
   }finally{
    try{
    //關閉 文件。
     if(bf!=null){
      bf.close();
      bf = null;
     }
     if(pw!=null){
      pw.close();
      pw = null;
     }
    }catch(Exception e){
     e.printStackTrace();
    }
   }
}
}


5、總結
(1)對文件進行操作:FileInputStream(字節輸入流),FileOutputStream(字節輸出流),FileReader(字符輸入流),FileWriter(字符輸出流)
(2)對管道進行操作:PipedInputStream(字節輸入流),PipedOutStream(字節輸出流),PipedReader(字符輸入流),PipedWriter(字符輸出流)
PipedInputStream的一個實例要和PipedOutputStream的一個實例共同使用,共同完成管道的讀取寫入操作。主要用於線程操作。
(3)字節/字符數組:ByteArrayInputStream,ByteArrayOutputStream,CharArrayReader,CharArrayWriter是在內存中開闢了一個字節或字符數組。
(4)Buffered緩衝流::BufferedInputStream,BufferedOutputStream,BufferedReader,BufferedWriter,是帶緩衝區的處理流,緩衝區的作用的主要目的是:避免每次和硬盤打交道,提高數據訪問的效率。
(5)轉化流:InputStreamReader/OutputStreamWriter,把字節轉化成字符。
(6)數據流:DataInputStream,DataOutputStream。
因爲平時若是我們輸出一個8個字節的long類型或4個字節的float類型,那怎麼辦呢?可以一個字節一個字節輸出,也可以把轉換成字符串輸出,但是這樣轉換費時間,
若是直接輸出該多好啊,因此這個數據流就解決了我們輸出數據類型的困難。數據流可以直接輸出float類型或long類型,提高了數據讀寫的效率。
(7)打印流:printStream,printWriter,一般是打印到控制檯,也可以進行控制打印的地方,如打印到文件。
(8)對象流:ObjectInputStream,ObjectOutputStream,把封裝的對象直接輸出,而不是一個個在轉換成字符串再輸出。
(9)序列化流:SequenceInputStream。
對象序列化:把對象直接轉換成二進制,寫入介質中。使用對象流需要實現Serializable接口,否則會報錯。而若用transient關鍵字修飾成員變量,不寫入該成員變量,
若是引用類型的成員變量爲null,值類型的成員變量爲0.







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章