《Java语言8数据流的应用.ppt》由会员分享,可在线阅读,更多相关《Java语言8数据流的应用.ppt(37页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Java语言程序设计语言程序设计资源与环境科学学院资源与环境科学学院第八章第八章 数据流的应用数据流的应用数据流的应用数据流的应用 输入输出方法输入输出方法 File I/O 缓冲流缓冲流 数据流数据流 文件的其它操作文件的其它操作输入输出方法输入输出方法文件文件程序程序终端终端文件文件程序程序网络端点网络端点数据流数据流起起点点终终点点 网络端点网络端点文件文件,字符串字符串存储区存储区数据流是指所有的数据通信通道数据流是指所有的数据通信通道在在java中有关流的操作使用中有关流的操作使用java.io.*P236 什么是数据流什么是数据流?输入输出方法输入输出方法n System类管理标准
2、输入输出流和错误流类管理标准输入输出流和错误流 n System.out:将数据从程序发送到目的地将数据从程序发送到目的地(通常是显通常是显示器示器)n System.in:将数据从数据源传递给程序将数据从数据源传递给程序(通常是键通常是键盘盘)n System.err:把错误信息送到缺省的显示把错误信息送到缺省的显示输入输出方法输入输出方法public class ReadHello public static void main(String args)char inchar;System.out.println(“Enter a character:”);try inChar=(char
3、)System.in.read();System.out.println(inChar);catch(IOException e)Sytem.out.println(“Error reading from user”);输入输出方法输入输出方法import java.io.*;class IOTest public statics void main(String args)try byte bArray=new byte128;System.out.println(“Enter something:”);System.in.read(bArray);System.out.print(“You
4、 entered:”);System.out.println(bArray);catch(IOException ioe)System.out.println(ioe.toString();输入输出方法输入输出方法 为什么输入的是字符为什么输入的是字符,输出是乱码输出是乱码?原因原因:System.out.println(bArray)输出的是数组输出的是数组的地址的地址而不是字符而不是字符 改进改进:将字符数组变换成字符串将字符数组变换成字符串输出正确结果输出正确结果 原来是原来是:System.out.println(bArray);System.out.println(bArray);现
5、在为现在为:String s=new String(bArray);String s=new String(bArray);System.out.println(s);System.out.println(s);输入输出流的基类输入输出流的基类 Java中每一种流的基本功能依赖于基本类中每一种流的基本功能依赖于基本类 InputStream和和OutputStream,它们是抽象类它们是抽象类,不能直接不能直接使用使用 属于属于InputStream类的方法有类的方法有:read():从流中读入数据从流中读入数据 skip():跳过流中若干字节数跳过流中若干字节数 available():返回
6、流中可用字节数返回流中可用字节数 mark():在流中标记一个位置在流中标记一个位置 reset():返回标记过的位置返回标记过的位置 markSupport():是否支持标记和复位操作是否支持标记和复位操作 close():关闭流关闭流输入输出流的基类输入输出流的基类方法方法read()提供了三种从流中读数据的方法提供了三种从流中读数据的方法.int read():读取流中的字节。返回一个整数,它读取流中的字节。返回一个整数,它是流的下一个字节。如果返回是流的下一个字节。如果返回1,表明已到达文件,表明已到达文件流的末尾。流的末尾。int read(byte b):读多个字节到数组中读多个字
7、节到数组中 int read(byte b,int off,int len);从流中指定位置从流中指定位置读取多个指定长度的字节。读取多个指定长度的字节。参数:参数:b一个用于存储一个用于存储数据的字节数组;数据的字节数组;off数组的第一个元素,应存储数据数组的第一个元素,应存储数据的第一个字节。的第一个字节。len要读取的字节数。要读取的字节数。输入输出流的基类输入输出流的基类 属于属于OutputStream类的方法有类的方法有 write(int b):将字节写入到流中将字节写入到流中 write(byte b):将数组中的数据写入到流中将数组中的数据写入到流中 write(byte
8、b,int off,int len):将数组将数组b中从中从off指指定的位置开始定的位置开始len长度的数据写入到流中长度的数据写入到流中 flush():将缓冲区中的数据强制送出将缓冲区中的数据强制送出 close():关闭流关闭流.输入输出流的基类输入输出流的基类 过滤流,书过滤流,书P237 PrintStream类是类是FilterOutputStream类的子类,类的子类,FilterOutputStream类是类是OutputStream类的子类。类的子类。PrintStream类的方法有类的方法有:write,flush,checkError,print,println,clo
9、se.println()不属于不属于OutputStream类类,它是它是PrintStream类的方法类的方法,能提供复杂的输出。例如能提供复杂的输出。例如:println(String s),println(char c)等等字字 节节 流流 字节流要么是字节流要么是 InputStream 的子类,要么是的子类,要么是OutputStream 的子类。这些类都是的子类。这些类都是抽象类抽象类,因此不,因此不能通过直接创建这些类的对象来创建字节流,而必须能通过直接创建这些类的对象来创建字节流,而必须通过它们的子类通过它们的子类来创建流。来创建流。FileInputStream 和和 Fil
10、eOutputStream:用于磁盘、用于磁盘、光盘或其他存储设备中的文件的字节流。光盘或其他存储设备中的文件的字节流。BufferedInputStream和和BufferedOutputStream为缓为缓冲字节流。冲字节流。DataInputStream 和和 DataOutputStream 被过滤的字被过滤的字节流,从中可读取诸如整数和浮点数等。节流,从中可读取诸如整数和浮点数等。File I/O 文件对象的建立文件对象的建立 File fp=new File(“tempfile.dat”);对文件操作要定义文件流对文件操作要定义文件流 FileInputStream 类用来打开一个
11、输入文件类用来打开一个输入文件 FileOutputStream 类用来打开一个输出文件类用来打开一个输出文件输出文件输出文件输入文件输入文件File I/O 文件流的建立文件流的建立 FileInputStream in=new FileInputStream(fp);FileOutputStream out=new FileOutputStream(fp);创建文件输入流后,可以调用创建文件输入流后,可以调用read()方法来读取流中方法来读取流中的字节。该方法返回一个整数,它是流中的下一个字的字节。该方法返回一个整数,它是流中的下一个字节,如果返回节,如果返回-1,则表明已到达文件流的末
12、尾。,则表明已到达文件流的末尾。要从流中读取多个字节,可调用要从流中读取多个字节,可调用 read(byte,int,int)方法。方法。参数:参数:byte用于存储数据的字节数组;用于存储数据的字节数组;int 数组的数组的第一个元素,应存储数据的第一个字节;第一个元素,应存储数据的第一个字节;int 要读取要读取的字节数。的字节数。File I/O 可可使用使用while循环循环来读取来读取FileInputStream对象对象in中的中的数据数据 int newByte=0;while(newByte!=-1)newByte=in.read();System.out.print(newB
13、yte+“”);一段完整程序,见书一段完整程序,见书P238 程序程序15.1File I/O 文件输出流可使用构造函数文件输出流可使用构造函数 FileOutputStream(String)来创建,其用法与来创建,其用法与 FileInputStream(String)相同。相同。指定与输出流相关联的文件时,必须非常小心。指定与输出流相关联的文件时,必须非常小心。如果如果它与现有的某个文件同名它与现有的某个文件同名,则当数据写入到流中时,则当数据写入到流中时,原原来的数据将被覆盖。来的数据将被覆盖。可以使用构造函数可以使用构造函数 FileOutputStream(String,boole
14、an)来将数据追加到文件末尾。来将数据追加到文件末尾。追加数据追加数据时时boolean=true。文件输出流的文件输出流的 write(int)方法用于将字节写入到流中。方法用于将字节写入到流中。将最后一个字节写入到文件中后,应调用流的将最后一个字节写入到文件中后,应调用流的close()方方法来关闭它。法来关闭它。见书见书P240 程序程序15.2缓冲流缓冲流 缓冲区缓冲区是一片存储空间,在读写数据的程序需要之前,是一片存储空间,在读写数据的程序需要之前,数据被存储在这里。使用缓冲区数据被存储在这里。使用缓冲区无需每次都到数据源那无需每次都到数据源那里去获取数据。里去获取数据。缓冲输入流使
15、用未被处理的数据来缓冲输入流使用未被处理的数据来填充缓冲区填充缓冲区,程序,程序需要数据时,将需要数据时,将首先在缓冲区中查找首先在缓冲区中查找,如果没有找到,如果没有找到,再到流源中查找再到流源中查找。缓冲字节流是使用缓冲字节流是使用BufferedInputStream 和和BufferedOutputStream 类表示的。类表示的。书书 P241缓冲流缓冲流n 增加缓冲区流增加缓冲区流,减少访问硬盘的次数减少访问硬盘的次数,提高效率提高效率文件文件文件流文件流 缓冲区流缓冲区流 file1.datfile2.dat输入流输入流输出流输出流输入缓冲区输入缓冲区输出缓冲区输出缓冲区缓冲流缓
16、冲流缓冲区流缓冲区流:BufferedInputStream和和 BufferedOutputStream将它们与文件流相接将它们与文件流相接FileInputStream in=new FileInputStream(“file1.dat”);BufferedInputStream bin=new BufferedInputStream(in,256)int len;byte bArray=new byte256;len=bin.read(bArray);len中得到是长度中得到是长度,bArray中得到的是数据中得到的是数据缓冲流缓冲流n 只有只有缓冲区满时缓冲区满时,才会将数据送到输出流
17、才会将数据送到输出流.n 有时要人为地将有时要人为地将尚未填满的缓冲区中的数据送出尚未填满的缓冲区中的数据送出,使用使用flush()方法方法.数据流数据流n 要处理要处理未表示为字节或字符的数据未表示为字节或字符的数据,可以使用,可以使用数数据输入流和数据输出流据输入流和数据输出流。这些流对字节流进行过滤,。这些流对字节流进行过滤,以便能够直接读写如下以便能够直接读写如下基本数据类型基本数据类型:boolean、byte、double、float、int、long和和short。n 要创建数据输入流,可使用构造函数要创建数据输入流,可使用构造函数DataInputStream(InputSt
18、ream),其中的参数是一个现有的,其中的参数是一个现有的输入流,如一个缓冲输入流或一个文件输入流。输入流,如一个缓冲输入流或一个文件输入流。n 要创建数据输出流,可使用构造函数要创建数据输出流,可使用构造函数 DataOutputStream(OutputStream),它指定了相关联的,它指定了相关联的输出流。输出流。数据流数据流n 可使用的方法可使用的方法:writeBoolean,readByte等等,P244n 数据流的建立数据流的建立 FileOutputStream fos=new FileOutputStream(”file2.dat);DataInputStream dis=
19、new DataInputStream(fos)例子例子P244,将前将前400个素数作为整数写入到文件中。个素数作为整数写入到文件中。n 数据输出流可以是一个已经建立好的输入数据流对象数据输出流可以是一个已经建立好的输入数据流对象,例如例如网络的连结网络的连结,文件等。文件等。n 下面的例子显示如何利用数据输入输出流往文件中写不同下面的例子显示如何利用数据输入输出流往文件中写不同类型的数据。类型的数据。数据流数据流class datainput_output public static void main(String args)throws IOException FileOutputSt
20、ream fos=new FileOutputStream(“a.dat”);DataOutputStream dos=new DataOutputStream(fos);try 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);final
21、ly dos.close();数据流数据流DataInputStream dis=new DataInputStream(new FileInputStream(”a.dat);try System.out.println(dis.readBoolean();System.out.println(dis.readByte();System.out.println(dis.readChar();System.out.println(dis.readDouble();System.out.println(dis.readFloat();System.out.println(dis.readInt(
22、);System.out.println(dis.readLong();System.out.println(dis.readShort();finallydis.close();字节流的分类字节流的分类InputStreamInputStream和和OutputStreamOutputStream是所有输入输出流的父是所有输入输出流的父类类,它们是一个抽象类它们是一个抽象类.InputStreamFileInputStreamPipedIntputStreamFilterInputStreamByteArrayInputStreamDataInputStreamBufferedInputSt
23、reamLineNumberInputStreamSequencedInputStreamStringBufferInputStreamPushbackInputStream字节流的分类字节流的分类OutputStreamFileOutputStreamPipeOutputStreamFilterOutputStreamByteArrayOutputStreamDataOutputStreamBufferedOutputStreamPrintStreamn InputStreamInputStream中的基本方法包括中的基本方法包括:read,available,:read,available
24、,mark,skip,reset,closemark,skip,reset,closen OutputStreamOutputStream中的基本方法包括中的基本方法包括:write,flush,:write,flush,closeclose文件的其他操作文件的其他操作n 使用文件类获取文件的路径信息使用文件类获取文件的路径信息n 设设f f是一个文件对象是一个文件对象 File f=new File(“data”,“temp.dat”);File f=new File(“data”,“temp.dat”);nf.f.getNamegetName():():返回文件名返回文件名 temp.da
25、ttemp.datnf.f.getParentgetParent():():返回文件所在目录名返回文件所在目录名 datadatanf.f.getPathgetPath():():返回文件路径返回文件路径 datatemp.datdatatemp.datnf.f.getAbsolutePathgetAbsolutePath():():返回绝对路返回绝对路 c:myprogdatatemp.datc:myprogdatatemp.dat文件的其他操作文件的其他操作例例:获取当前目录下所有文件名和文件的尺寸获取当前目录下所有文件名和文件的尺寸:import java.io.*;public cla
26、ss file_size public static void main(String args)File files=new File(“.”);String file_list=files.list();for(int i=0;ifile_list.length;i+)File current_file=new File(file_listi);System.out.println(file_listi+current_file.length();读取文本文件读取文本文件n 字符流用于处理用字符流用于处理用ASCII字符集字符集或或Unicode(包含包含ASCII的国际字符集的国际字符集
27、)表示的文本表示的文本。n 可以使用字符流来处理的文件有可以使用字符流来处理的文件有纯文本文件纯文本文件,HTML文档文档和和Java源代码文件源代码文件。n 用于读写这些流的类都是用于读写这些流的类都是Reader和和Writer的子类的子类n 从文件中读取字符流时,通常使用从文件中读取字符流时,通常使用FileReader类类这个类是从这个类是从InputStreamReader派生而来的,它读派生而来的,它读取字节流中的字节,并将其转换为表示取字节流中的字节,并将其转换为表示Unicode字符字符的整数值。的整数值。读取文本文件读取文本文件n 构造函数构造函数 FileReader(St
28、ring)。字符串参数指定。字符串参数指定了要关联的文件,除文件名外,它还可以包含路径。了要关联的文件,除文件名外,它还可以包含路径。FileReader fReader=new FileReader(“aa.txt”);n 使用使用read()方法来读取文件中的字符:方法来读取文件中的字符:read():将流中的下一个字符作为整数返回;:将流中的下一个字符作为整数返回;read(char,int,int):将指定数目的字符读入到指:将指定数目的字符读入到指定字符数组的指定位置。定字符数组的指定位置。读取文本文件读取文本文件n 要一次读取整行文本,而不是一个字符,可以结合要一次读取整行文本,而
29、不是一个字符,可以结合使用使用FileReader和和BufferedReader类。类。n BufferedReader 类读取字符输入流,并将读取的类读取字符输入流,并将读取的字符存储到缓存区,以提高效率。字符存储到缓存区,以提高效率。n BufferedReader(Reader):创建与指定的创建与指定的Reader对象相关对象相关联的缓冲区字符流。联的缓冲区字符流。n BufferedReader(Reader,int):创建与指定的创建与指定的Reader对象相对象相关联的缓冲区字符流,其缓冲区大小为关联的缓冲区字符流,其缓冲区大小为int。读取文本文件读取文本文件n 缓冲区字符流
30、可使用方法缓冲区字符流可使用方法read()和和read(char,int,int)来来读取;读取;n 要读取一行文本要读取一行文本readLine(),返回一个,返回一个String对象,其中包对象,其中包含流的下一行文本,但不包括表示行尾的字符。如果到达流尾,含流的下一行文本,但不包括表示行尾的字符。如果到达流尾,则返回则返回NULL。n 程序程序 见见P247 15.7写文本文件写文本文件n FileWriter类用于将字符流写入到文件中,它是类用于将字符流写入到文件中,它是OutputStreamWriter的子类。的子类。n 构造构造函数函数 FileWriter(String)和和
31、 FileWriter(String,boolean)。如果要将数据追加到文本文件末尾,可将可选的布。如果要将数据追加到文本文件末尾,可将可选的布尔参数设置为尔参数设置为true。n 可用于将数据写入流中的方法:可用于将数据写入流中的方法:write(int):写入一个字符;:写入一个字符;write(char,int,int):从指定位置开始,写入指定字符数组:从指定位置开始,写入指定字符数组中指定数目的字符;中指定数目的字符;write(String,int,int):从指定位置开始,写入指定字符串:从指定位置开始,写入指定字符串中指定数目的字符。中指定数目的字符。本章小结本章小结 在在J
32、ava中有中有数据传输数据传输的地方都用到的地方都用到I/O流流。(通常通常是是文件文件,网络网络,内存和标准输入输出内存和标准输入输出等等)InputStream 和和OutputStream是所有是所有I/O流的祖流的祖先先(只有只有RandomAccessFile类是一个例外类是一个例外),read和和write是它们最基本的方法是它们最基本的方法,读写单位是读写单位是字节字节。在众多的流对象中在众多的流对象中,并不是每一种都单独使用并不是每一种都单独使用,其中其中过滤流的子类在数据送出去之前做必要的处理过滤流的子类在数据送出去之前做必要的处理。本章小结本章小结 File,File(In
33、put/Output)StreamFile,File(Input/Output)Stream,Data(Input/Output)StreamData(Input/Output)Stream是一个过滤流的子类是一个过滤流的子类,借此可以读写各种基本数据借此可以读写各种基本数据,在文件和网络中经常在文件和网络中经常使用使用.如如:readByte,writeBoolean:readByte,writeBoolean等。等。Buffered(Input/Output)StreamBuffered(Input/Output)Stream的作用是在数据的作用是在数据送到目的之前先缓存送到目的之前先缓存,达到一定数量时再送到目的达到一定数量时再送到目的,已减少阻塞次数。已减少阻塞次数。字符流的读写字符流的读写 FileReader/FileWriterFileReader/FileWriter思考题思考题 编程实现编程实现将多条线段数据记录在一个文本文件中。将多条线段数据记录在一个文本文件中。从文本文件中读取线段数据,实现在窗体中绘制从文本文件中读取线段数据,实现在窗体中绘制多条线段的操作,要求实现所有线的重绘。多条线段的操作,要求实现所有线的重绘。