標籤:
學習內容:在javaIO中,比較重要的是五個類,一個介面。五個類是 Reaer, Writer,InputStream, OutputStream,File(前四個類是抽象類別,最後一個非抽象),介面是 Serializable。其他流對象。
一,字元流和位元組流IO流用來處理裝置之間的資料轉送,java對資料的操作時通過流的方式,java用於操作流的對象都在IO包中。字元流是基於位元組流的,字元流裡面融合了字元編碼表,所以字元流一般操作純文字資料,而位元組流可以操作所有的資料。字元流的兩個基類是Reader,Writer。位元組流的兩個基類是InputStream和OutputStream。(一)WriterFileWriter1,需求:在硬碟上建立一個檔案並且寫入資料。//建立一個FileWriter對象,該對象一被初始化就必須要明確被操作的檔案。建立FileWriter對象時,既可以傳遞File對象或者檔案的名字String類型。如果硬碟上存在了檔案,將會被覆蓋,不存在會自己建立。若不想被覆蓋,可以在FileWriter構造方法中傳遞一個布爾值trueFileWriter fw = new FileWriter("test.txt");//調用write方法,將字串寫入到流中。fw.Writer("abcd");//重新整理流對象的緩衝區的資料到目的地中fw.flush();//關閉流對象,釋放資源 在關閉流資源時,會自動重新整理內部的緩衝區的資料,將資料刷到目的地中fw.close(); BufferedWriter1,需求:使用BufferedWriter在硬碟上寫入資料對於BufferedWriter,可以提高FileWriter的效率,因為加入了緩衝技術。緩衝區要記得重新整理//建立流對象FileWriter fw = new FileWriter("buf.txt");//提高字元寫入效率,引入了緩衝技術BufferedWriter bfw = new BufferedWriter(fw);bufw.write("hello,heima");bufw.flush();//只要用到緩衝區,都要重新整理//關閉緩衝區bufw.close();(二)Reader//建立一個檔案讀取流對象和指定名稱的檔案相關聯,要保證該檔案是已經存在的,如果不存在,會發生異常FileReader fr= new FileReader("Test.txt");//調用讀取流對象的read方法。read每次唯讀一個字元且會自動往下讀。另外read方法還有一個重載形式,可以一次讀取多個字元,將讀到的多個字元存放在字元數組中int ch = 0;while((ch=read())!=-1) System.out.println((char)ch);//關閉流資源fr.close(); BufferedReader字元流緩衝區提供了一次讀取一行的方法readLine(),該方法對文本資料的擷取,當返回null時,表示讀到檔案末尾。//建立一個讀取流對象和檔案相關聯FileReader fr = new FileReader("bufr.txt");//為提高效率引入BufferedReaderBufferedReader bufr = new BufferedReader(bufr); //讀取操作String line = null;while((line = bufr.readLine())!=null){System.out.println(line);}//關閉流bufr.close();(三)OutputStreamFileOutputStream需求:通過FileOutputStream向硬碟中寫入資料FileOutputStream fos = new FileOutputStream("fos.txt");fos.write("abcde".getBytes());fos.close(); (四)InputStream需求:通過FileInputStream讀取一個檔案並且列印在控制台上1,每次讀取一個位元組FileInputStream fis = new FileInputStream("fos.txt");int ch = 0;while((ch = read())!=-1)System.out.println((char)ch);fis.close();2,每次讀取的位元組存放入位元組數組中FileInputStream fis = new FileInputStream("fos.txt");int len = 0;byte[] buf = new byte[1024];while((len=fis.read(buf))!=-1) System.out.println(new String(buf,0,len));fis.close();3,讀取一次,將讀取到的資料存放入剛剛好的數組中,這種方式一般不建議使用,因為如果資料過大,會造成記憶體溢出。available()方法,位元組流特有的FileInputStream fis = new FileInputStream();byte[] buf = new byte[fis.available()];System.out.println(new String(buf));fis.close(); (五)、轉換流 InputStreamReader OutputStreamWriter轉換流是位元組流通向字元流的橋樑需求:將鍵盤錄入的資料通過轉換流列印在控制台上,以over結束BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));String line = null;while((line=bufr.readLine())!=null){if("over".equals(line))break;bufw.write(line.toUpperCase());bufw.newLine();bufw.flush();} bufr.close(); (六)、流操作規律流操作的基本規律,一般通過三個明確來完成1,明確源和目的源:輸入資料流 InputStream Reader目的:輸出資料流 OutputStream Writer2,操作的資料是否是純文字是:字元流否:位元組流3,當體系明確後,在明確要使用那個具體的對象通過裝置來進行區分源裝置:記憶體,硬碟,鍵盤目的裝置:記憶體 硬碟,控制台 二,File(一)File類常見方法:1,建立。boolean createNewFile():在指定位置建立檔案,如果該檔案已經存在,則不建立,返回false。和輸出資料流不一樣,輸出資料流對象一建立建立檔案。而且檔案已經存在,會覆蓋。 boolean mkdir():建立檔案夾。boolean mkdirs():建立多級檔案夾。2,刪除。boolean delete():刪除失敗返回false。如果檔案正在被使用,則刪除不了返回falsel。void deleteOnExit();在程式退出時刪除指定檔案。 3,判斷。boolean exists() :檔案是否存在.isFile():isDirectory();isHidden();isAbsolute(); 4,擷取資訊。getName():getPath():getParent(): getAbsolutePath() long lastModified() long length() (二)關於File的一個綜合案例需求:列出指定目錄下檔案或者檔案夾,包含子目錄中的內容。也就是列出指定目錄下所有內容。import java.io.*;import java.util.*;class JavaListDemo{public static void main(String[] args){File dir = new File("e:\\possible"); List<File> list = new ArrayList<File>(); File f = new File(dir,"javaList.txt"); fileToList(dir,list); listToFile(list,f.getAbsolutePath());}public static void fileToList(File dir,List<File> list){File[] files = dir.listFiles();for (File f:files){if(f.isDirectory())fileToList(f,list);elseif(f.toString().endsWith(".java"))list.add(f);}}public static void listToFile(List<File> list,String name){BufferedWriter bfw = null;try{bfw = new BufferedWriter(new FileWriter(name));for(File f:list){bfw.write(f.getAbsolutePath());bfw.newLine();bfw.flush();}}catch (IOException e){e.printStackTrace();}finally{try{if(bfw!=null)bfw.close();}catch (IOException e){e.printStackTrace();}}}} 三、重要的一些流對象1,PropertiesProperties是Hashtable的子類,也就是說它具備map集合的特點而且他裡面儲存的索引值對都是字串。是集合中的IO技術相結合的結合容器。裡面的重要方法:setProperty();store();load();list();等等 2,列印流printWriter printStream該流提供了列印方法,可以將各種資料類型的資料都原樣列印。printStream建構函式可以接收的參數類型 File對象 字串路徑 以及位元組輸出資料流printWriter建構函式可以接收的參數類型 File對象 字串路徑 以及位元組輸出資料流 字元輸出資料流 3,合并流SequenceInputStream合并流SequenceInputStream建構函式接收的參數是一個枚舉類型。將要合并的流Object Storage Service到枚舉中,然後通過SequenceInputStream對象合并到一個流中 4,對象的序列化或者持久化 Serializable對象進行序列化時,會根據成員自訂一個UID,但若類的成員發生改變 那麼儲存的對象無法使用若對非靜態成員變數不想序列化,前面加上transient關鍵字即可,使其子啊對記憶體中存在,而不在檔案中存在注意:靜態是不能夠序列化的,只能序列化對記憶體中的 5,管道流 PipedInputStream PipedOutputStream輸入輸出可以直接進行串連,通常結合線程使用。不建議對這兩個對象使用單線程,因為容易發生死結。 6,RandomAccessFile 這個對象既可以讀也可以寫隨機訪問檔案是支援對隨機訪問檔案的讀取和寫入。這個類不算是IO體系中的子類,而是直接繼承自Object。但是它是IO包中的成員,因為他具備讀和寫的功能。她內部封裝了一個數組,而且通過指標對數組的元素進行操作,可以通過getFilePointer對象擷取指標位置,同時可以通過seek改變指標的位置,也可以通過sikpBytes()只能向前跳躍讀寫 7,DataStream用於操作基礎資料型別 (Elementary Data Type)的對象 8,ArrayStreamByteArrayInputStream :在構造的時候需要接收資料來源,而且資料來源是一個數組。ByteArrayOutputStream:在構造的時候,不用定義資料目的,因為該對象中已經內部封裝了可變長度的位元組數組,這就是數組目的因為這兩個流對象都操作的數組,並沒有使用系統資源,所以,不進行close關閉。
Java學習日記num10