《輸入輸出流File類》PPT課件.ppt
第14章,輸入輸出檔案位串流字符串流,File類別,不同的操作系統(tǒng)對于文件系統(tǒng)路徑的設定各有差別WindowsLinux,"C:\\Workspace\\CH14\\","/home/justin/workspace/ch14",File類別,File實例用作一個檔案或目錄的抽象表示,Filefile=newFile(args[0]);if(file.isFile()){//是否為檔案System.out.println(args[0]+"檔案");System.out.print(file.canRead()?"可讀":"不可讀");System.out.print(file.canWrite()?"可寫":"不可寫");System.out.println(file.length()+"位組");},File類別,else{//列出所有的檔案及目錄File[]files=file.listFiles();ArrayListfileList=newArrayList();for(inti=0;i<files.length;i++){//先列出目錄if(files[i].isDirectory()){//是否為目錄//取得路徑名System.out.println("["+files[i].getPath()+"]");}else{//檔案先存入fileList,待會再列出fileList.add(files[i]);}},File類別,//列出檔案for(Filef:fileList){System.out.println(f.toString());}System.out.println();},RandomAccessFile類別,Filefile=newFile(args[0]);//建立RandomAccessFile實例并以讀寫模式開啟檔案RandomAccessFilerandomAccessFile=newRandomAccessFile(file,"rw");for(inti=0;i<students.length;i++){//使用對應的write方法寫入數(shù)據(jù)randomAccessFile.writeChars(students[i].getName());randomAccessFile.writeInt(students[i].getScore());},RandomAccessFile類別,//使用seek()方法操作存取位置randomAccessFile.seek((num-1)*Student.size());Studentstudent=newStudent();//使用對應的read方法讀出數(shù)據(jù)student.setName(readName(randomAccessFile));student.setScore(randomAccessFile.readInt());System.out.println("姓名:"+student.getName());System.out.println("分數(shù):"+student.getScore());//設定關閉檔案randomAccessFile.close();,RandomAccessFile類別,privatestaticStringreadName(RandomAccessFilerandomAccessfile)throwsIOException{char[]name=newchar[15];for(inti=0;i<name.length;i++)name[i]=randomAccessfile.readChar();//將空字符取代為空格符并傳回returnnewString(name).replace(\0,);},RandomAccessFile類別,讀寫檔案時幾個必要的流程開啟檔案并指定讀寫方式使用對應的寫入方法使用對應的讀出方法關閉檔案,InputStream、OutputStream,數(shù)據(jù)流動抽象化為一個串流(Stream),InputStream、OutputStream,InputStream是所有表示位輸入串流的類別之父類別System中的標準輸入串流in對象就是一個InputStream類型的實例OutputStream是所有表示位輸出串流的類別之父類別System中的標準輸出串流對象out其類型是java.io.PrintStream,OutputStream的子類別,InputStream、OutputStream,很少直接操作InputStream或OutputStream上的方法,這些方法比較低階通常會操作它們的子類別,try{System.out.print("輸入字元:");System.out.println("輸入字符十進制表示:"+System.in.read());}catch(IOExceptione){e.printStackTrace();},FileInputStream、FileOutputStream,建立FileInputStream或FileOutputStream的實例時,必須指定檔案位置及文件名,實例被建立時檔案的串流就會開啟不使用串流時,您必須關閉檔案串流,以釋放與串流相依的系統(tǒng)資源,FileInputStreamfileInputStream=newFileInputStream(newFile(args[0]));FileOutputStreamfileOutputStream=newFileOutputStream(newFile(args[1]));…fileInputStream.close();fileOutputStream.close();,FileInputStream、FileOutputStream,while(true){if(fileInputStream.available()<1024){//剩余的資料比1024字節(jié)少//一位一位讀出再寫入目標文件intremain=-1;while((remain=fileInputStream.read())!=-1){fileOutputStream.write(remain);}break;}else{//從來源檔案讀取數(shù)據(jù)至緩沖區(qū)fileInputStream.read(buffer);//將數(shù)組數(shù)據(jù)寫入目標文件fileOutputStream.write(buffer);}},FileInputStream、FileOutputStream,以附加的模式來寫入檔案,FileOutputStreamfileOutputStream=newFileOutputStream(args[1],true);,BufferedInputStream、BufferedOutputStream,BufferedInputStream的資料成員buf是個位數(shù)組,默認為2048字節(jié)BufferedOutputStream的資料成員buf是個位數(shù)組,默認為512個字節(jié),BufferedInputStream、BufferedOutputStream,BufferedInputStreambufferedInputStream=newBufferedInputStream(newFileInputStream(srcFile));BufferedOutputStreambufferedOutputStream=newBufferedOutputStream(newFileOutputStream(desFile));System.out.println("復制檔案:"+srcFile.length()+"字節(jié)");while(bufferedInputStream.read(data)!=-1){bufferedOutputStream.write(data);}//將緩沖區(qū)中的數(shù)據(jù)全部寫出bufferedOutputStream.flush();//關閉串流bufferedInputStream.close();bufferedOutputStream.close();,BufferedInputStream、BufferedOutputStream,BufferedInputStream、BufferedOutputStream并沒有改變InputStream或OutputStream的行為只是在操作對應的方法之前,動態(tài)的為它們加上一些是緩沖區(qū)功能,DataInputStream、DataOutputStream,DataOutputStreamdataOutputStream=newDataOutputStream(newFileOutputStream(args[0]));for(Membermember:members){//寫入UTF字符串dataOutputStream.writeUTF(member.getName());//寫入int資料dataOutputStream.writeInt(member.getAge());}//出清所有數(shù)據(jù)至目的地dataOutputStream.flush();//關閉串流dataOutputStream.close();,提供一些對Java基本數(shù)據(jù)型態(tài)寫入的方法,DataInputStream、DataOutputStream,DataInputStreamdataInputStream=newDataInputStream(newFileInputStream(args[0]));//讀出數(shù)據(jù)并還原為對象for(inti=0;i0){list.add((User)objInputStream.readObject());}objInputStream.close();,ObjectInputStream、ObjectOutputStream,//附加模式ObjectOutputStreamobjOutputStream=newObjectOutputStream(newFileOutputStream(file,true)){//如果要附加對象至檔案后//必須重新定義這個方法protectedvoidwriteStreamHeader()throwsIOException{}};for(Objectobj:objs){//將對象寫入檔案objOutputStream.writeObject(obj);}objOutputStream.close();,SequenceInputStream,可以看作是數(shù)個InputStream對象的組合當一個InputStream對象的內(nèi)容讀取完畢后,它就會取出下一個InputStream對象,直到所有的InputStream物件都讀取完畢,SequenceInputStream,//建立SequenceInputStream//并使用BufferedInputStreamBufferedInputStreambufInputStream=newBufferedInputStream(newSequenceInputStream(enumation),8192);BufferedOutputStreambufOutputStream=newBufferedOutputStream(newFileOutputStream(filename),8192);byte[]data=newbyte[1];//讀取所有檔案數(shù)據(jù)并寫入目的地檔案while(bufInputStream.read(data)!=-1)bufOutputStream.write(data);bufInputStream.close();bufOutputStream.flush();bufOutputStream.close();,PrintStream,使用java.io.PrintStream可以自動為您進行字符轉換的動作默認會使用操作系統(tǒng)的編碼來處理對應的字符轉換動作,PrintStreamprintStream=newPrintStream(newFileOutputStream(newFile("test.txt")));printStream.println(1);printStream.close();,ByteArrayInputStream、ByteArrayOutputStream,ByteArrayInputStream可以將一個數(shù)組當作串流輸入的來源ByteArrayOutputStream則可以將一個位數(shù)組當作串流輸出的目的地,PushbackInputStream,擁有一個PushBack緩沖區(qū)從PushbackInputStream讀出數(shù)據(jù)后,只要PushBack緩沖區(qū)沒有滿,就可以使用unread()將資料推回串流的前端,Reader、Writer,在處理串流數(shù)據(jù)時,會根據(jù)系統(tǒng)默認的字符編碼來進行字符轉換Reader、Writer是抽象類,在進行文本文件的字符讀寫時真正會使用其子類別可以直接在建構Reader的實例時,自行指定讀取時的編碼,InputStreamReaderreader=newInputStreamReader(byteArrayStream,"Big5");,InputStreamReader、OutputStreamWriter,要對InputStream、OutputStream進行字符處理,可以使用InputStreamReader、OutputStreamWriter為加上字符處理的功能,FileInputStreamfileInputStream=newFileInputStream(args[0]);//為FileInputStream加上字符處理功能InputStreamReaderinputStreamReader=newInputStreamReader(fileInputStream);FileOutputStreamfileOutputStream=newFileOutputStream("backup_"+args[0]);//為FileOutputStream加上字符處理功能OutputStreamWriteroutputStreamWriter=newOutputStreamWriter(fileOutputStream);,InputStreamReader、OutputStreamWriter,intch=0;//以字符方式顯示檔案內(nèi)容while((ch=inputStreamReader.read())!=-1){System.out.print((char)ch);outputStreamWriter.write(ch);}System.out.println();inputStreamReader.close();outputStreamWriter.close();,可以自行指定字符編碼,InputStreamReaderinputStreamReader=newInputStreamReader(fileInputStream,"Big5");,FileReader、FileWriter,想要存取的是一個文本文件,可直接使用java.io.FileReader、java.io.FileWriter類別,FileReaderfileReader=newFileReader(args[0]);FileWriterfileWriter=newFileWriter(args[0]+".txt");intin=0;char[]wlnChar={\r,\n};while((in=fileReader.read())!=-1){if(in==\n){//寫入"\r\n"fileWriter.write(wlnChar);}elsefileWriter.write(in);}fileReader.close();fileWriter.close();,BufferedReader、BufferedWriter,System.in是個位串流,為了轉換為字符串流,可使用InputStreamReader為其進行字符轉換,然后再使用BufferedReader為其增加緩沖功能,BufferedReaderreader=newBufferedReader(newInputStreamReader(System.in));,BufferedReader、BufferedWriter,//緩沖FileWriter字符輸出串流BufferedWriterbufWriter=newBufferedWriter(newFileWriter(args[0]));Stringinput=null;//每讀一行進行一次寫入動作while(!(input=bufReader.readLine()).equals("quit")){bufWriter.write(keyin);//newLine()方法寫入與操作系統(tǒng)相依的換行字符bufWriter.newLine();},PrintWriter,除了接受OutputStream實例作為自變量之外,PrintWriter還可以接受Writer對象作為輸出的對象,CharArrayReader、CharArrayWriter,可以將字符數(shù)組當作字符數(shù)據(jù)輸出或輸入的來源,PushbackReader,擁有一個PushBack緩沖區(qū),只不過PushbackReader所處理的是字符只要PushBack緩沖區(qū)沒有滿,就可以使用unread()將資料回推回串流的前端,