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