文件輸入輸出(自學)_第1頁
文件輸入輸出(自學)_第2頁
文件輸入輸出(自學)_第3頁
文件輸入輸出(自學)_第4頁
文件輸入輸出(自學)_第5頁
已閱讀5頁,還剩62頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

Java面向對象程序設計1JavaI/O操作概念JavaI/O類JavaI/O操作標準輸入/輸出文件讀寫操作文件、目錄管理隨機訪問文件2概念I/O來源控制臺(console,如DOS窗口)打印/讀入文件(file)讀/寫網絡接口(TCP/UDP端口)讀/寫針對數據的讀寫以流(stream)的方式對數據進行操作數據源程序讀出數據流目的程序寫入數據流流的重要特性順序讀/寫sequentially3概念讀/寫流的一般流程讀(Reading)openastream//打開讀出流whilemoreinformation//判斷

readinformation//讀closethestream//關閉流寫(Writing)openastream//打開寫入流whilemoreinformation//判斷

writeinformation//寫closethestream//關閉流4概念輸入/輸出流可以從以下幾個方面進行分類從流的方向劃分輸入流輸出流從流的分工劃分節點流處理流從流的內容劃分面向字符的流面向字節的流5概念兩種流的定義(讀取信息的基本數據單位)字節流(bytestream):一個字節(8-bit)一個字節讀/寫,用于一般目的字符流(characterstream):一個字符一個字符讀/寫(具有特定字符編碼的數據),專門用于字符數據java語言6A617661D3EFD1D4以字節流的方式讀:讀8次,8個字節以字符流的方式讀:讀6次,6個字符6JavaI/O操作概念JavaI/O類JavaI/O操作標準輸入/輸出文件讀寫操作目錄管理隨機訪問文件文件屬性7JavaI/O類字符流的讀/寫操作(來自JDK1.1)java.io.Reader(抽象類)publicintread()publicint

read(char

cbuf[])publc

abstract

int

read(char

cbuf[],intoffset,intlength)到達流的終點,無數據讀出則返回-1java.io.Writer(抽象類)publicvoidwrite(intc)publicvoidwrite(char

cbuf[])publicabstractvoidwrite(char

cbuf[],intoffset,intlength)所有的讀/寫函數都拋出java.io.IOException8JavaI/O類針對字符數據的特點進行過優化,提供一些面向字符的有用特性源或目標通常是文本文件實現內部格式和文本文件中的外部格式之間轉換它們的子類又可分為兩大類節點流:從數據源讀入數據或往目的地寫出數據處理流:對數據執行某種處理多數程序使用這兩個抽象類的一系列子類來讀入/寫出文本信息例如FileReader/FileWriter用來讀/寫文本文件9I/O字符流的層次關系陰影部分為節點流,其余為處理流10JavaI/O類字節流的讀/寫操作(來自JDK1.0)java.io.InputStream(抽象類)publicabstract

intread()publicint

read(byteb[])publicint

read(byteb[],intoffset,intlength)到達流的終點,無數據讀出則返回-1java.io.OutputStream(抽象類)publicabstractvoidwrite(intb)publicvoidwrite(byteb[])publicvoidwrite(byteb[],intoffset,intlength)所有的讀/寫函數都拋出java.io.IOException11JavaI/O類字節流使用范圍:數據源或目標中含有非字符數據,必須用字節流來輸入/輸出通常被用來讀寫諸如圖片、聲音之類的二進制數據絕大多數數據是被存儲為二進制文件的,世界上的文本文件大約只能占到2%,通常二進制文件要比含有相同數據量的文本文件小得多12JavaI/O類字節流的層次關系13JavaI/O類14JavaI/O類I/O流的分類(12個功能類)I/O類型所用到的類描述文件FileReader/FileWriterFileInputStream/FileOutputStream文件流(讀/寫文件)緩沖BufferedReader/BufferedWriterBufferedInputStream/BufferedOutputStream提高讀/寫效率打印PrintWriter

PrintStream

(System.out.println())內存CharArrayReader/CharArrayWriterByteArrayInputStreamByteArrayOutputStreamStringReader/StringWriterStringBufferInputStream讀/寫內存15JavaI/O類I/O流的分類(12個功能類)I/O類型所用到的類描述字節流和字符流的轉換InputStreamReaderOutputStreamWriter將InputStream中讀入的字節轉為字符/將字符轉為字節寫入OutputStream管道pipePipedReader/PipedWriterPipedInputStream/PipedOutputStream文件流(讀/寫文件)連接ConcatenationSequenceInputStream多個輸入流連接為一個輸入流對象串行化ObjectInputStreamObjectOutputStreamObjectSerialization16JavaI/O類I/O流的分類(12個功能類)I/O類型所用到的類描述基本數據轉化DataInputStreamDataOutputStreamJAVA基本數據類型的讀/寫計數LineNumberReaderLineNumberInputStream讀操作時記錄行數PeekingAheadPushbackReaderPushbackInputStream可回退緩存(pushbackbuffer)過濾FilterReader/FilterWriterFilterInputStream/FilterOutputStream在讀/寫操作時對數據進行過濾17JavaI/O操作概念JavaI/O類JavaI/O操作標準輸入/輸出文件讀寫操作目錄管理隨機訪問文件文件屬性18輸出:控制臺屏幕打印publicclassTest{ publicstaticvoidmain(Stringargs[]){

System.out.println("HelloWorld!"); }}標準輸入/輸出staticPrintStreamout;19輸入:鍵盤讀入importjava.io.IOException;classTest{ publicstaticvoidmain(Stringargs[])throws

IOException{ byte[]b=newbyte[10];

System.out.println("接收到的字符個數="+

System.in.read(b));

System.out.println("接收到的字符是"+newString(b)); }}標準輸入/輸出staticInputStreamin;20標準輸入/輸出標準輸入輸出流對象System類的靜態成員變量包括System.in:InputStream類型的,代表標準輸入流,這個流是已經打開了的,默認狀態對應于鍵盤輸入。System.out:PrintStream類型的,代表標準輸出流,默認狀態對應于屏幕輸出。System.err:PrintStream類型的,代表標準錯誤信息輸出流,默認狀態對應于屏幕輸出。21文件讀/寫流程打開文件流條件判斷讀出/寫入關閉文件流兩種類型文件FileReader/FileWriter(字符流)FileInputStream/FileOutputStream(字節流)文件讀寫操作22文件讀寫操作寫文本文件FileWriter類創建一個磁盤文件關閉一個磁盤文件write()方法捕獲I/O異常BufferedWriter

類23文件讀寫操作字符流構造方法publicFileReader(Filefile)throwsFileNotFoundExceptionpublicFileReader(String

fileName)throwsFileNotFoundExceptionpublicFile(Stringpathname)publicFileWriter(Filefile)throwsIOExceptionpublicFileWriter(Filefile,booleanappend)throwsIOExceptionpublicFileWriter(String

fileName)throwsIOExceptionpublicFileWriter(String

fileName,booleanappend)throwsIOException24文件讀寫操作在C盤根目錄創建文本文件Hello.txt,并往里寫入若干行文本importjava.io.*;classTest{publicstaticvoidmain(String[]args)throwsIOException{//main方法中聲明拋出IO異常

StringfileName="C:\\Hello.txt";

FileWriter

writer=newFileWriter(fileName

);

writer.write("Hello!\n");

writer.write("Thisismyfirsttextfile,\n");

writer.write("Youcanseehowthisisdone.\n");

writer.write("輸入一行中文也可以\n");

writer.close();

}}25文件讀寫操作打開C盤根目錄下的Hello.txt文件換行有些問題,下面例子中將解決這個問題26文件讀寫操作每次運行這個程序,都將刪除已經存在的”Hello.txt”文件,創建一個新的同名文件FileWriter的構造方法有五個,本例是通過一個字符串指定文件名來創建FileWriter類的write方法向文件中寫入字符Writer類的流可實現內部格式到外部磁盤文件格式的轉換“Hello.txt”是一個普通的ASCII碼文本文件,每個英文字符占一個字節,中文字符占兩個字節Java程序中的字符串則是每個字符占兩個字節的,采用Unicode編碼

close方法清空流里的內容并關閉它。如果不調用該方法,可能系統還沒有完成所有數據的寫操作,程序就結束了27文件讀寫操作處理IO異常importjava.io.*;classEx6_3{publicstaticvoidmain(String[]args){StringfileName="c:\\Hello.txt";

try{//將所有IO操作放入try塊中

FileWriterwriter=newFileWriter(fileName,true);

writer.write("Hello!\n");

writer.write("Thisismyfirsttextfile,\n");

writer.write("Youcanseehowthisisdone.\n");

writer.write("輸入一行中文也可以\n");

writer.close();

}catch(IOException

iox){

System.out.println("Problemwriting"+fileName);}

}}運行此程序,會發現在原文件內容后面又追加了重復的內容,這就是將構造方法的第二個參數設為true的效果28文件讀寫操作BufferedWriter類(處理流)如果需要寫入的內容很多,就應該使用更為高效的緩沖器流類BufferedWriterFileWriter和BufferedWriter類都用于輸出字符流,包含的方法幾乎完全一樣,但BufferedWriter多提供了一個newLine()方法用于換行不同廠家生產的計算機(IBM,Apple,VAX,Sun)對文字的換行方法不同。newLine()方法可以輸出在當前計算機上正確的換行符構造方法:publicBufferedWriter(Writerout)8192bytepublicBufferedWriter(Writerout,intsize)29文件讀寫操作使用BufferedWriter完成前面例子實現的功能importjava.io.*;classEx6_4{ publicstaticvoidmain(String[]args)throwsIOException { StringfileName="C:/newHello.txt";

BufferedWriter

out=newBufferedWriter(newFileWriter(fileName));

out.write("Hello!");

out.newLine();

out.write("ThisisanothertextfileusingBufferedWriter,");

out.newLine();;

out.write("SoIcanuseacommonwaytostartanewline");

out.close();}}30文件讀寫操作用任何文本編輯器打開newHello.txt都會出現正確的換行效果31文件讀寫操作讀文本文件FileReader類從文本文件中讀取字符繼承自Reader抽象類的子類InputStreamReaderBufferedReader讀文本文件的緩沖器類具有readLine()方法,可以對換行符進行鑒別,一行一行地讀取輸入流中的內容繼承自Reader文件輸入方法:BufferedReaderin=newBufferedReader(new

FileReader(fileName));

32文件讀寫操作從Hello.txt中讀取文本并顯示在屏幕上importjava.io.*;classTest{publicstaticvoidmain(String[]args){StringfileName="C:/Hello.txt",line;try{

BufferedReaderin=newBufferedReader(newFileReader(fileName));line=in.readLine();//讀取一行內容

while(line!=null){

System.out.println(line); line=in.readLine(); }

in.close();}catch(IOException

iox){

System.out.println("Problemreading"+fileName);}}}33文件讀寫操作運行該程序,屏幕上將逐行顯示出Hello.txt文件中的內容FileReader對象:創建后將打開文件,如果文件不存在,會拋出一個IOExceptionBufferedReader類的readLine()方法:從一個面向字符的輸入流中讀取一行文本。如果其中不再有數據,返回nullReader類的read()方法:也可用來判別文件結束。該方法返回的一個表示某個字符的int型整數,如果讀到文件末尾,返回-1。據此,可修改本例中的讀文件部分:intc;while((c=in.read())!=-1)System.out.print((char)c);close()方法:為了操作系統可以更為有效地利用有限的資源,應該在讀取完畢后,調用該方法34文件讀寫操作例:指定源文件和目標文件名,將源文件的內容拷貝至目標文件。調用方式為:javacopysourceFile

destinationFile35文件讀寫操作importjava.io.*;classCopyMaker{StringsourceName,destName;

BufferedReadersource;

BufferedWriter

dest;Stringline;

privateboolean

openFiles(){ try{

source=newBufferedReader(new

FileReader(sourceName)); } catch(IOException

iox){

System.out.println("Problemopening"+sourceName);returnfalse;}try{

dest=newBufferedWriter(new

FileWriter(destName));

}catch(IOException

iox){

System.out.println("Problemopening"+destName);returnfalse;}returntrue;}36文件讀寫操作privateboolean

copyFiles(){ try{ line=source.readLine();

while(line!=null){

dest.write(line);

dest.newLine();

line=source.readLine();

}}catch(IOException

iox){

System.out.println("Problemreadingorwriting");returnfalse;}returntrue;}37文件讀寫操作privateboolean

closeFiles(){

boolean

retVal=true;try{source.close();}catch(IOException

iox){

System.out.println("Problemclosing"+sourceName);

retVal=false;}try{dest.close();}catch(IOException

iox){

System.out.println("Problemclosing"+destName);

retVal=false;}returnretVal;}38文件讀寫操作

publicboolean

copy(String

src,Stringdst){

sourceName=src;

destName=dst;returnopenFiles()&©Files()&&closeFiles();}}publicclassCopy//一個文件中只能有一個公有類{ publicstaticvoidmain(String[]args){ if(args.length==2)newCopyMaker().copy(args[0],args[1]);else

System.out.println("PleaseEnterFilenames");}}39文件讀寫操作寫二進制文件二進制文件原則上講,所有文件都是由8位的字節組成的如果文件字節中的內容應被解釋為字符,則文件被稱為文本文件;如果被解釋為其它含義,則文件被稱為二進制文件例如文字處理程序,例如字處理軟件Word產生的doc文件中,數據要被解釋為字體、格式、圖形和其他非字符信息。因此,這樣的文件是二進制文件,不能用Reader流正確讀取為什么需要二進制文件輸入輸出更快比文本文件小很多有些數據不容易被表示為字符40文件讀寫操作抽象類OutputStream派生類FileOutputStream用于一般目的輸出(非字符輸出)用于成組字節輸出派生類DataOutputStream具有寫各種基本數據類型的方法將數據寫到另一個輸出流它在所有的計算機平臺上使用同樣的數據格式其常用的一些方法見下表其中size方法,可作為計數器,統計寫入的字節數41文件讀寫操作42文件讀寫操作43文件讀寫操作將三個int型數字255/0/-1寫入數據文件data1.datimportjava.io.*;classTest{publicstaticvoidmain(String[]args){StringfileName="c:/data1.dat";

intvalue0=255,value1=0,value2=-1;try{

DataOutputStreamout=newDataOutputStream(newFileOutputStream(fileName));

out.writeInt(value0);

out.writeInt(value1);

out.writeInt(value2);

out.close();}catch(IOException

iox){

System.out.println("Problemwriting"+fileName);}}44文件讀寫操作運行結果運行程序后,在C盤生成數據文件data1.dat用寫字板打開沒有任何顯示用ultraEdit打開查看其二進制信息,內容為0000

00FF0000

00

00FFFF

FF

FF,每個int數字都是32個bit的說明FileOutputStream類的構造方法負責打開文件“data1.dat”用于寫數據FileOutputStream類的對象與DataOutputStream對象連接,寫基本類型的數據45文件讀寫操作BufferedOutputStream寫二進制文件的緩沖流類類似于文本文件中的BufferedWriter對于大量數據的寫入,可提高效率用法示例:DataOutputStreamout=new

DataOutputStream(newBufferedOutputStream(newFileOutputStream(fileName)));46文件讀寫操作向文件中寫入各種數據類型的數,并統計寫入的字節數importjava.io.*;classEx6_8{publicstaticvoidmain(String[]args)throwsIOException{ StringfileName="mixedTypes.dat";

DataOutputStream

dataOut=newDataOutputStream(newBufferedOutputStream(newFileOutputStream(fileName)));

dataOut.writeInt(0);

System.out.println(dataOut.size()+"byteshavebeenwritten.");

dataOut.writeDouble(31.2);

System.out.println(dataOut.size()+"byteshavebeenwritten.");

dataOut.writeBytes("JAVA");

System.out.println(dataOut.size()+"byteshavebeenwritten.");

dataOut.close();}}47文件讀寫操作運行結果4byteshavebeenwritten12byteshavebeenwritten16byteshavebeenwritten說明這個程序可作為字節計數器48文件讀寫操作向文件中寫入內容為-1的一個字節,并讀出。importjava.io.*;publicclassTest{publicstaticvoidmain(String[]args)throwsException{

DataOutputStream

out=newDataOutputStream(newFileOutputStream("c:/trytry.dat"));

out.writeByte(-1);

out.close();

DataInputStream

in=newDataInputStream(newFileInputStream("c:/trytry.dat"));

inta=in.readByte();

System.out.println(Integer.toHexString(a));

System.out.println(a);

in.skip(-1);//往后一個位置,以便下面重新讀出

a=in.readUnsignedByte();

System.out.println(Integer.toHexString(a));

System.out.println(a);

in.close(); }}49文件讀寫操作運行結果ffffffff-1ff255說明用ultraEdit打開c:/trytry.dat文件,其內容為FF如果用readByte讀入,其高24位都將補1,所以結果還是-1如果用readUnsignedByte讀入,其高24位都將補0,結果就變成了255寫的字節是連續的,中間沒有分隔符,所以應該記住寫的數據類型、個數等情況,以便將來利用50文件讀寫操作讀二進制文件讀取例6-7創建的數據文件中的3個int型數字,顯示相加結果importjava.io.*;classEx6_10{ publicstaticvoidmain(String[]args){ StringfileName="c:\\data1.dat";

intsum=0;try{

DataInputStream

instr=newDataInputStream(newBufferedInputStream(new

FileInputStream(fileName)));sum+=instr.readInt();sum+=instr.readInt();sum+=instr.readInt();

System.out.println("Thesumis:"+sum);

instr.close();} catch(IOException

iox){

System.out.println("Problemreading"+fileName);} }}}51文件讀寫操作該程序顯示結果是254分析readInt方法可以從輸入流中讀入4個字節并將其當作int型數據由于知道文件中存儲的是3個int型數據,所以使用了3個讀入語句如果不知道數據的個數該怎么辦呢?因為DataInputStream的讀入操作如遇到文件結尾就會拋出EOFException異常,所以我們可以將讀操作放入try塊中52文件讀寫操作將讀操作放入try塊中,使遇到文件結尾就會拋出EOFException異常,進入到相應的catch塊中try{while(true)sum+=instr.readInt();}catch(EOFException

eof){

System.out.println("Thesumis:"+sum);

instr.close();}53文件讀寫操作如果沒有讀到結尾,在讀取過程中發生的異常屬于IOException,這樣就需要我們再加一個catch塊處理這種異常一個try塊后面可以跟不止一個catch塊,用于處理各種可能發生的異常我們可以在上段代碼后再加上用于捕捉IOException的代碼段如下catch(

IOException

eof){

System.out.println("Problemreadinginput");

instr.close();}54文件讀寫操作如果catch塊中的close方法也發生異常,現在就沒法捕獲了。解決方法可以有在main方法中拋出異常比較簡單缺點是沒有catch塊,因而無法對異常進行進一步處理,例如給出提示信息使用嵌套的try塊55文件讀寫操作importjava.io.*;classEx6_11{publicstaticvoidmain(String[]args){ StringfileName="c:/data1.dat";longsum=0; try{

DataInputStream

instr=newDataInputStream(newBufferedInputStream(new

ileInputStream(fileName)));

try{while(true)sum+=instr.readInt();}catch(EOFException

eof){

System.out.println("Thesumis:"+sum);

instr.close();}}catch(IOException

iox){

System.out.println("IOProblemswith"+fileName);}}}}56文件的特性讀和寫的權限文件長度修改時間是否是目錄java.io.File類設定文件屬性查詢文件屬性文件、目錄管理57文件、目錄管理構造方法:58文件、目錄管理常用方法:59文件、目錄管理獲取文件路徑importjava.io.*;classAttrDemo1{publicstaticvoidmain(String[]args)throwsIOException{Filetestfile=newFile("."+File.separatorChar+"testfile1");

testfile.createNewFile();

System.out.println("name="+testfile.getName());

System.out.println("path="+testfile.getPath());

System.out.println("absolutepath="+testfile.getAbsolutePath());

System.out.println("canonicalpath="+testfile.getCanonicalPath());}}60文件、目錄管理獲取文件修改時間importjava.io.*;importjava.util.*;publicclassAttrDemo2{ publicstaticvoidmain(String[]args)throwsIOException{ Filetestfile=newFile("testfile2");

testfile.delete();

testfile.createNewFile();longmodtime=testfile.lastModified();

System.out.println("lastmodificationtime#1="+newDate(modtime));testfile.setLastModified(0);

modtime=testfile.lastModified();

System.out.println("lastmodificationtime#2="+newDate(modtime)); }}61文件、目錄管理獲取和設定文件長度importjava.io.*;publicclassAttrDemo3{publicstaticvoidmain(String[]args)throwsIOException{Filetestfile=newFile("testfile3");

testfile.delete();

testfile.createNewFile();

System.out.println("length#1="+testfile.length());

RandomAccessFile

raf=newRandomAccessFile("testfile3","rw");raf.setLength(100);

raf.close();

System.out.println("length#2="+testfile.length());}}62文件、目錄管理設置讀寫權限importjava.io.*;publicclassAttrDe

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論