第五讲IO输入输出第6章数据流的运用•6.1输入输出方法•6.2输入输出流的基类•6.3FileI/O•6.4数据输入输出流•6.5随机存取文件•6.6文件的其它操作•6.7java中的unicode•6.8管道流•6.9对象流•6.10流的分类•6.11小结文件程序终端文件程序网络端点数据流起点终点网络端点文件,字符串存储区6.1输入输出方法•什么是数据流?•数据流是指所有的数据通信通道•在java中有关流的操作使用java.io.*•出于安全的考虑,小应用不能实现文件I/O流6.1输入输出方法•System类管理标准输入输出流和错误流•System.out:•把输出送到缺省的显示(通常是显示器)•System.in•从标准输入获取输入(通常是键盘)•System.err•把错误信息送到缺省的显示•每当main方法被执行时,就自动生成上述三个对象6.1输入输出方法importjava.io.*;publicclassReadHello{publicstaticvoidmain(Stringargs[]){charinChar;System.out.println(Enteracharacter:);try{inChar=(char)System.in.read();System.out.println(+inChar);}catch(IOExceptione){System.out.println(Errorreadingfromuser);}}}6.1输入输出方法importjava.io.*;classIOTest{publicstaticvoidmain(Stringargs[]){try{bytebArray[]=newbyte[128];System.out.println(Entersomething:);System.in.read(bArray);System.out.print(Youentered:);System.out.println(bArray);//System.out.println(newString(bArray,0));}catch(IOExceptionioe){System.out.println(ioe.toString());}}}6.1输入输出方法•为什么输入的是字符,输出是乱码?•原因:System.out.println(bArray)输出的是数组的地址而不是字符•改进:将字符数组变换成字符串•原来是:System.out.println(bArray);•现在为:Strings=newString(bArray,0);•System.out.println(s);•System.in是属于BufferedInputStream类型•System.out是属于PrintStream类型•System.err也是属于PrintStream类型6.2输入输出流的基类•Java中每一种流的基本功能依赖于基本类InputStream和OutputStream•它们是抽象类,不能直接使用•属于InputStream类的方法有:•read():从流中读入数据•skip():跳过流中若干字节数•available():返回流中可用字节数•mark():在流中标记一个位置•reset():返回标记过得位置•markSupport():是否支持标记和复位操作•close():关闭流6.2输入输出流的基类•方法read()提供了三种从流中读数据的方法.•intread():读一个整数•intread(byteb[]):读多个字节到数组中•intread(byte,intoff,intlen);•属于OutputStream类的方法有:•write(intb):将一个整数输出到流中•write(byteb[]):将数组中的数据输出到流中•write(byteb[],intoff,intlen):将数组b中从off指定的位置开始len长度的数据输出到流中6.2输入输出流的基类•flush():将缓冲区中的数据强制送出•close():关闭流.•PrintStream类•println()不属于OutputStream类,它是PrintStream类的子类,能提供复杂的输出•PrintStream类的方法有:•write,flush,checkError,print,println,close.•其中println可以输出多种形式的数据.例如:•println(Strings),println(charc)等输出文件输入文件readwrite6.3FileI/O•文件对象的建立•Filefp=newFile(“tempfile.txt”);•对文件操作要定义文件流•FileInputStream类用来打开一个输入文件•FileOutputStream类用来打开一个输出文件6.3FileI/O•文件流的建立•FileInputStreamin=newFileInputStream(fp);•FileOutputStreamout=newFileOutputStream(fp);•例:文件拷贝(注意要捕获文件异常)•输入流的参数是用于输入的文件名•输出流的参数是用于输出的文件名file1.txtfile2.txt输入流输出流6.3FileI/Oimportjava.io.*;classFilestream{publicstaticvoidmain(Stringargs[]){try{FileinFile=newFile(file1.txt);FileoutFile=newFile(file2.txt);FileInputStreamfis=newFileInputStream(inFile);FileOutputStreamfos=newFileOutputStream(outFile);intc;while((c=fis.read())!=-1)//文件流结束,则返回-1fos.write(c);fis.close();fos.close();}catch(FileNotFoundExceptione){System.out.println(FileStreamsTest:+e);}catch(IOExceptione){System.err.println(FileStreamsTest:+e);}}}6.3FileI/O•增加缓冲区流,减少访问硬盘的次数,提高效率文件文件流缓冲区流file1.txtfile2.txt输入流输出流输入缓冲区输出缓冲区6.3FileI/O•缓冲区流:•BufferedInputStream和BufferedOutputStream•将它们与文件流相接•FileInputStreamin=new•FileInputStream(“file1.txt”);•BufferedInputStreambin=•newBufferedInputStream(in,256)•intlen;bytebArray[]=newbyte[256];•len=bin.read(bArray);•len中得到是长度,bArray中得到的是数据6.3FileI/O•只有缓冲区满时,才会将数据送到输出流.•Java在输出数据流中,当对方尚未将数据取走时,程序就会被阻塞.•有时要人为地将尚未填满的缓冲区中的数据送出,使用flush()方法.文件6.4数据输入输出流•什么时候需要数据输入输出流?•文件流和缓冲区流的处理对象是字节或字节数组,利用数据输入输出流可以实现对文件的不同数据类型的读写.•DataInputStream、DataOutputStream•一种较为高级的数据输入输出方式,除了字节和字节数组,还可以处理int,float,boolean等类型.•还可以用readLine方法读取一行信息•可使用的方法:•write,writeBoolean…,read,readByte…等6.4数据输入输出流•数据流的建立•FileOutputStreamfos=•newFileOutputStream(”file2.txt));•DataInputStreamdis=•newDataInputStream(fos)•数据输出流可以是一个已经建立好的输入数据流对象,例如网络的连结,文件等.•下面的例子显示如何利用数据输入输出流往文件中写不同类型的数据6.4数据输入输出流importjava.io.*;classDataInputOutputTest{publicstaticvoidmain(Stringargs[])throwsIOException{FileOutputStreamfos=newFileOutputStream(a.txt);DataOutputStreamdos=newDataOutputStream(fos);dos.writeBoolean(true);dos.writeByte((byte)123);dos.writeChar('J');dos.writeDouble(3.141592654);dos.writeFloat(2.7182f);dos.writeInt(1234567890);dos.writeLong(998877665544332211L);dos.writeShort((short)11223);dos.close();}}Stream\datainputandoutput---f5.bat6.4数据输入输出流//再读出来importjava.io.*;classDataInputOutputTest2{publicstaticvoidmain(Stringargs[])throwsIOException{DataInputStreamdis=newDataInputStream(newFileInputStream(a.txt));System.out.println(\t+dis.readBoolean());System.out.println(\t+dis.readByte());System.out.println(\t+dis.readChar());System.out.println(\t+dis.readDouble());System.out.println(\t+dis.readFloat());System.out.println(\t+dis.readInt());System.out.println(\t+dis.readLong());System.out.println(\t+dis.readShort());dis.close();}}文件目录zip文件6.5随机存取文件•类RandomAccessFile•Zip文件需要随机读取方式•文件目录给出个文件的入口,可以随机读取.•创建一个随机文件•newRandomAccessFile(“file1.txt”,“r”);•newRandomAccessFile(“file2.txt”,“rw”);•随机文件可以同时完成读和写操作.pos6.5随机存取文件•支持随机文件操作的方法:•readXXX()或writeXXX()(查看文档)•skipBytes();将指针向下移动若干字节•seek():将指针调到所需位置•getFilePointer():返回指针当前位置•length():返回文件长度•利用seek(longpos)方法查找随机文件中的信息•例:把若干个32位的整数写到一个名为“temp.dat”的文件中,然后利用seek方法,以相反的顺序再读取这些数据6.5随机存取文件importjava.io.*;publicclassrandomFile{publicstaticvoidmain(Stringargs[]){intdata_arr[]={12,31,56,23,27,1,43,65,4,99};try{RandomAccessFileran