《Java语言程序设计实用教程第十一讲输入输出流.ppt》由会员分享,可在线阅读,更多相关《Java语言程序设计实用教程第十一讲输入输出流.ppt(48页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、SISEJava语言程序设计实用教程Java语言程序设计实用教程SISEJava语言程序设计实用教程第十一讲 输入输出流SISEJava语言程序设计实用教程3本章学习要点:l理解流,运用流进行I/O操作l运用File类和RandomAccessFile类进行文件操作 l识别客户/服务器体系结构,理解网络通信的机制,创建网络应用服务SISEJava语言程序设计实用教程 q流的概念SISEJava语言程序设计实用教程流的概念lJava用流的观念来管理输入输出输入输出(I/O),流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据当程序需要读取数据的时候,就会开启一个通向数据源的流源
2、的流,这个数据源可以是文件,内存,或是网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向目的当程序需要写入数据的时候,就会开启一个通向目的地的流地的流。这时候就可以想象数据好像在这其中“流”动一样字节流:在输入输出过程中以字节(8位单字节)为单位(图11-1)字符流:在输入输出过程中以字符(16位双字节)为单位(图11-2)SISEJava语言程序设计实用教程 l在Java类库中,IO部分的内容是很庞大的,因为它涉及的领域很广泛:标准输入输出文件的操作网络上的数据流字符串流对象流zip文件流流的应用SISEJava语言程序设计实用教程lJava中字节流由两个抽象类来表示(每种流包括输
3、入和输出)InputStream,OutputStream,Java中其他多种多样变化的流均是由它们派生出来的字节流及派生SISEJava语言程序设计实用教程lJava中字符流由两个抽象类来表示(每种流包括输入和输出)Reader,Writer,Java中其他多种多样变化的流均是由它们派生出来的字符流及派生SISEJava语言程序设计实用教程l文件流:用于传递当前操作系统的某个文件内容l管道流:用于多线程之间的通信l过滤流:建立在其它流之上,完成暂存数据、统计数据、转换数据类型等l缓存流:构建内存缓冲区,使得IO流的利用更高效l各种IO流的用途(P296,表11-1)SISEJava语言程序设
4、计实用教程标准输入输出l标准输入 public static final InputStream in 使用read()和skip(long n)方法读取。l标准输出 public static final PrintStream out 使用print()和println()来输出。l标准错误输出 public static final PrintStream errSISEJava语言程序设计实用教程 q文件操作SISEJava语言程序设计实用教程File类(p298,图11-7)lFile类的实例代表磁盘文件的对象lFile类只是描述文件对象的属性,包括获取文件的大小、是否读写、文件路径
5、、文件清单列表、新建目录等q目录被作为一种文件来处理 qFile类并不是文件流类,它不能从文件读取数据或向文件写入数据 SISEJava语言程序设计实用教程例:创建一个目录(P299的创建目录方法有误)File file=new File(e:LeadWay);boolean a=file.mkdir();if(a=true)System.out.println(创建成功);else System.out.println(失败);SISEJava语言程序设计实用教程例:查看一个目录下的文件 File file=new File(目录);1.String fileName=file.listfi
6、le.length();2.File fileName=file.listFiles();然后用数组循环输出 例如:例如:File dir=new File(c:windows);String fileName=dir.list();for(int i=0;ifileName.length;i+)System.out.println(fileNamei);SISEJava语言程序设计实用教程文件的顺序访问 1.引入“java.io”包,import java.io.*;2.根据数据源和输入输出的任务建立字节或字符流。3.若需要对字节或字符信息组织加工,位数据在已建字节或字符流对象上建立数据流或
7、缓冲流。4.用输入输出流对象的成员方法进行读/写操作,需要时可设置指针位置。5.关闭流对象。2-5要考虑异常处理。SISEJava语言程序设计实用教程文件输入输出字节流1.创建FileInputStream类对象;2.读取文件信息;3.创建FileOutputStream类对象;4.向输出流写信息:q void write(int b);void write(byte b);q void write(byte b,int off,int len);5.关闭FileInputStream流。SISEJava语言程序设计实用教程FileInputStream的read方法FileInputStre
8、am可以使用可以使用read()方法一次读入一个字节方法一次读入一个字节,并以并以int类类型返回,或者是使用型返回,或者是使用read()方法时读入至一个方法时读入至一个byte数组,数组,byte数组数组的元素有多少个,就读入多少个字节的元素有多少个,就读入多少个字节.在将整个文件读取完成或写入完毕的过程中,这么一个byte数组通常被当作缓冲区,因为这么一个byte数组通常扮演承载数据的中间角色.public int read(byte b,int off,int len)从此输入流中将最多len个字节的数据读入一个字节数组中。参数:b -存储读取数据的缓冲区。off -数据的起始偏移量。
9、len -读取的最大字节数。返回:读入缓冲区的字节总数,如果因为已经到达文件末尾而没有更多的数据,则返回 -1。SISEJava语言程序设计实用教程FileOutputStream的构造方法lFileOutputStream默认会以新建文件的方式来开启流.如果指定的文件名称已经存在,则原文件会被覆盖;如果想以附加的模式来写入文件,则可以在构建FileOutputStream实例时指定为附加模式.例如:FileOutputStream fileOutputStream=new FileOutputStream(args1,true);l构建方法的第二个append参数如果设定为true,在开启流
10、时如果文件不存在则会新建一个文件,如果文件存在就直接开启流,并将写入的数据附加至文件末端.SISEJava语言程序设计实用教程例:使用文件输入输出字节进行文件拷贝方法public static void main(String args)try byte buffer=new byte1024;/来源文件 FileInputStream fileInputStream=new FileInputStream(new File(args0);/目的文件 FileOutputStream fileOutputStream=new FileOutputStream(new File(args1);/
11、available()可取得未读取的数据长度 System.out.println(复制文件:+fileInputStream.available()+字节);SISEJava语言程序设计实用教程例:使用文件输入输出字节方法(续1)while(true)if(fileInputStream.available()1024)/剩余的数据比1024字节少 /一位一位读出再写入目的文件 int remain=-1;while(remain=fileInputStream.read()!=-1)fileOutputStream.write(remain);break;else /从来源文件读取数据至缓
12、冲区 fileInputStream.read(buffer);/将数组数据写入目的文件 fileOutputStream.write(buffer);SISEJava语言程序设计实用教程例:使用文件输入输出字节方法(续2)/关闭流 fileInputStream.close();fileOutputStream.close();System.out.println(复制完成);catch(ArrayIndexOutOfBoundsException e)System.out.println(using:java FileStreamDemo src des);e.printStackTrac
13、e();catch(IOException e)e.printStackTrace();SISEJava语言程序设计实用教程例:使用文件输入输出字节方法的说明l程序中示范了两个read()方法,每次读取之后,读取的光标都会往前进,如果读不到数据刚返回.:一个方法可以读入指定长度的数据至数组另一个方法一次可以读入一个字节.l使用available()方法可以获得还有多少字节可以读取.l除了使用File来建立FileInputStream,FileOutputStream的实例之外,也可以直接使用字符串指定路径来建立.如:/来源文件FileInputStream fileInputStream=n
14、ew FileInputStream(args0);/目的文件FileOutputStream fileOutputStream=new FileOutputStream(args1);SISEJava语言程序设计实用教程文件输入输出字符流l上面的FileInputStream使用字节读取文件,字节流不能直接操作Unicode字符,所以Java 提供了字符流.l由于汉字在文件中占用2 个字节,如果使用字节流,读取不当会出现乱码现象,采用字符流就可以避免这个现象,因为,在Unicode 字符中,一个汉字被看作一个字符.SISEJava语言程序设计实用教程文件输入输出字符流(P300,例11-2)
15、lFileReader和FileWriter是InputStreamReader和OutputStreamWriter的子类。构造方法各有两种。qFileReader(File f)FileReader(String fn)qFileWriter(File f)FileWriter(String fn)l常用方法:q read();read(char buffer);q write(String str);q write(char buffer);SISEJava语言程序设计实用教程文件的随机访问 l输入流FileInputStream和输出流 FileOutputStream,实现的是对磁盘
16、文件的顺序读写,而且读写要分别创建不同对象。相比之下RandomAccessFile类则可对文件实现随机读写操作。l使用下列构造方法创建流,使用路径名的字符串或使用File类的对象作为参数,mode的取值为”r”或”rw”:qRandomAccessFile(String name,String mode);qRandomAccessFile(File name,String mode);lRandomAccessFile对象操作一个文件时,能够在指定的位置以原始数据类型原始数据类型读取或写入数据,例:q当写入一个int类型的值时,四个字节的数据输出到文件q当读取一个double类型的值时,8
17、个字节的数据从文件输入SISEJava语言程序设计实用教程RandomAccessFile对象的指针规律l新建RandomAccessFile对象的文件位置指针位于文件的开头处;l每次读写操作之后,文件位置的指针都相应后移到读写的字节数;l可以通过getFilePointer方法来获得文件当前指针的位置,默认为0 l通过seek方法来设置文件指针的位置。SISEJava语言程序设计实用教程RandomAccessFile的其它方法(P301,例11-3)lInt read()从文件当前位置读取一个字节lint read(byteb)lint read(byteb,int off,int len
18、)lFinal char readChar()从文件中读取2个字节 lFinal int readInt()从文件中读取4个字节lFinal String readLine()从文件中读取一行后转为StringlVoid write(byteb)将字节数组B中的数据写到文件中lVoid write(byteb,int off,int len)将 len 个字节从指定字节数组写入到此文件,并从偏移量 off 处开始lVoid write(int b)将指定的数据写到文件中。lFinal void writeChar(int v)将char值按2个字节写入到文件中 lFinal void writ
19、eChars(String s)将字符串按字符方式写入到文件中 lFinal void writeInt(int v)按四个字节将 int 写入该文件,先写高字节 lSISEJava语言程序设计实用教程SequenceInputStream类lSequenceInputStream类表示将其他输入流的逻辑串联。它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,直到到达包含的最后一个输入流的文件末尾为止。lSequenceInputStream的构造器使用,一对输入流或者一个输入流的枚举作为参数:qSequenceInputStream(In
20、putStream first,InputStream second)qSequenceInputStream(Enumeration streamEnum)SISEJava语言程序设计实用教程Enumeration接口l提供了枚举集合对象中所有对象的功能。为一个快要过时的接口,枚举时建议使用Iterator。lhasMoreElements()方法用来判断Enumeration接口中是否还有元素,返回一个boolean值。l SISEJava语言程序设计实用教程 q输入输出流的典型操作SISEJava语言程序设计实用教程典型的几种输入输出流l节点流:读或者写到特定位置(如磁盘文件、内存或网络
21、)的输入输出流。qFileInputStream和FileOutputStream是读入或写出数据到磁盘文件的节点流qByteArrayInputStream和ByteArrayOutputStream是读入或写出数据到内存的结点流qObjectInputStream和ObjectOutputStream是读入或写出数据到网络的节点流l过滤流:从一个流读入数据,然后写到另一个流。本质本质是建立在已存在的流之上,通过对数据的处理提供较强是建立在已存在的流之上,通过对数据的处理提供较强大的读写功能大的读写功能。过滤流又可细分为缓冲流、转换流、数据流、打印流、对象流等SISEJava语言程序设计实用
22、教程标准键盘的输入处理lSystem.in是InputStream类型,直接以字节流的方式读入数据l需要以字符流的方式时,需要将字节流转换为Unicode字符流。可以使用InputStreamReader类完成这样的功能。l为了提高效率,将键盘输入的数据读到将键盘输入的数据读到BufferedReader类的对象中,实现缓冲功能,例如:类的对象中,实现缓冲功能,例如:lBufferedReader reader=new BufferedReader(new InputStreamReader(System.in);SISEJava语言程序设计实用教程缓冲类的使用举例public static
23、void main(String args)try /缓冲System.in输入流 BufferedReader bufReader=new BufferedReader(new InputStreamReader(System.in);/缓冲FileWriter字符输入流 BufferedWriter bufwriter=new BufferedWriter(new FileWriter(args0);String input=null;/每读一次进行一次写入动作 while(!(input=bufReader.readLine().equals(quit)bufwriter.write(i
24、nput);/newline()方法写入与操作系统相依的换行字符 bufwriter.newLine();bufwriter.flush();bufwriter.close();SISEJava语言程序设计实用教程缓冲类的使用举例(续)catch(ArrayIndexOutOfBoundsException e)System.out.println(没有找到指定文件);catch(IOException e)e.printStackTrace();SISEJava语言程序设计实用教程实现P304,例11-5说明l若想对InputStream和OutputStream进行字符处理,可以使用jav
25、a.io.InputStreamReader和java.io.OutputStreamWriter为其加上字符处理的功能,它们分别为Reader和Writer的子类l举个例子来说,若想要显示纯文本文件的内容,不不用费心地自行判断字符编码用费心地自行判断字符编码,只要将InputStream、OutputStream的实例作为构建InputStreamReader、OutputStreamWriter时的变量,就可以操作 InputStreamReader和OutputStreamWriter来进行文本文件的读取,让它们为您做字符判断与转换的动作SISEJava语言程序设计实用教程 q网络服务S
26、ISEJava语言程序设计实用教程客户/服务器体系结构l在设计上把数据的表示与其内部的处理和存储分开q客户端请求服务,服务器提供服务q客户发送的请求由网络发送给服务器,服务器响应请求处理完毕后,其结果经过网络发送给客户端。q一个服务器可以给多个客户端提供服务。l浏览器和Web服务器就是典型的客户/服务器结构(P1191,图11-9)q浏览器发出浏览某个网址网页的请求qWeb服务器将HTML网页发送给客户端浏览器SISEJava语言程序设计实用教程通信协议l计算机之间的通信,如同人与人之间的交流,需要双方遵守相应的语言规则qTCP/IP:传输控制协议,用于不可靠的互联网上提供可靠的端到端的字节流
27、通信。其中TCP用于传输层,需要确定端口号;IP用于网络层,需要确定IP地址。一个网络服务器是通过一个网络服务器是通过IP地址和地址和端口号访问的端口号访问的。qUDP:面向非连接的用户数据包协议,它提供了发送封装的原始IP数据报的方法,并且发送时无需建立连接SISEJava语言程序设计实用教程Internet 服务服务 端口号Internet服务端口号 FTP21WWW80TELNET23NNTP119DNS53POP3110(备注:NNTP-网络新闻传输协议)常见的一些常见的一些internet 服务对应的端口号服务对应的端口号SISEJava语言程序设计实用教程l所谓Socket通常也称
28、为”套接字”,由IP地址和端口号有两部分组成,应用程序通过“套接字”所提所提供的一组供的一组API向网络发出请求或者应答网络请求。l ServerSocket类和Socket类位于包中。ServerSocket类用于服务器建立监听套接字,Socket类用于客户机建立套接字对象进行通信。l例如,把套接字连接想象为一个电话呼叫,当呼叫完成后,谈话的任何一方都可以随时讲话。但是在最初建立呼叫时,必须有一方呼叫,而另一方则监听铃声。这样,呼叫的一方为“客户”,负责监听的一方是“服务器”。套接字套接字SISEJava语言程序设计实用教程l客户机/服务器(C/S)模式是在网络应用程序中最常用的通信模式。l
29、在C/S模式通信过程中主动发起通信的一方被称为客户机,而监听并接受请求进行通信的一方成为服务器。服务器使用ServerSocket监听指定的端口,端口可以随意指定(由于1024以下的端口通常属于保留端口,所以一般使用大于1024的端口),等待客户端连接请求,客户端连接后,会话产生,在完成会话后,关闭连接。客户机客户机/服务器(服务器(C/S)模式的原理)模式的原理SISEJava语言程序设计实用教程l创建服务器端ServerSocket,设置建立连接的端口号。l创建客户端Socket对象,设置绑定的主机名或IP地址,指定连接端口号。lServerSocket类的accept方法使服务器处于阻塞
30、状态,等待用户请求l客户机Socket发起连接请求。l建立连接l取得InputStream和OutputStream。l利用InputStream和OutputStream进行数据传输。l关闭Socket和ServerSocket。利用利用Socket方式进行数据通信与传输的主要步骤方式进行数据通信与传输的主要步骤SISEJava语言程序设计实用教程创建服务器创建服务器(端口号端口号)定义数据成员定义数据成员服务器等待服务器等待网络连接网络连接建立建立socket流流读客户读客户 端信息端信息向用户发出一个字符串向用户发出一个字符串创建创建Socket实例实例定义数据成员定义数据成员建立建立s
31、ocket流流读读socket流流(接收并显示接收并显示)送用户名给送用户名给服务器服务器关闭流关闭流waiting for user127.0.0.1 11111111login:connetcting client.java提示用户登录成功提示用户登录成功读读socket流流User:javaLogin successfulSISEJava语言程序设计实用教程Socket中的成员方法l构造方法构造方法lgetInputStream():返回该返回该socket所对应的输入所对应的输入流流lgetOutputStream():返回该返回该socket所对应的输出所对应的输出流流SISEJav
32、a语言程序设计实用教程 构造方法功能说明ServerSocket(int port)在指定的端口创建一个ServerSocket对象 ServerSocket(int port,int count)在指定的端口创建一个ServerSocket对象并说明服务器所能支持的最大链接数 Socket(InetAddress address,int port)使用指定地址和端口创建一个Socket对象 Socket(InetAddress address,int port,boolean stream)使用指定地址和端口创建一个Socket对象(若布尔数值为true,则是采用流式通信方式)Socket(
33、String host,int port)使用指定主机和端口创建一个Socket对象Socket(String host,int port,boolean stream)使用指定主机和端口创建一个Socket对象(若布尔数值为true,则是采用流式通信方式)ServerSocketServerSocket类类/Socket/Socket类类的构造方法的构造方法SISEJava语言程序设计实用教程ServerSocket对象和Socket对象(1)创建一个ServerSocket对象就创建了一个监听服务,例如要创建一个指定端口的ServerSocket对象。ServerSocket Listen
34、=new ServerSocket(4321);设置指定的监听端口4321,由于一台服务器可以监听多台客户机,而对于不同的服务请求之间是根据端口号来区别的。(2)创建一个Socket对象用于与服务器建立链接,使用指定的端口号使得服务器在捕获到客户端的请求时,根据端口号来完成给定的服务。Socket service=new Socket(“Email server”,4321);其中“Email server”是指欲连接服务器的主机的地址,4321 是指服务器上提供服务的端口号。SISEJava语言程序设计实用教程qimport java.io.DataOutputStream;qimport
35、.ServerSocket;qimport .Socket;qpublic class J_Serverqq public static void main(String args)q q tryq q ServerSocket server=new ServerSocket(5000);q while(true)q q Socket s=server.accept();q System.out.println(服务器端接收到来自客户端的连接服务器端接收到来自客户端的连接);q DataOutputStream dataOutq =new DataOutputStream(s.getOutpu
36、tStream();q dataOut.writeUTF(服务器端向客户端问好服务器端向客户端问好);q dataOut.close();s.close();q /while循环结束循环结束q q catch(Exception e)/try-catch结构结束结构结束 q /方法方法main结束结束q/类类J_Server结束结束 基于基于TCP通讯例程的服务器端程序通讯例程的服务器端程序SISEJava语言程序设计实用教程qimport java.io.DataInputStream;qimport .Socket;qpublic class J_Clientqq public stati
37、c void main(String args)q q tryq q Socket s=new Socket(localhost,5000);q DataInputStream dataInq =new DataInputStream(s.getInputStream();q System.out.println(客户端接收到客户端接收到:+dataIn.readUTF();q dataIn.close();q s.close();q q catch(Exception e)q q /try-catch结构结束结构结束 q /方法方法main结束结束q/类类J_Client结束结束基于基于TCP通讯例程的客户端程序通讯例程的客户端程序