B08输入输出及数据库操作教学课件.pptx
第第8章章 输入输出及数据库操作输入输出及数据库操作8.1 输入和输出8.2 数据库操作8.1 输入和输出输入和输出8.1.1 流的含义8.1.2 流的层次结构8.1.3 标准输入输出8.1.4 File类8.1.5 FileInputStream类和FileOutputStream类8.1.6 DataInputStream类和DataOutputStream类8.1.7 随机访问文件8.1.8 Reader类和Writer类8.1.9 IOException类的几个子类8.1.1 流的含义流的含义流是一个很形象的概念,当程序需要读取数据的时候,是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接。类似的,当程序需要写入件,内存,或是网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。这时候数据的时候,就会开启一个通向目的地的流。这时候你就可以想象数据好像在这其中你就可以想象数据好像在这其中“流流”动一样,动一样,如下如下图图8-18-1:图8-1 流8.1.1 流的含义流的含义数据流是指一组有顺序的、有起点的和终点的字节集合Java将读取数据的对象称为输入流;能向其写入数据的对象称为输出流。字节流,被称作输入流(Input stream)或输出流(Output stream),基于数据的I/O是二进制(比如说表示图像的位图)字符流,被称作Reader或Writer,基于文本的I/O都是一些人们能够阅读的字符(比如说程序的源代码,字符流8.1.1 流的含义流的含义InputStream,OutputStream,Reader,Writer是四个抽象类。Java中其他多种多样变化的流均是由它们派生出来的。在这四个抽象类中,InputStream和Reader定义了完全相同的接口:int readint read()()int readint read(char cbufchar cbuf)int readint read(char cbuf, int offset, int lengthchar cbuf, int offset, int length)而而OutputStreamOutputStream和和WriterWriter也是如此:也是如此:int writeint write(int cint c)int writeint write(char cbufchar cbuf)int writeint write(char cbuf, int offset, int lengthchar cbuf, int offset, int length)8.1.2 流的层次结构流的层次结构InputStream和OutputStream流层次结构如图8-2和图8-3所示Reader和Writer流层次结构如图8-4和图8-5所示图8-2 InputStream输入流层次结构StringBufferInputStream字符串缓冲区输入流ByteArrayInputStream字节数组输入流FileInputStream文件输入流FilterInputStream过滤器输入流PipedInputStream管道输入流SequenceInputStream顺序输入流ObjectInputStream对象输入流BufferInputStream带缓冲区输入流PushbackInputStream回退输入流LineNumberInputStream行号输入流DataInputStream数据输入流InputStream输入流图8-3 OutputStream输出流层次结构ByteArrayOutputStream字节数组输出流FileOutputStream文件输出流FilterOutputStream过滤器输出流PipedOutputStream管道输出流ObjectOutputStream对象输出流BufferOutputStream带缓冲区输出流PrintStream回退输出流DataOutputStream数据输出流OutputStream输出流图8-4 Reader流层次结构BufferReaderReaderCharArrayReaderInputStreamReaderFilterReaderPipedReaderStringReaderLineNumberReaderFileReaderPushbackrReader图8-5 Writer流层次结构Buffer WriterWriterCharArray WriterOutputStream WriterFilter WriterPiped WriterString WriterFileWriter8.1.3 标准输入输出标准输入输出标准输入输出都是System类中定义的类成员变量,包括:System.inSystem.in:代表标准输入流:代表标准输入流, ,默认状态对应于键盘输默认状态对应于键盘输入。入。System.outSystem.out:代表标准输出流:代表标准输出流, ,默认状态对应于屏幕输默认状态对应于屏幕输出。出。System.errSystem.err:代表标准错误输出流,默认状态对应于:代表标准错误输出流,默认状态对应于屏幕输出。屏幕输出。【实例8-1】1.1. import java.io.import java.io.* *; ;2.2. class stdIOExample1class stdIOExample1 3.3. public static void main(String args) throws IOException public static void main(String args) throws IOException 4.4. int ch; int ch;5.5. int count = 0; int count = 0;6.6. System.out.println( System.out.println(请输入字符(当输入请输入字符(当输入0 0时退出!)时退出!)););7.7. while (char)(ch = System.in.read() != 0) while (char)(ch = System.in.read() != 0) / /输入字输入字符符8.8. count+; System.out.print(char)ch); count+; System.out.print(char)ch); / /输出字符输出字符9.9. 10.10. System.out.println(); System.out.println();11.11. System.err.println(counted + count + total bytes.); System.err.println(counted + count + total bytes.);12.12. 13.13. 说明:在本实例中,利用System.in.read()不断从键盘输入字符,并在显示屏输出,count用于累计输入字符个数,当输入字符为0时,输入终止。8.1.4 File类类含义:FileFile类与类与InputStream / OutputStreamInputStream / OutputStream类同属于一个包,它不允类同属于一个包,它不允许访问文件内容。许访问文件内容。FileFile类主要用于命名文件、查询文件属性和处类主要用于命名文件、查询文件属性和处理文件目录。理文件目录。1File类的构造方法public File(String name)public File(String name):指定与:指定与FileFile对象关联的文件或目录对象关联的文件或目录的名称,的名称,namename可以包含路径信息及文件或目录名。可以包含路径信息及文件或目录名。例如:例如:File myFileFile myFile;MyFile= new FileMyFile= new File(“D D:WUabc.txtWUabc.txt”)8.1.4 File类类1File类的构造方法public File(String pathNamepublic File(String pathName,String name)String name):使:使用参数用参数pathNamepathName(绝对路径或相对路径)来定位参数(绝对路径或相对路径)来定位参数namename所指定的文件或目录。所指定的文件或目录。例如:例如:File myFileFile myFile;MyFile= new FileMyFile= new File(“D D:WUWU”,“abc.txtabc.txt”););8.1.4 File类类1File类的构造方法public File(File directorypublic File(File directory,String name)String name):使用:使用现有的现有的FileFile对象对象directorydirectory(绝对路径或相对路径)来(绝对路径或相对路径)来定位参数定位参数namename所指定的文件或目录。所指定的文件或目录。例如:例如:File myDir=new FileFile myDir=new File(“D D:WUWU”););MyFile= new FileMyFile= new File(myDirmyDir,“abc.txtabc.txt”););public File(URI rui)public File(URI rui):使用给定的同一资源定位符:使用给定的同一资源定位符来定位文件。来定位文件。8.1.4 File类类2File类常见方法String getName()String getName();得到一个文件的名称(不包括路径)得到一个文件的名称(不包括路径)String getPath()String getPath();得到一个文件的路径名得到一个文件的路径名String getAbsolutePath()String getAbsolutePath();得到一个文件的绝对路径名得到一个文件的绝对路径名String getParent()String getParent();得到一个文件的上一级目录名得到一个文件的上一级目录名String renameTo(FilenewName);String renameTo(FilenewName); 将当前文件名更名为给定文件将当前文件名更名为给定文件的完整路径的完整路径booleanexists()booleanexists();测试当前测试当前FileFile对象所指示的文件是否存对象所指示的文件是否存在在booleancanWrite()booleancanWrite();测试当前文件是否可写测试当前文件是否可写booleancanRead()booleancanRead();测试当前文件是否可读测试当前文件是否可读8.1.4 File类类2File类常见方法boolean isFile()boolean isFile();测试当前文件是否是文件(不是目录)测试当前文件是否是文件(不是目录)boolean isDirectory()boolean isDirectory();测试当前文件是否是目录测试当前文件是否是目录longlastModified();longlastModified();得到文件最近一次修改的时间得到文件最近一次修改的时间longlength();longlength();得到文件的长度,以字节为单位得到文件的长度,以字节为单位booleandelete();booleandelete();删除当前文件删除当前文件booleanmkdir();booleanmkdir(); 根据当前对象生成一个由该对象指定的路径根据当前对象生成一个由该对象指定的路径Stringlist();Stringlist();列出当前目录下的文件列出当前目录下的文件【实例8-3】1.1. import java.io.import java.io.* *; ; 2.2. public class fileTest public class fileTest 3.3. void listAttributes(String fileName)void listAttributes(String fileName)4.4.File f=new File(fileName);File f=new File(fileName);5.5.if( f.exists( ) ) if( f.exists( ) ) 6.6. System.out.println(Attributes of +fileName);System.out.println(Attributes of +fileName);7.7. System.out.println(Exist: +f.exists();System.out.println(Exist: +f.exists();8.8. System.out.println(Can read: +f.canRead();System.out.println(Can read: +f.canRead();9.9. System.out.println(Can write: +f.canWrite();System.out.println(Can write: +f.canWrite();10.10. System.out.println(Is file: +f.isFile();System.out.println(Is file: +f.isFile();11.11. System.out.println(Is director: +f.isDirectory();System.out.println(Is director: +f.isDirectory();12.12. System.out.println(Is absolute path: System.out.println(Is absolute path: +f.isAbsolute();+f.isAbsolute();13.13.elseelse14.14. System.out.println(fileName+ does not exist!); System.out.println(fileName+ does not exist!);15.15. 【实例8-3】16.16.public static void main(String args )public static void main(String args )17.17.if(args.length!=1)if(args.length!=1)18.18.System.out.println(Usage: java System.out.println(Usage: java fileTest );fileTest );19.19.System.exit(1); System.exit(1); 20.20. 21.21.fileTest obj=new fileTest ( );fileTest obj=new fileTest ( );22.22.obj.listAttributes(args0);obj.listAttributes(args0);23.23. 24.24. 编译完毕后,按照如下方式运行:g:java01java fileTest fileTest.javag:java01java fileTest fileTest.java则得到如下结果:Attributes of fileTest.javaAttributes of fileTest.javaExist: trueExist: trueCan read: trueCan read: trueCan write: trueCan write: trueIs file: trueIs file: trueIs director: falseIs director: falseIs absolute path: falseIs absolute path: false8.1.5 FileInputStream类和类和FileOutputStream类类1FileInputStream类FileInputStreamFileInputStream典型地表示一种顺序访问的文本文件典型地表示一种顺序访问的文本文件, ,可以访问可以访问文件的一个字节、几个字节或整个文件。文件的一个字节、几个字节或整个文件。基本步骤:步骤一:利用步骤一:利用FileInputStreamFileInputStream打开文件。打开文件。FileInputStream myFileStream;FileInputStream myFileStream;myFileStream= new FileInputStream(myFileStream= new FileInputStream(“D D:WUWU”,“abc.txtabc.txt”) )或者或者File myFileFile myFile;FileInputStream myFileStream;FileInputStream myFileStream;myFile= new FilemyFile= new File(“D D:WUabc.txtWUabc.txt”)myFileStream= new FileInputStream(myFile)myFileStream= new FileInputStream(myFile)8.1.5 FileInputStream类和类和FileOutputStream类类1FileInputStream类步骤二:使用方法步骤二:使用方法read()read()读取信息。读取信息。int read()int read() int read(byte input)int read(byte input) int read(byte input,int offset,int length)int read(byte input,int offset,int length)步骤三:读取完毕后要关闭步骤三:读取完毕后要关闭FileInputStreamFileInputStream对象。对象。myFileStream.close()myFileStream.close()8.1.5 FileInputStream类和类和FileOutputStream类类1FileInputStream类FileInputStreamFileInputStream类常用方法:类常用方法:public abstract int read( ) public abstract int read( ) public int read(byte b ) public int read(byte b ) public int read(byte b , int off, int public int read(byte b , int off, int len) len) 。public int available( ) public int available( ) public long skip(long n) public long skip(long n) public int close( )public int close( )【实例8-4】1.1.import java.io.import java.io.* *; ;2.2.public class FileInputStreamExamplepublic class FileInputStreamExample3.3.public static void main(String args) throws IOExceptionpublic static void main(String args) throws IOException4.4.String fname=FileInputStreamExample.java;String fname=FileInputStreamExample.java;5.5.trytry6.6. 7.7.FileInputStream rf = new FileInputStream rf = new FileInputStream(fname);FileInputStream(fname);8.8.int n=16;int n=16;9.9.byte buffer = new byten;byte buffer = new byten;10.10.while (rf.read(buffer,0,n)!=-1) & (n0) while (rf.read(buffer,0,n)!=-1) & (n0) /读取输入流读取输入流11.11. 12.12.System.out.print(new System.out.print(new String(buffer);String(buffer);13.13. 14.14.【实例8-4】16.16.System.out.println();System.out.println();17.17.rf.close(); /rf.close(); /关闭输入流关闭输入流18.18. 19.19.catch (IOException ioe)catch (IOException ioe)20.20. 21.21.System.out.println(ioe);System.out.println(ioe);22.22. 23.23.catch (Exception e)catch (Exception e)24.24. 25.25.System.out.println(e);System.out.println(e);26.26. 27.27. 28.28. 8.1.5 FileInputStream类和类和FileOutputStream类类2FileOutputStream类FileOutputStreamFileOutputStream类用来处理以文件作为数据输出目的数据流类用来处理以文件作为数据输出目的数据流基本步骤包括:步骤一:利用步骤一:利用FileOutputStreamFileOutputStream打开文件。打开文件。FileOutputStream myFileStream;FileOutputStream myFileStream;myFileStream= new FileOutputStream(myFileStream= new FileOutputStream(“D D:WUWU”,“abc.txtabc.txt”) )或者或者File myFileFile myFile;FileOutputStream myFileStream;FileOutputStream myFileStream;myFile= new FilemyFile= new File(“D D:WUabc.txtWUabc.txt”)myFileStream= new FileOutputStream(myFile)myFileStream= new FileOutputStream(myFile)8.1.5 FileInputStream类和类和FileOutputStream类类2FileOutputStream类步骤二:使用方法步骤二:使用方法write ()write ()写信息。写信息。public void write(byte b )public void write(byte b ):public void write(byte b , int off, int len) public void write(byte b , int off, int len) public abstract void write(int b) public abstract void write(int b) 步骤三:读取完毕后要关闭步骤三:读取完毕后要关闭FileOutputStreamFileOutputStream对象。对象。myFileStream.close()myFileStream.close()8.1.5 FileInputStream类和类和FileOutputStream类类FileOutputStream类常用方法:public void write(byte b )public void write(byte b )public void write(byte b , int off, int public void write(byte b , int off, int len) public abstract void write(int b) len) public abstract void write(int b) public void flush( ) public void flush( ) public void close( )public void close( )【实例8-5】1.1.import java.io.import java.io.* *; ;2.2.public class FileOutputStreamExamplepublic class FileOutputStreamExample3.3.public static void main(String args)public static void main(String args)4.4.trytry5.5. 6.6.System.out.print(System.out.print(输入一行字符输入一行字符: );: );7.7.int count,n=512;int count,n=512;8.8.byte buffer = new byten;byte buffer = new byten;9.9.FileOutputStream wf = new FileOutputStream wf = new FileOutputStream(Output.txt);FileOutputStream(Output.txt);10.10.count = System.in.read(buffer);count = System.in.read(buffer);11.11.wf.write(buffer,0,count); /wf.write(buffer,0,count); /写入输出写入输出流流12.12.wf.close(); /wf.close(); /关闭输出流关闭输出流13.13.System.out.println(System.out.println(输入行字符已保存输入行字符已保存到到Output.txt!);Output.txt!);14.14. 【实例8-5】15.15.catch (IOException ioe)catch (IOException ioe)16.16. 17.17.System.out.println(ioe);System.out.println(ioe);18.18. 19.19.catch (Exception e)catch (Exception e)20.20. 21.21.System.out.println(e);System.out.println(e);22.22. 23.23. 24.24. 8.1.6 DataInputStream类和类和DataOutputStream类类1DataInputStreamDataInputStreamDataInputStream与与FileInputStreamFileInputStream差不多,可以直差不多,可以直接读取任意一种变量类型。一般来说,对二进制文件接读取任意一种变量类型。一般来说,对二进制文件使用使用DataInputStreamDataInputStream流。流。打开和关闭打开和关闭DataInputStreamDataInputStream对象时,其方法与对象时,其方法与FileInputStreamFileInputStream相同。也可以使用相同。也可以使用readread()方法读取()方法读取文件内容,同时还可以使用其它方法来访问不同类型文件内容,同时还可以使用其它方法来访问不同类型的数据。的数据。8.1.6 DataInputStream类和类和DataOutputStream类类1DataInputStream打开DataInputStream流DataInputStream myFileStream;DataInputStream myFileStream;myFileStream= new DataInputStream (myFileStream= new DataInputStream (“D D:WUWU”,“abc.txtabc.txt”) )读取DataInputStream流myFileStream.readmyFileStream.read()()关闭DataInputStream流myFileStream.closemyFileStream.close()()8.1.6 DataInputStream类和类和DataOutputStream类类主要方法byte readByte()byte readByte() 读取读取bytebyte型数据型数据int readUnsignedByte()int readUnsignedByte() 读取读取unsignedbyteunsignedbyte型数据型数据short readShort()short readShort()读取读取shortshort型数据型数据int readUnsignedShort()int readUnsignedShort()读取读取unsignedshortunsignedshort型数据型数据char readChar()char readChar() 读取读取charchar型数据型数据int readInt()int readInt()读取读取intint型数据型数据long readLong()long readLong() 读取读取longlong型数据型数据float readFloat()float readFloat()读取读取floatfloat型数据型数据double readDouble()double readDouble()读取读取doubledouble型数据型数据String readLine()String readLine()读取读取lineline型数据型数据8.1.6 DataInputStream类和类和DataOutputStream类类2DataOutputStream类DataOutputStreamDataOutputStream与与FileOutputStreamFileOutputStream差不多,可以差不多,可以直接写任意一种变量类型。一般来说,对二进制文件直接写任意一种变量类型。一般来说,对二进制文件使用使用DataOutputStreamDataOutputStream流。流。打开和关闭打开和关闭DataOutputStreamDataOutputStream对象时,其方法与对象时,其方法与FileOutputStreamFileOutputStream相同。也可以使用相同。也可以使用writewrite()方法写()方法写文件内容,同时还可以使用其它方法来访问不同类型文件内容,同时还可以使用其它方法来访问不同类型的数据。的数据。8.1.6 DataInputStream类和类和DataOutputStream类类1DataInputStream打开DataOutputStream流DataOutputStream myFileStream;DataOutputStream myFileStream;myFileStream= new DataOutputStream (myFileStream= new DataOutputStream (“D D:WUWU”,“abc.txtabc.txt”) )读取DataOutputStream流myFileStream.writemyFileStream.write()()关闭DataInputStream流myFileStream.closemyFileStream.close()()8.1.6 DataInputStream类和类和DataOutputStream类类主要方法void writeByte()void writeByte()写入写入bytebyte型数据型数据void writeBoolean()void writeBoolean()写入写入booleanboolean型数据型数据void writeShort()void writeShort()写入写入shortshort型数据型数据void writeChar()void writeChar()写入写入charchar型数据型数据void writeInt()void writeInt() 写入写入intint型数据型数据void writeLong()void writeLong()写入写入longlong型数据型数据void writeFloat()void writeFloat()写入写入floatfloat型数据型数据void writeDouble()void writeDouble()写入写入doubledouble型数据型数据void writeBytes()void writeBytes()写入写入bytesbytes型数据型数据void writeChars()void writeChars()写入写入charschars型数据型数据8.1.7 随机访问文件随机访问文件对于很多场合,例如银行系统、实时销售系统,对于很多场合,例如银行系统、实时销售系统,要求能够迅速、直接地访问文件中的特定信息,要求能够迅速、直接地访问文件中的特定信息,而无需查找其他的记录。这种类型的即时访问可而无需查找其他的记录。这种类型的即时访问可能要用到随机存取文件和数据库。随机文件的应能要用到随机存取文件和数据库。随机文件的应用程序必须指定文件的格式。最简单的是要求文用程序必须指定文件的格式。最简单的是要求文件中的所有记录均保持相同的固定长度。利用固件中的所有记录均保持相同的固定长度。利用固定长度的记录,程序可以容易地计算出任何一条定长度的记录,程序可以容易地计算出任何一条记录相对于文件头的确切位置。记录相对于文件头的确切位置。8.1.7 随机访问文件随机访问文件Java.ioJava.io包提供了包提供了RandomAccessFileRandomAccessFile类用于随机类用于随机文件的创建和访问文件的创建和访问,实现了实现了DataOutputDataOutput和和DataInputDataInput接口,可用来读写各种数据类型。接口,可用来读写各种数据类型。RandomAccessFileRandomAccessFile类有个位置指示器类有个位置指示器,对文件指对文件指针显式操作的方法有:针显式操作的方法有:int skipBytes(int n)in