Java入門學習-理解I/O

gongjinsi發表於2017-05-08

首頁貼上神一般的圖片
這裡寫圖片描述

檔案處理

public class FileTest {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        createFile();
    }
     public static void createFile() {  
        // File f=new File("F:/java/HelloWorld/src/practice/create.txt");     //要使用反斜槓
         File g=new File("G:/abc/efg/hij");
            try{  
               // f.createNewFile();  //不存在時建立新檔案。保證了後面操作正常進行。    --一執行,就真的有這個檔案了
             //   System.out.println("該分割槽大小"+f.getTotalSpace()/(1024*1024*1024)+"G"); //空間大小,輸出了我F盤的實際大小
                //f.mkdirs();  //建立此抽象路徑名指定的目錄,包括所有必需但不存在的父目錄。
                g.mkdirs();//生成所有目錄  
               // g.mkdir(); //必須efg目錄存在才能生成hij目錄  --使用g路徑,沒有任何反應,也不報錯
                g.delete(); //  刪除此抽象路徑名錶示的檔案或目錄 --此時刪掉了hij
                g.mkdir();//hij新增成功
               System.out.println("檔名  "+g.getName());  //  檔名  
               System.out.println("檔案父目錄字串 "+g.getParent());// 父路徑,沒有則返回 null。  
               System.out.println(g.getPath());  //完整路徑

            }catch (Exception e) {  
                e.printStackTrace();  
            }  
      }  
}

位元組流

public class FileCount {
    public static void main(String[] args) throws IOException {
        int count=0;
        File file=new File("G:/abc/efg/hij/test.xlsx");
        InputStream is=null; //必須放在try外面,放在try裡面,就關不掉了
        try {
            is=new FileInputStream(file);
            while(is.read()!=-1){   //讀到最後
                count++;
            }
            System.out.println("檔案"+file.getName()+"長度是:"+(count/1024)+ "KB");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }finally{
            is.close(); //FileInputStream是有緩衝區的,所以用完之後必須關閉,否則可能導致記憶體佔滿,資料丟失。 
        }
    }
}
//輸出:檔案test.xlsx長度是:9KB

FileInputStream.read(byte b[])用來處理求檔案長度太小題大做了,附上兩個求檔案長度方法

FileInputStream.available()
file.length()

然後看到他們用FileInputStream.read(byte b[])作為緩衝流讀取檔案
http://wentao365.iteye.com/blog/1374731 循序漸進的寫了如何讀取檔案
byte處程式碼核心

while ((i = inputStream.read(bytes))!=-1){  
                String str = new String(bytes);  
                System.out.print(str); 

            } 
//另一個借鑑
byte[] buffer=new byte[512];   //一次取出的位元組數大小,緩衝區大小  
     int numberRead=0; 

 while ((numberRead=input.read(buffer))!=-1) {  //numberRead的目的在於防止最後一次讀取的位元組小於buffer長度,  
           out.write(buffer, 0, numberRead);       //否則會自動被填充0  
        }  

2.FileOutputStream 循序漸進版, InputStream是所有位元組輸出流的父類,子類有ByteArrayOutputStream,FileOutputStream,ObjectOutputStreanm

3.讀寫物件:ObjectInputStream 和ObjectOutputStream ,該流允許讀取或寫入使用者自定義的類,但是要實現這種功能,被讀取和寫入的類必須實現Serializable介面

4.有時沒有必要儲存整個物件的資訊,而只是要儲存一個物件的成員資料,成員資料的型別假設都是Java的基本資料型別,這樣的需求不必使用到與Object輸入、輸出相關的流物件,可以使用DataInputStream、DataOutputStream來寫入或讀出資料。

5.PushbackInputStream類繼承了FilterInputStream類是iputStream類的修飾者。提供可以將資料插入到輸入流前端的能力(當然也可以做其他操作)。簡而言之PushbackInputStream類的作用就是能夠在讀取緩衝區的時候提前知道下一個位元組是什麼,其實質是讀取到下一個字元後回退的做法

6.SequenceInputStream:有些情況下,當我們需要從多個輸入流中向程式讀入資料。此時,可以使用合併流,將多個輸入流合併成一個SequenceInputStream流物件。SequenceInputStream會將與之相連線的流集組合成一個輸入流並從第一個輸入流開始讀取,直到到達檔案末尾,接著從第二個輸入流讀取,依次類推,直到到達包含的最後一個輸入流的檔案末尾為止。 合併流的作用是將多個源合併合一個源。其可接收列舉類所封閉的多個位元組流物件。

7.PrintStream 說這個名字可能初學者不熟悉,如果說System.out.print()你肯定熟悉,System.out這個物件就是PrintStream,這個我們不做過多示例

三、字元流(顧名思義,就是操作字元檔案的流)
1.java 使用Unicode儲存字串,在寫入字元流時我們都可以指定寫入的字串的編碼。前面介紹了不用拋異常的處理位元組型資料的流ByteArrayOutputStream,與之對應的操作字元類的類就是CharArrayReader,CharArrayWriter類,這裡也會用到緩衝區,不過是字元緩衝區,一般講字串放入到操作字元的io流一般方法是
CharArrayReaderreader=mew CharArrayReader(str.toCharArray()); 一旦會去到CharArrayReader例項就可以使用CharArrayReader訪問字串的各個元素以執行進一步讀取操作。

3.相對我們前面的例子是直接用FileReader開啟的檔案,我們這次使用連結流,一般比較常用的都用連結流,所謂連結流就是就多次對流的封裝,這樣能更好的操作個管理資料,(比如我們利用DataInputStream(BufferedInputStream(FileInputStream))將位元組流層層包裝後,我們可以讀取readByte(),readChar()這樣更加具體的操作,注意,該流屬於位元組流對字元進行操作,)字元流用CharArrayReader就可以了。下面的示例我們將用到j2se 5中的一個可變引數進行一個小度擴充套件。使用BufferedWriter 和BufferedReader用檔案級聯的方式進行寫入,即將多個檔案寫入到同一檔案中(自帶緩衝區的輸出輸出流BufferedReader和BufferedWriter,該流最常用的屬readLine()方法了,讀取一行資料,並返回String)。

4.Console類,該類提供了用於讀取密碼的方法,可以禁止控制檯回顯並返回char陣列,對兩個特性對保證安全有作用,平時用的不多,瞭解就行。

5.StreamTokenizer 類,這個類非常有用,它可以把輸入流解析為標記(token), StreamTokenizer 並非派生自InputStream或者OutputStream,而是歸類於io庫中,因為StreamTokenizer只處理InputStream物件。

相關文章