版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、SISE Java语言程序 设计实用教程 Java语言程序设计实用教程 SISE Java语言程序 设计实用教程 第十一讲 输入输出流 SISE Java语言程序 设计实用教程 3 本章学习要点: l理解流,运用流进行I/O操作 l运用File类和RandomAccessFile类进行 文件操作 l识别客户/服务器体系结构,理解网络通 信的机制,创建网络应用服务 SISE Java语言程序 设计实用教程 q流的概念 SISE Java语言程序 设计实用教程 流的概念 lJava用流的观念来管理输入输出输入输出(I/O),流是一个很形象的 概念,当程序需要读取数据的时候,就会开启一个通向数据当程
2、序需要读取数据的时候,就会开启一个通向数据 源的流源的流,这个数据源可以是文件,内存,或是网络连接。类 似的,当程序需要写入数据的时候,就会开启一个通向目的当程序需要写入数据的时候,就会开启一个通向目的 地的流地的流。这时候就可以想象数据好像在这其中“流”动一样 字节流:在输入输出过程中以字节(8位单字节)为单位 (图11-1) 字符流:在输入输出过程中以字符(16位双字节)为单位 (图11-2) SISE Java语言程序 设计实用教程 l在Java类库中,IO部分的内容是很庞大的,因为 它涉及的领域很广泛: 标准输入输出 文件的操作 网络上的数据流 字符串流 对象流 zip文件流 流的应用
3、 SISE Java语言程序 设计实用教程 lJava中字节流由两个抽象类来表示(每种流包括输入和输出) InputStream,OutputStream,Java中其他多种多样变化的流均 是由它们派生出来的 字节流及派生 SISE Java语言程序 设计实用教程 lJava中字符流由两个抽象类来表示(每种流包括输入和输出) Reader,Writer,Java中其他多种多样变化的流均是由它们派生出 来的 字符流及派生 SISE Java语言程序 设计实用教程 l文件流:用于传递当前操作系统的某个文件内容 l管道流:用于多线程之间的通信 l过滤流:建立在其它流之上,完成暂存数据、统计数 据、转
4、换数据类型等 l缓存流:构建内存缓冲区,使得IO流的利用更高效 l 各种IO流的用途(P296, 表11-1) SISE Java语言程序 设计实用教程 标准输入输出 l 标准输入 public static final InputStream in 使用read()和skip(long n)方法读取。 l 标准输出 public static final PrintStream out 使用print()和println()来输出。 l 标准错误输出 public static final PrintStream err SISE Java语言程序 设计实用教程 q文件操作 SISE Jav
5、a语言程序 设计实用教程 File类(p298,图11-7) l File类的实例代表磁盘文件的对象 l File类只是描述文件对象的属性,包括获取 文件的大小、是否读写、文件路径、文件清 单列表、新建目录等 q目录被作为一种文件来处理 qFile类并不是文件流类,它不能从文件读 取数据或向文件写入数据 SISE Java语言程序 设计实用教程 例:创建一个目录(P299 的创建目录方法有误) File file=new File(e:LeadWay); boolean a = file.mkdir(); if(a = true) System.out.println(创建成功); else
6、System.out.println(失败); SISE Java语言程序 设计实用教程 例:查看一个目录下的文件 File file = new File(目录); 1. String fileName = file.listfile.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(fileN
7、amei); SISE Java语言程序 设计实用教程 文件的顺序访问 引入“java.io”包,import java.io.*; 根据数据源和输入输出的任务建立字节或字符 流。 若需要对字节或字符信息组织加工,位数据在 已建字节或字符流对象上建立数据流或缓冲流。 用输入输出流对象的成员方法进行读/写操作, 需要时可设置指针位置。 关闭流对象。2-5要考虑异常处理。 SISE Java语言程序 设计实用教程 文件输入输出字节流 创建FileInputStream类对象; 读取文件信息; 创建FileOutputStream类对象; 向输出流写信息: q void write(int b);
8、void write(byte b ); q void write( byte b ,int off,int len); 关闭FileInputStream流。 SISE Java语言程序 设计实用教程FileInputStream的read方法 FileInputStream可以使用可以使用read()方法一次读入一个字节方法一次读入一个字节,并以并以int 类型返回,或者是使用类型返回,或者是使用read()方法时读入至一个方法时读入至一个byte数组,数组,byte数数 组的元素有多少个,就读入多少个字节组的元素有多少个,就读入多少个字节.在将整个文件读取完成或 写入完毕的过程中,这么一
9、个byte数组通常被当作缓冲区,因为这 么一个byte数组通常扮演承载数据的中间角色. public int read(byte b, int off, int len) 从此输入流中将最多len个字节的数据读入一个字节数组中。参数: b - 存储读取数据的缓冲区。 off - 数据的起始偏移量。 len - 读取的最大字节数。 返回:读入缓冲区的字节总数,如果因为已经到达文件末尾而没有 更多的数据,则返回 -1。 SISE Java语言程序 设计实用教程 FileOutputStream的构造方法 lFileOutputStream默认会以新建文件的方式来开启流.如果 指定的文件名称已经存在
10、,则原文件会被覆盖;如果想以附 加的模式来写入文件,则可以在构建FileOutputStream实例 时指定为附加模式.例如: FileOutputStream fileOutputStream = new FileOutputStream(args1,true); l构建方法的第二个append参数如果设定为true,在开启流时 如果文件不存在则会新建一个文件,如果文件存在就直接开 启流,并将写入的数据附加至文件末端. SISE Java语言程序 设计实用教程 例:使用文件输入输出字 节进行文件拷贝方法 public static void main(String args) try byt
11、e buffer = new byte1024; / 来源文件 FileInputStream fileInputStream = new FileInputStream(new File( args0); / 目的文件 FileOutputStream fileOutputStream = new FileOutputStream(new File( args1); / available()可取得未读取的数据长度 System.out.println(复制文件: + fileInputStream.available() + 字 节); SISE Java语言程序 设计实用教程例:使用文件
12、输入输出字节 方法(续1) while (true) if (fileInputStream.available() 1024) / 剩余的数据比1024字节少 / 一位一位读出再写入目的文件 int remain = -1; while (remain = fileInputStream.read() != -1) fileOutputStream.write(remain); break; else / 从来源文件读取数据至缓冲区 fileInputStream.read(buffer); / 将数组数据写入目的文件 fileOutputStream.write(buffer); SISE
13、 Java语言程序 设计实用教程 例:使用文件输入输出字节 方法(续2) / 关闭流 fileInputStream.close(); fileOutputStream.close(); System.out.println(复制完成); catch (ArrayIndexOutOfBoundsException e) System.out.println(using:java FileStreamDemo src des); e.printStackTrace(); catch (IOException e) e.printStackTrace(); SISE Java语言程序 设计实用教程
14、 例:使用文件输入输出字节 方法的说明 l程序中示范了两个read()方法,每次读取之后,读取的光标都会往前 进,如果读不到数据刚返回.: 一个方法可以读入指定长度的数据至数组 另一个方法一次可以读入一个字节. l使用available()方法可以获得还有多少字节可以读取. l除了使用File来建立FileInputStream,FileOutputStream的实例之外, 也可以直接使用字符串指定路径来建立.如: /来源文件 FileInputStream fileInputStream = new FileInputStream(args0); /目的文件 FileOutputStream
15、 fileOutputStream = new FileOutputStream(args1); SISE Java语言程序 设计实用教程 文件输入输出字符流 l 上面的FileInputStream使用字节读取文件,字 节流不能直接操作Unicode字符,所以Java 提供 了字符流. l 由于汉字在文件中占用2 个字节,如果使用字节 流,读取不当会出现乱码现象,采用字符流就可 以避免这个现象,因为,在Unicode 字符中,一个 汉字被看作一个字符. SISE Java语言程序 设计实用教程 文件输入输出字符流(P300,例11-2) l FileReader和FileWriter是Inp
16、utStreamReader 和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); SISE Java语言程序 设计实用教程 文件的随机访问 l 输入流FileInputStream和输出流 FileOutputStream,实现的 是对磁盘文件的顺序读写,
17、而且读写要分别创建不同对象。相 比之下RandomAccessFile类则可对文件实现随机读写操作。 l 使用下列构造方法创建流,使用路径名的字符串或使用File类 的对象作为参数, mode的取值为”r”或”rw” : qRandomAccessFile(String name,String mode); qRandomAccessFile(File name,String mode); l RandomAccessFile对象操作一个文件时,能够在指定的位 置以原始数据类型原始数据类型读取或写入数据,例: q当写入一个int类型的值时,四个字节的数据输出到文件 q当读取一个double类型
18、的值时,8个字节的数据从文件输入 SISE Java语言程序 设计实用教程 RandomAccessFile对象的 指针规律 l 新建RandomAccessFile对象的文件位置指针 位于文件的开头处; l 每次读写操作之后,文件位置的指针都相应后 移到读写的字节数; l 可以通过getFilePointer方法来获得文件当前 指针的位置,默认为0 l 通过seek方法来设置文件指针的位置。 SISE Java语言程序 设计实用教程 RandomAccessFile的其它方法 (P301,例11-3) l Int read( )从文件当前位置读取一个字节 l int read (byteb)
19、 l int read (byteb,int off,int len) l Final char readChar( )从文件中读取2个字节 l Final int readInt( )从文件中读取4个字节 l Final String readLine( )从文件中读取一行后转为String l Void write(byteb)将字节数组B中的数据写到文件中 l Void write(byteb,int off,int len)将 len 个字节从指定字节数组写入到 此文件,并从偏移量 off 处开始 l Void write(int b)将指定的数据写到文件中。 l Final void
20、 writeChar(int v)将char值按2个字节写入到文件中 l Final void writeChars(String s)将字符串按字符方式写入到文件中 l Final void writeInt(int v)按四个字节将 int 写入该文件,先写高字节 l SISE Java语言程序 设计实用教程SequenceInputStream类 l SequenceInputStream类表示将其他输入流的 逻辑串联。它从输入流的有序集合开始,并从 第一个输入流开始读取,直到到达文件末尾, 接着从第二个输入流读取,依次类推,直到到 达包含的最后一个输入流的文件末尾为止。 l Seque
21、nceInputStream的构造器使用,一对输 入流或者一个输入流的枚举作为参数: qSequenceInputStream(InputStream first,InputStream second) qSequenceInputStream(Enumeration streamEnum) SISE Java语言程序 设计实用教程 Enumeration接口 l 提供了枚举集合对象中所有对象的功能。为一 个快要过时的接口,枚举时建议使用Iterator。 l hasMoreElements()方法用来判断Enumeration 接口中是否还有元素,返回一个boolean值。 l 实现一下P3
22、03的例11-4 SISE Java语言程序 设计实用教程 q输入输出流的典型操作 SISE Java语言程序 设计实用教程 典型的几种输入输出流 l 节点流:读或者写到特定位置(如磁盘文件、内存或网 络)的输入输出流。 qFileInputStream和FileOutputStream是读入或写出数据到磁盘 文件的节点流 qByteArrayInputStream和ByteArrayOutputStream是读入或写 出数据到内存的结点流 qObjectInputStream和ObjectOutputStream是读入或写出数据 到网络的节点流 l 过滤流:从一个流读入数据,然后写到另一个流
23、。本质本质 是建立在已存在的流之上,通过对数据的处理提供较是建立在已存在的流之上,通过对数据的处理提供较 强大的读写功能强大的读写功能。过滤流又可细分为缓冲流、转换流、 数据流、打印流、对象流等 SISE Java语言程序 设计实用教程 标准键盘的输入处理 l System.in是InputStream类型,直接以字节流的方式读 入数据 l 需要以字符流的方式时,需要将字节流转换为Unicode 字符流。可以使用InputStreamReader类完成这样的功 能。 l 为了提高效率,将键盘输入的数据读到将键盘输入的数据读到 BufferedReader类的对象中,实现缓冲功能,例如:类的对象
24、中,实现缓冲功能,例如: l BufferedReader reader = new BufferedReader(new InputStreamReader(System.in); SISE Java语言程序 设计实用教程 缓冲类的使用举例 public static void main(String args) try / 缓冲System.in输入流 BufferedReader bufReader = new BufferedReader( new InputStreamReader(System.in); / 缓冲FileWriter字符输入流 BufferedWriter bufw
25、riter = new BufferedWriter(new FileWriter( args0); String input = null; / 每读一次进行一次写入动作 while (!(input = bufReader.readLine().equals(quit) bufwriter.write(input); / newline()方法写入与操作系统相依的换行字符 bufwriter.newLine(); bufwriter.flush(); bufwriter.close(); SISE Java语言程序 设计实用教程 缓冲类的使用举例(续) catch (ArrayIndexO
26、utOfBoundsException e) System.out.println(没有找到指定文件); catch (IOException e) e.printStackTrace(); SISE Java语言程序 设计实用教程 实现P304,例11-5说明 l 若想对InputStream和OutputStream进行字符处理, 可以使用java.io.InputStreamReader和 java.io.OutputStreamWriter为其加上字符处理的功 能,它们分别为Reader和Writer的子类 l 举个例子来说,若想要显示纯文本文件的内容,不不 用费心地自行判断字符编码用
27、费心地自行判断字符编码,只要将InputStream、 OutputStream的实例作为构建InputStreamReader、 OutputStreamWriter时的变量,就可以操作 InputStreamReader和OutputStreamWriter来进行文 本文件的读取,让它们为您做字符判断与转换的动 作 SISE Java语言程序 设计实用教程 q网络服务 SISE Java语言程序 设计实用教程 客户/服务器体系结构 l 在设计上把数据的表示与其内部的处理和存储分开 q客户端请求服务,服务器提供服务 q客户发送的请求由网络发送给服务器,服务器响应 请求处理完毕后,其结果经过网
28、络发送给客户端。 q一个服务器可以给多个客户端提供服务。 l 浏览器和Web服务器就是典型的客户/服务器结构 (P1191,图11-9) q浏览器发出浏览某个网址网页的请求 qWeb服务器将HTML网页发送给客户端浏览器 SISE Java语言程序 设计实用教程 通信协议 l计算机之间的通信,如同人与人之间的交流, 需要双方遵守相应的语言规则 qTCP/IP:传输控制协议,用于不可靠的互联网 上提供可靠的端到端的字节流通信。其中TCP用 于传输层,需要确定端口号;IP用于网络层,需 要确定IP地址。一个网络服务器是通过一个网络服务器是通过IP地址和地址和 端口号访问的端口号访问的。 qUDP:
29、面向非连接的用户数据包协议,它提供了 发送封装的原始IP数据报的方法,并且发送时无 需建立连接 SISE Java语言程序 设计实用教程 Internet 服务服务 端口号Internet 服务 端口号 FTP21WWW80 TELNET23NNTP119 DNS53POP3110 (备注: NNTP-网络新闻传输协议) 常见的一些常见的一些internet 服务对应的端口号服务对应的端口号 SISE Java语言程序 设计实用教程 l所谓Socket通常也称为”套接字”,由IP地址和端 口号有两部分组成,应用程序通过“套接字”所提 供的一组API向网络发出请求或者应答网络请求。 l Serv
30、erSocket类和Socket类位于包中。 ServerSocket类用于服务器建立监听套接字, Socket类用于客户机建立套接字对象进行通信。 l例如,把套接字连接想象为一个 呼叫,当呼叫 完成后,谈话的任何一方都可以随时讲话。但是在 最初建立呼叫时,必须有一方呼叫,而另一方则监 听铃声。这样,呼叫的一方为“客户”,负责监听 的一方是“服务器”。 套接字套接字 SISE Java语言程序 设计实用教程 l客户机/服务器(C/S)模式是在网络应用程序中 最常用的通信模式。 l在C/S模式通信过程中主动发起通信的一方被称 为客户机,而监听并接受请求进行通信的一方成为 服务器。服务器使用Ser
31、verSocket监听指定的端口, 端口可以随意指定(由于1024以下的端口通常属 于保留端口,所以一般使用大于1024的端口), 等待客户端连接请求,客户端连接后,会话产生, 在完成会话后,关闭连接。 客户机客户机/服务器(服务器(C/S)模式的原理)模式的原理 SISE Java语言程序 设计实用教程 l创建服务器端ServerSocket,设置建立连接的端口号。 l创建客户端Socket对象,设置绑定的主机名或IP地址, 指定连接端口号。 lServerSocket类的accept方法使服务器处于阻塞状态, 等待用户请求 l客户机Socket发起连接请求。 l建立连接 l取得InputS
32、tream和OutputStream。 l利用InputStream和OutputStream进行数据传输。 l关闭Socket和ServerSocket。 利用利用Socket方式进行数据通信与传输的主要步骤方式进行数据通信与传输的主要步骤 SISE Java语言程序 设计实用教程 创建服务器创建服务器(端口号端口号) 定义数据成员定义数据成员 服务器等待服务器等待 网络连接网络连接 建立建立socket流流 读客户读客户 端信息端信息 向用户发出一个字符串向用户发出一个字符串 创建创建Socket实例实例 定义数据成员定义数据成员 建立建立socket流流 读读socket流流 (接收并显
33、示接收并显示) 送用户名给送用户名给 服务器服务器 关闭流关闭流 waiting for user 1111 1111 login: connetcting client. java 提示用户登录成功提示用户登录成功 读读socket流流User :java Login successful SISE Java语言程序 设计实用教程 Socket中的成员方法 l 构造方法构造方法 l getInputStream(): 返回该返回该socket所对应的输入所对应的输入 流流 l getOutputStream():返回该返回该socket所对应的输出所对应的输出 流流 SI
34、SE Java语言程序 设计实用教程 构造方法功能说明 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,则是采用
35、流式通信方式) Socket(String host,int port)使用指定主机和端口创建一个Socket对象 Socket(String host,int port,boolean stream) 使用指定主机和端口创建一个Socket对象(若布尔数值为 true,则是采用流式通信方式) ServerSocketServerSocket类类/Socket/Socket类的构造方法类的构造方法 SISE Java语言程序 设计实用教程ServerSocket对象和Socket对象 (1)创建一个ServerSocket对象就创建了一个监听服务,例 如要创建一个指定端口的ServerSocket对象。 ServerSocket Listen=new ServerSocket(4321); 设置指定的监听端口4321,由于一台服务器可以监听多 台客户机,而对于不同的服务请求之间是根据端口号来区别 的。 (2)创建一个Socket对象用于与服务器建立链接,使用指 定的端口号使得服务器在捕获到客户端的请
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 素养导向的高考数学新题型2课件-2025届高三数学二轮复习
- 税务局考试申论题目及答案
- 2026二年级数学下册 数学广角自主学习
- 2026五年级数学上册 小数乘法的价值引领
- 2026五年级数学上册 小数乘法的文化传承
- 2026九年级上语文孤独之旅人物形象分析
- 供应商质量追责制度
- 管理评审程序试题及答案
- 人格权合理使用制度
- 造价咨询考核奖惩制度
- 2026年安庆医药高等专科学校单招职业适应性测试题库含答案详解(b卷)
- 湖北省云学名校联盟2025届高三年级2月联考物理(含答案)
- 2026年安徽工贸职业技术学院单招职业技能考试题库及答案详解(基础+提升)
- 2026云南德宏州瑞丽市人民法院招聘聘用制书记员2人考试参考试题及答案解析
- (一模)2026年深圳市高三年级第一次调研考试数学试卷(含官方答案及解析)
- 2026年春季小学湘美版(2024)二年级下册美术教学计划、教案及每课教学反思(附目录)
- 2026年亳州职业技术学院单招职业技能测试题库及答案详解(基础+提升)
- GB/Z 149-2026天然食品成分使用指南
- 2026年春人教PEP版(新教材)小学英语四年级下册教学计划及进度表
- 高速公路危化品救援课件
- 除颤仪使用课件
评论
0/150
提交评论