第5章 输入输出流和异常
第5章输入输出及异常处理(4)精品PPT课件
30
总结 续
• Writer BufferedWriter PrintWriter OutputStreamWriter为字符输出流。
– Writer 是所有字符输出流的父类,它封装了通用的 写操作。
9
1.2 Writer (2)
10
1.2 Writer(3)
11
2. 和
• 2.1 ——文件字符输入流 • 2.2 ——文件字符输出流
13
2.1 ——文件字符输入流
的源处为文件,数据由文件向程序按字符 流动的文件字符输入流。可用于读取文本 文件内容。
14
2.1 ——文件字符输入流 (1)
这两个类是字节流通向字符流桥梁。 InputStreamReader可将一个字节输入流转换成字符 输入流 OutputStreamWriter可将一个字节输出流转换成字 符输出流
28
构造方法
练习:编写一个回声程序,字符窗口输入一行, 紧接着显示该行。直到直接在新行敲入回车为止。
分析:字符窗口的标准输入设备流为 System.in,它是一个InputStream,可用 InputStreamReader把它转为字符流Reader, 再由BufferedReader包装,便可直接按行读取。
节点流的读写方法比较简单,不适合复杂的操作。 Java中有一些流专门对节点流进行包装,这些流 称为过滤流,它们通常有更丰富的读写方法。
• 3.1 PrintWriter • 3.2 BufferedReader和BufferedWriter • 3.3 InputStreamReader和OutputStreamWriter
第5章 输入输出流和异常 面向对象程序设计 Java 教学课件
bis = new BufferedInputStream(new FileInputStream(filename));
} catch (Exception e ) { }//异常结构在本章的后面中介绍
}
}
public String readaline(){ //从输入流中读入一行字符
return (null); //此处为预留功能,后面将添加具体实现
数据宿相连
8
• 5.2.2 输入5输.2出输流类入层输次出流
InputStream
FileInputStream PipedInputStream FilterInputStream
ByteArrayInputStream
SequenceInputStream
StringBufferInputStream
bos = new BufferedOutputStream(System.out); //建立缓冲 区屏幕输出流对象 else { try {//异常结构在本章的后面中介绍
//建立缓冲区文件输出流对象 bos = new BufferedOutputStream(new FileOutputStream(filename)); } catch (Exception e ) { }//异常结构在本章的后面中介绍 } } public void writealine(String s) { }//向输出流中写入一行字符14 public void close() { } //关闭输出流
5.2 输入输出流
例5-3,trans程序的的main方法:
public class trans {
public static void main(String[] args) {
第5章 输入输出流和异常
5.1问题的提出与分析
问题的分析
CharToUnicode类:用于将一个字符串中的字符转 换成Unicode编码,由其中的convert()方法实现 FormatException FormatException类:用户自定义异常,用于捕获 Unicode编码中出现的非数字字符.
SequenceInputStream
StringBufferInputStream
字节输入流类的层次关系
InflateInputStream
ProgressMonitorInputStream
《解析Java程序设计》--第5章
9
5.2 输入输出流
5.2.2 输入输出流类层次
FileOutputStream PipedOutputStream FilterOutputStream OutputStream
《解析Java程序设计》--第5章
13
5.2 输入输出流
一个封装了缓冲输出流的类: 例5-2,一个封装了缓冲输出流的类:sink 一个封装了缓冲输出流的类 import java.io.*; class sink { private BufferedOutputStream bos; public sink(String filename){ //构造方法 构造方法 //判断是否向屏幕写 判断是否向屏幕写 if (filename.toLowerCase().compareTo("stdout")==0) bos = new BufferedOutputStream(System.out); //建立缓冲区屏幕输出流对象 建立缓冲区屏幕输出流对象 else { try {//异常结构在本章的后面中介绍 异常结构在本章的后面中介绍 //建立缓冲区文件输出流对象 建立缓冲区文件输出流对象 bos = new BufferedOutputStream(new FileOutputStream(filename)); } catch (Exception e ) { }//异常结构在本章的后面中介绍 异常结构在本章的后面中介绍 } } public void writealine(String s) { }//向输出流中写入一行字符 向输出流中写入一行字符 public void close() { } //关闭输出流 关闭输出流 }
第5章 数字信号的输入与输出
第五章数字信号的输入与输出智能仪器的信息输入、输出,可以分为数字量与模拟量。
数字量的输入输出相对较简单,对于模拟量的输入,一般信号都比较微弱,需要放大,A/D转换等。
一、常见的数字信号数字量输入信号:开关、按钮,数字式传感器,方波信号,正弦波信号等。
数字量输出:LED显示、指示灯、液压阀、继电器控制、步进电机控制等。
二、数字量信号的输入特点:1、信号的放大与变换,对于许多数字信号,是信号很弱的周期性信号,如正弦信号,三角波信号。
而输入单片机或微机中的信号一般有一定的电压幅值要求。
如光栅输出的信号就很小的正弦波。
常用的方法,先放大,然后处理。
当电压较高时,也不能直接输入,需要进行分压。
如图所示:2、隔离,对于一些输入信号,由于波动等,很容易对系统产生影响,需要采取隔离输入,常见的是光电隔离。
下图为光耦合器的结构与特性图4-16光耦合器结构与特性a)耦合器结构b)输入特性c)输出特性3、缓冲驱动,为了提高信号的驱动能力,改善信号性能,经常在输入单片机或微机前加一级缓冲,常用的是74HC244等。
4、安全保护,当输入电压变大到一定量时,会对系统造成破坏,因此,对于输入信号变化较大的情况,需要考虑安全保护。
常用稳压二极管等。
5、开关信号输入单片机中的常见方法:按键信号TLP-521-4是4路光耦,光耦前要接限流电阻,不同的光耦由于允许电流不同,限流电阻也不同。
进入单片机前,一般加驱动器74LS244。
三、数字信号的输出1、输出信号的几个问题1)功率匹配问题,单片机或微机的输出信号功率较小,要驱动不同的负载,要求的功率不同,电压不同,所以在在输出驱动时,首先关心输出的电压与功率。
如驱动发光二极管,正向电压为2-2.5V,最大电流为2-20mA,对于AT89C51,I/O口的最大灌电流10mA,因此可以直接驱动发光二极管。
8mA,则:R=(5-2.2)/0.008=350(Ω)因此R一般选取200Ω-500Ω。
第5章 过程通道
过程输入输出通道示意图
过程输入输出通道与CPU CPU交换的信息类型 三 过程输入输出通道与CPU交换的信息类型
过程输入输出通道与CPU交换的信息类型有三种: 过程输入输出通道与CPU交换的信息类型有三种: CPU交换的信息类型有三种 数据信息: 1.数据信息:反映生产现场的参数及状态的信 它包括数字量、开关量和模拟量。 息,它包括数字量、开关量和模拟量。 2.状态信息:又叫协议信息,如应答信息、握手信 状态信息:又叫协议信息,如应答信息、 它反映过程通道的状态,如准备就绪信号。 息,它反映过程通道的状态,如准备就绪信号。 3.控制信息:用来控制过程通道的启动和停止等 控制信息: 信息,如三态门的打开和关闭、 信息,如三态门的打开和关闭、触发器的启动 等。 注意: 在过程输入输出通道中, 必须设置一个与CPU CPU联 注意 : 在过程输入输出通道中 , 必须设置一个与 CPU 联 系的接口电路,传送数据信息、状态信息和控制信息。 系的接口电路,传送数据信息、状态信息和控制信息。
ቤተ መጻሕፍቲ ባይዱ
2、采用保持器 2.1 概述 问题: 问题: 转换时, 模拟信号进行 A/D 转换时,从启动转换到 转换结束输出数字量,需要一定的转换时间, 转换结束输出数字量,需要一定的转换时间, 当输入信号频率较高时, 当输入信号频率较高时,会造成很大的转换 误差。 误差。
解决方法: 采用一种器件,在A/D转换时保持住输入 解决方法: 采用一种器件, 信号电平, 信号电平,在A/D转换结束后跟踪输入信 号的变化。 号的变化。 这种功能的器件就是采样/保持器。 这种功能的器件就是采样/保持器。
第五章 过程输入输出通道
第1节 过程通道的概念
一 过程通道的概念
计算机 r 给定值 控制器 D/A
《微型计算机系统原理及应用》课后答案_(第3版)清华大学出版社__杨素行
第一章 微型计算机基础题1-1 计算机发展至今,经历了哪几代?答:电子管计算机、晶体管计算机、集成电路计算机、超大规模集成电路计算机、非冯诺伊曼计算机和神经计算机。
题1-2 微机系统由哪几部分组成?微处理器、微机、微机系统的关系是什么? 答:1、微机系统分硬件和软件,硬件包括CPU、存储器、输入输出设备和输入输出接口,软件包括系统软件和应用软件。
2、微处理器是指微机的核心芯片CPU;微处理器、存储器和输入输出设备组成微机;微机、外部设备和计算机软件组成微机系统。
题1-3 微机的分类方法包括哪几种?各用在什么应用领域中?答:按微处理器的位数,可分为1位、4位、8位、32位和64位机等。
按功能和机构可分为单片机和多片机。
按组装方式可分为单板机和多板机。
单片机在工业过程控制、智能化仪器仪表和家用电器中得到了广泛的应用。
单板机可用于过程控制、各种仪器仪表、机器的单机控制、数据处理等。
题1-4 微处理器有哪几部分组成?各部分的功能是什么?答:微处理器包括运算器、控制器和寄存器三个主要部分。
运算器的功能是完成数据的算术和逻辑运算;控制器的功能是根据指令的要求,对微型计算机各部分发出相应的控制信息,使它们协调工作,从而完成对整个系统的控制;寄存器用来存放经常使用的数据。
题1-5 微处理器的发展经历了哪几代?Pentium系列微处理器采用了哪些先进的技术?答:第一代4位或低档8位微处理器、第二代中高档8位微处理器、第三代16位微处理器、第四代32位微处理器、第五代64位微处理器、第六代64位高档微处理器。
Pentium系列微处理器采用了多项先进的技术,如:RISC技术、超级流水线技术、超标量结构技术、MMX技术、动态分支预测技术、超顺序执行技术、双独立总线DIB技术、一级高速缓冲存储器采用双cache结构、二级高速缓冲存储器达256KB或512KB、支持多微处理器等。
题1-6 何为微处理器的系统总线?有几种?功能是什么?答: 系统总线是传送信息的公共导线,微型计算机各部分之间是用系统总线连接的。
标准输入输出流
标准输入输出流标准输入输出流(Standard Input/Output Stream)是计算机程序中常用的一种输入输出方式,它是程序与外部环境进行数据交换的重要方式。
在大多数编程语言中,都有对标准输入输出流的支持,比如在C语言中,可以使用stdio.h库中的函数来进行标准输入输出操作。
在本文中,我将介绍标准输入输出流的基本概念、使用方法和一些常见的应用场景。
标准输入流(stdin)是程序从键盘或其他输入设备读取数据的流,而标准输出流(stdout)则是程序向屏幕或其他输出设备输出数据的流。
这两个流在程序运行时都是默认打开的,可以直接使用,不需要额外的操作。
除了标准输入输出流之外,还有标准错误流(stderr),用于输出程序的错误信息。
在C语言中,可以使用printf函数向标准输出流输出数据,使用scanf函数从标准输入流读取数据。
比如:```c。
int num;printf("Please input a number: ");scanf("%d", &num);printf("The number you input is: %d\n", num);```。
上面的代码中,printf函数将提示用户输入一个数字,然后使用scanf函数从标准输入流读取用户输入的数字,并使用printf函数将其输出到标准输出流。
除了C语言之外,其他编程语言也都提供了类似的标准输入输出流操作方式。
比如在Python中,可以使用input函数获取用户输入,使用print函数输出数据。
在Java中,可以使用System.in和System.out来进行标准输入输出操作。
标准输入输出流在实际应用中有着广泛的用途。
比如在命令行程序中,通常会使用标准输入输出流来与用户进行交互;在网络编程中,可以使用标准输入输出流来进行数据的读写;在文件处理中,可以使用标准输入输出流来进行文件的读写操作。
C语言的输入输出流
C语言的输入输出流C语言作为一种面向过程的编程语言,其输入输出流(Input/Output Stream)是非常重要的概念。
输入输出流允许我们在程序中与用户交互,从用户处接收输入并向用户展示输出。
本文将探讨C语言中的输入输出流相关的概念和函数,以及如何在程序中使用它们。
一、标准输入流(stdin)、标准输出流(stdout)和标准错误流(stderr)C语言中,有三个预定义的输入输出流,分别是标准输入流(stdin)、标准输出流(stdout)和标准错误流(stderr)。
它们分别被定义为文件指针,可以通过它们来进行输入和输出操作。
1. 标准输入流(stdin)标准输入流(stdin)用于从用户处接收输入。
在C语言中,我们可以使用`scanf()`函数来从标准输入流读取输入数据。
```c#include <stdio.h>int main() {int num;printf("请输入一个整数:");scanf("%d", &num);printf("您输入的整数是:%d\n", num);return 0;}```在这个例子中,`scanf()`函数用于从标准输入流(stdin)中读取一个整数,并将其存储到变量`num`中。
然后,我们使用`printf()`函数将输入的整数输出到标准输出流(stdout)上。
2. 标准输出流(stdout)标准输出流(stdout)用于向用户展示输出。
在C语言中,我们可以使用`printf()`函数向标准输出流打印输出。
```c#include <stdio.h>int main() {printf("Hello, world!\n");return 0;}```在这个例子中,`printf()`函数用于向标准输出流(stdout)打印字符串"Hello, world!",并在字符串的末尾添加一个换行符。
第5章液晶显示器高压板电路的故障分析与维修
(b) 检测控制模块启动脚是否有启动电平输入
(a)检查积分电路元件
(b) 积分电路原理图
第3步 检修集成场效应功率管
用万用表直流50V电压档位检测集成场效应功率管U302的供电引 脚S2的电压是否为+12V,如果无+12V输入,则检测+12V供电回路。 再用万用表R×10Ω档检测集成场效应管内部是否击穿。
(a)封装外形图
(b) 原理图符号
② 电流检测线圈的检测
用万用表的红黑两只表笔分别检测线圈绕组的的电阻值,正常时的电 阻值约250Ω,如果电阻值为零或无穷大,则说明电流检测线圈内部有 短路现象或开路。
检测 线圈
(a) 第1组线圈绕组的检测
检测 线圈
(b) 第2组线圈绕组的检测
5.2 高压板电路的工作原理
高压板常见的故障主要是无高压输出(显示屏表现为黑屏)、 开机有高压输出随后高压消失和输出高压大小偏低等。造成高压板 电路的原因是电源供电电路工作不正常、PWM控制模块损坏、集 成场效应功率管击穿、高压输出电路工作不正常及过流、稳压电源 异常等。
5.4.2 高压板无高压输出的故障维修
具体检修步骤如下:
检修PWM控制模块
5.4.3显示器画面暗或亮一下就变暗的故障检修
具体检修步骤如下:
第1步 检修高压板启动电路 用万用表直流10V电压档监测FAN7318PWM控制模块第8脚启动信 号是否正常,如果不正常,说明启动电路有故障或主控电路把输出的 启动信号不正常,可检查启动回路元件
检测启 动电平 信号
检测启 动电路 元件
(a)插座元件面
(b) 插座焊接面
② 贴片三极管的检测
检测集电结和发射结的单向导电性
输入输出流
PPT文档演模板
输入输出流
2.3 查询文件属性
String s="e:"+File.separator+"Thread1.java"; File file=new File(s); String exists = file.exists() ? "Yes" : "No"; String canRead = file.canRead() ? "Yes" : "No"; String canWrite = file.canWrite() ? "Yes" : "No"; String isFile = file.isFile() ? "Yes" : "No"; String isHid = file.isHidden() ? "Yes" : "No"; String isDir = file.isDirectory() ? "Yes" : "No"; String isAbs = file.isAbsolute() ? "Yes" : "No";
PPT文档演模板
输入输出流
P261, 例4 Example20_4 TextArea text; BufferedReader in; Button button; FileReader file; EWindow() {
super("流的读取"); text=new TextArea(10,10); text.setBackground(Color.cyan); try { File f=new File("E:\\lanhong\\", "a.txt");
《计算机组成原理》第五章知识点
知识点1、输入输出系统的组成:I/O软件(I/O指令、通道指令)、I/O硬件2、I/O设备与主机的联系方式:I/O设备编址方式、设备寻址、传送方式、联络方式、I/O 设备与主机的连接方式(1)I/O设备编址方式:①统一编址:将I/O地址看做是存储器地址的一部分,用取数、存数指令②不统一编址:I/O地址和存储器地址是分开的,所有I/O设备的访问必须有专门的I/O指令(2)设备寻址可由I/O指令的设备码字段直接指出该设备的设备号。
通过接口电路中的设备选择电路,便可选中要交换信息的设备。
(3)传送方式:并行、串行(4)联络方式:①立即响应方式:用于一些工作速度十分缓慢的I/O设备②异步工作采用应答信号联络:用于I/O设备与主机工作速度不匹配时。
③同步工作采用同步时标联络:要求I/O设备与CPU工作的速度完全同步。
3、I/O设备与主机的连接方式(1)辐射式连接方式:要求每台I/O设备都有一套控制线路和一组信号线,因此所用器件和连线较多,对I/O设备的增删比较困难(2)总线连接方式:便于增删设备,被大多数现代计算机所采用4、I/O设备与主机信息传送的控制方式(1)程序查询方式:是由CPU通过程序不断查询I/O设为被是否已经做好准备,从而控制I/O设备与主机交换信息。
要求I/O接口内设置一个能反映I/O设备是否准备就绪的状态标记,CPU通过对此标记的检测,可得知I/O设备的准备情况,从而终止了原程序的执行。
CPU反复查询的过程犹如就地“踏步”。
(串行)CPU工作效率不高。
(2)程序中断方式:CPU在启动I/O设备后,不查询设备是否已经准备就绪,继续执行自身程序,只是当I/O设备准备就绪并向CPU提出中断请求后才予以响应,大大提高了淳朴的工作效率。
CPU执行程序与I/O设备做好准备是同时进行的,CPU资源得到了充分的利用。
(3)DMA方式(直接存储器存取方式:主存与I/O设备之间有一条数据通路,交换信息是,无须调用中断服务程序。
第5章基本输入输出系统
第5章基本输入输出系统【教学目的】掌握接口的基本概念、IO端口的编址方法和基本的数据传送方式【教学重点】IO端口的编址方法和基本的数据传送方式【教学难点】中断方式和DMA方式【教学方法和手段】课堂教学【课外作业】P193习题3,4,7,10【学时分配】6学时【自学内容】8237的使用【讲授内容】5.1 概述输入输出系统包括:①外部设备(输入输出设备和辅助存储器)②设备控制器----主机(CPU和存储器)之间的控制部件,诸如磁盘控制器、打印机控制器等,有时也称为设备适配器或接口,其作用是控制并实现主机与外部设备之间的数据传送。
5.1.1接口的基本概念1、什么是接口计算机在工作过程中,CPU要不断地与其它部件交换信息。
CPU不是直接与外部设备交换信息的,而是经过一个中间电路,这个电路就称为“接口电路”,简称“接口”。
所谓接口就是主机与外部设备连接的桥梁,由它来完成CPU与外部设备之间信息的传递。
一般将外部设备与接口合称为“I/O系统”。
接口又称为“设备控制器”或“适配器”。
2、为什么要有接口电路外部设备为什么要通过接口电路与CPU连接?为什么不直接与CPU的总线相连接呢?从CPU的角度来看,对外部设备的访问(读/写)与对存储器的访问是类似的,为什么存储器可以直接通过总线与CPU连接,而外部设备却要通过接口电路来与CPU连接呢?这是因为:存储器的基本结构简单(只有很少几种),只要求几个简单的控制信号,而且存储器的访问速度一般都比较快,CPU与存储器之间的定时与协调比较容易,因此存储器可以直接通过总线与CPU连接。
而外部设备一般具有以下特点:⑴外部设备的品种繁多从类型上看:有输入设备、输出设备、输入/输出设备、测量设备、通信设备、控制设备等。
从结构上看:有机械式的、电子式的、机电混合式的。
从原理上看:各类设备的工作原理又是各不相同的。
⑵外部设备的工作速度分布范围宽如:电传打字机每秒能传输100个信息单位,温度传感器有可能长达几分钟才改变一个数据,软盘的传输速率为每秒2.5兆位,硬盘的传输速率为每秒5兆位以上。
第五章 输入输出及异常处理
一、流和文件
文件 Java语言简单地把每个文件都视为一个顺 序字节流,每个文件或者结束于一个文件结束 标志,或者根据系统维护管理数据中所记录的 具体字节数来终止。当一个文件打开时,一个 对象就被创建,同时一个流和该对象关联。
第1字节 第2字节 第3字节 …… 第n-1字节 文件结束符
二、常用流类
二、常用流类
3. FileInputStream(文件输入流 文件输入流) 文件输入流
FileInputStream类创建一个能从文件读取字节的InputStream类,它 的两个常用的构造函数如下: FileInputStream(String filepath) FileInputStream(File fileObj) 它们都能引发FileNotFoundException异常。这里filepath是文件的 全称路径,flleObj是描述该文件的File对象。下面例子创建了两个使用 同样磁盘文件且各含一个上述构造函数的FilelnputStreams类。 FileInputStream f0=new FileInputStream("/autoexec.bat") File f=new File("/autoexec.bat"); FileInputStream f1=new FileInputStream(f);
二、常用流类
1. InputStream(输入流 输入流) 输入流
InputStream是一个定义了Java流式字节输入模式的抽象类,该类的所有方法在出 错条件下引发一个IOException异常。 int available():返回当前可读的输入字节数。 void close():关闭输入源。关闭之后的读取会产生IOException异常。 void mark(int numBytes):在输入流的当前点放置一个标记。该流在读取 numBytes个字节前都保持有效。 boolean markSupported():如果调用的流支持mark()/reset()就返回true。 int read():如果下一个字节可读则返回一个整型,遇到文件尾时返回-1。 int read(byte buffer[]):试图读取buffer.length个字节到buffer中,并返回实际成功 读取的字节数,遇到文件尾时返回-1。 int read(byte buffer[],int offset,int numBytes):试图读取buffer中从buffer[offset] 开始的numBytes个字节,返回实际读取的字节数,遇到文件尾时返回-1。 void reset():重新设置输入指针到先前设置的标志处。 long skip(long numBytes):忽略numBytes个输入字节,返回实际忽略的字节数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DataOutputStream
BufferedOutputStream
PrintStream
字节输出流类的层次关系
10
5.2 输入输出流 • 5.2.2 输入输出流类层次
BufferedReader
LineNumberReader
CharArrayReader InputStreamReader FineReader
StringWriter
PrintWriter
字符输出流类的层次关系
12
5.2 输入输出流
例5-1,一个封装了缓冲输入流的类:source import java.io.*; class source { private BufferedInputStream bis; public source(String filename) { //构造方法 //判断是否从键盘读 if (filename.toLowerCase().compareTo("stdin")==0) bis = new BufferedInputStream(System.in); //建立缓冲区键 盘输入流对象 else{ try { //异常结构,在本章的后面中介绍 //建立缓冲区文件输入流对象 bis = new BufferedInputStream(new FileInputStream(filename)); } catch (Exception e ) { }//异常结构在本章的后面中介绍 } } public String readaline(){ //从输入流中读入一行字符 return (null); //此处为预留功能,后面将添加具体实现 13 }
19
5.2 输入输出流
• 5.2.3 字节流
– 阻塞式(Blocking)读写与非阻塞式(Blocking) 读写方式 – 常用字节流
• 字节文件流:FileInputStream和 FileOutputStream • 字节缓冲区流 :BufferedInputStream和 BufferedOutputStream • 数据字节流:DataInputStream和 DataOutputStream
第5章 输入输出流和 异常
本章主要内容
• 问题的提出与分析 • 流的概念 • 字节流的分类及其常用方法 • 字符流的分类及其常用方法 • 异常的概念 • Java的异常处理机制 • 用户异常的定义和实现
2
5.1问题的提出与分析
• 问题的提出
– ASCII编码 – Unicode编码 – Unicode编码与字符之间的转换
4
5.1问题的提出与分析
• 问题的分析
– CharToUnicode类:用于将一个字符串中的 字符转换成Unicode编码,由其中的convert() 方法实现 – FormatException类:用户自定义异常,用于 捕获Unicode编码中出现的非数字字符。
5
5.1问题的提出与分析 • 用UML图描述的类之间的关系
6
5.1问题的提出与分析 • 最终程序的运行界面
7
5.2 输入输出流
• 5.2.1 流的概念
– 将输入输出过程抽象为数据流 – 数据源,数据宿 – 特性:
• 顺序性:先从数据源流出的数据一定比后流出的数 据先到达数据宿 • 单向性:数据只能从数据源流向数据宿 • 唯一性:数据流必须而且只能和一个数据源与一个 数据宿相连
5.2 输入输出流
例5-2,一个封装了缓冲输出流的类:sink import java.io.*; class sink { private BufferedOutputStream bos; public sink(String filename){ //构造方法 //判断是否向屏幕写 if (filename.toLowerCase().compareTo("stdout")==0) bos = new BufferedOutputStream(System.out); //建立缓冲 区屏幕输出流对象 else { try {//异常结构在本章的后面中介绍 //建立缓冲区文件输出流对象 bos = new BufferedOutputStream(new FileOutputStream(filename)); } catch (Exception e ) { }//异常结构在本章的后面中介绍 } } public void writealine(String s) { }//向输出流中写入一行字符 14 public void close() { } //关闭输出流
Байду номын сангаас
5.2 输入输出流
例5-3,trans程序的的main方法: public class trans { public static void main(String[] args) { //检查是否输入了三个参数,并且第三个参数只是一个字符 if ((args.length != 3) || (args[2].length() != 1)) { printInfo();//输出本程序的使用方法 System.exit(0);//结束运行 } char transmode; //用于保存命令行的第三个参数,即进行何种种转换 transmode = args[2].charAt(0); //从命令行获取第三个参数 //根据第三个参数值用不同的参数调用doTrans方法实现代编码转换 switch (transmode) { case 'U': case 'u': //将Unicode码转换成字符; System.out.println("实现Unicode码转换成字符的工作尚未完成"); doTrans(args[0],args[1],1);//调用doTrans方法将Unicode码转换成字 符; 15 break;
PushbackReader
Reader
FilterReader PipedReader StringReader
字符输入流类的层次关系
11
5.2 输入输出流 • 5.2.2 输入输出流类层次
BufferedWriter
CharArrayWriter OutputStreamWriter Writer FilterWriter PipedWriter FineWriter
5.2 输入输出流
例5-3,trans程序的的main方法(续): static void doTrans(String infile, String outfile, int flag) { String linein, lineout=""; source sin = new source(infile); //根据第一个参数构造一个输入流类 sink sout = new sink(outfile); //根据第二个参数构造一个输出流类 linein=sin.readaline(); //读入一行字符到linein中 while(linein!=null) { //如果linein不为空,则对其进行处理 if (flag == 1) { //将Unicode码转换成字符的程序将在后面实现; } else if (flag == 2) { //将字符转换成Unicode码的程序将在后面实现; } else if (flag == 0) { //实现文件复制的程序将在后面实现; } sout.writealine(lineout);//将lineout写出到输出流中 linein=sin.readaline();//读入下一行字符到linein中 } sin.close();//关闭输入流 17 sout.close();//关闭输出流 }
5.2 输入输出流
例5-3,trans程序的的main方法(续): static void printInfo() { System.out.println( "正确的格式是: java trans <数据源> <数据宿> <转换方式 >"); System.out.println("数据源可以是stdin代表键盘,或者文件 名"); System.out.println("数据源可以是stdout代表屏幕,或者文 件名"); System.out.println("转换方式可以U,代表将Unicode码转 换成字符; 或者C,代表将字符转换成Unicode码;或者N表示 不进行换"); } }
21
【例5-4】能进行字节输入流读操作的source类,源代码如下: //source.java import java.io.*; class source { private BufferedInputStream bis; public source(String filename) { //构造方法 … //与例5-1中的构造方法内容完全一样 } //从输入流中读入一行字符 public String readaline() { int c; //存放当前读入的字符 String s = new String(); //保存已读入的字符行 boolean reading = true; //控制是否继续读下一个字符 try{ //异常结构,在本章的后面中介绍 while (reading) { //循环读下一个字符直到文件结束或行结束 c =bis.read();//读取下一个字符放到c变量中 if ((c != -1) && (((char)c) !='\n')){ //是否文件或行结束 if (((char)c) !='\r') //删除可能多读取的换行符 s += (char) c; //将读取的字符加到已读取的字符最后 } else reading = false; //文件或行已结束 } } catch (Exception e) {}//异常结构在本章的后面中介绍