Java程序设计课件:单元18 流.doc

上传人(卖家):罗嗣辉 文档编号:2047167 上传时间:2022-01-21 格式:DOC 页数:15 大小:7.92MB
下载 相关 举报
Java程序设计课件:单元18 流.doc_第1页
第1页 / 共15页
Java程序设计课件:单元18 流.doc_第2页
第2页 / 共15页
Java程序设计课件:单元18 流.doc_第3页
第3页 / 共15页
Java程序设计课件:单元18 流.doc_第4页
第4页 / 共15页
Java程序设计课件:单元18 流.doc_第5页
第5页 / 共15页
点击查看更多>>
资源描述

1、单元 18 流单元目标 理解实现文件读写流的概念。 掌握文件流的分类。 掌握文件字节流常用类的使用。 掌握文件字符流常用类的使用。学习任务1.任务描述Java 源程序添加行号。编写一个程序将源文件另存为其他的文件,并为每一行代码在前面添加行号。2.运行结果知识准备18.1 流的概念File 类不负责文件的读写。类不负责文件的读写。Java 中文件读写是通过流的形式完成的。通过流能使我们能自由地控制包括文件,内存,IO 设备等等中的数据的流向。 如:可以从文件输入流中获取数据, 经处理后再通过网络输出流把数据输出到网络设备上; 或利用对像输出流把一个程序中的对象输出到一个格式流文件中,并通过网络

2、流对象将其输出到远程机器上, 然后在远程机器上利用对象输入流将对象还原。在 Java 中这些流的类都在 java.io 包中。18.2 流的分类流在 Java 中是指计算机中流动的缓冲区。从外设备流向中央处理器的数据流成为“输入流” ,反之成为输出流。Java.io 包提供处理不同类型的流类,有字节流、字符流、文件流和对象流等。其中,字节流类名以 Stream 结尾,字符流Java 源程序行号添加程序设计Java 源程序行号添加程序设计类名以 Reader 或 Writer 结尾;按数据流动的方向分为输入流(来源流)和输出流(接收流) ,输入流类名以 In 开始,输出流类名以 Out 开始。1

3、8.3 字节流InputStream 和 OutputStream 是字节流的两个顶层父类, 提供了输入流类与输出流类的通用 API。字节输入流都是 InputStream 的子类,字节输出流都是 OutputStream 的子类。18.3.1 inputStream 类InputStream 是抽象类,所有字节输入流类都直接或间接继承此类。InputStream 类的常用方法包括: int available() 返回此输入流方法的下一个调用方可以不受阻塞地从此输入流读取(或跳过)的字节数。 void close() 关闭此输入流并释放与该流关联的所有系统资源。 abstract int r

4、ead() 从输入流读取下一个数据字节。 int read(byte b) 从输入流中读取一定数量的字节并将其存储在缓冲区数组b中。 int read(byte b, int off, int len) 将输入流中最多 len 个数据字节读入字节数组。 long skip(long n) 跳过和放弃此输入流中的 n 个数据字节。InputStream 类的体系结构如下图 5-1 所示:图 5-1 InputStream 类体系结构图字节输入流类很多,这里重点介绍 FileInputStream、BufferedInputStream和 DataInputStream:1.FileInputSt

5、ream:此类用于从本地文件系统中读取文件内容。构造方法:构造方法:FileInputStream(File file):通过打开一个到实际文件的连接来创建一个FileInputStream,该文件通过文件系统中的 File 对象 file 指定。FileInputStream(String name):通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定。常用方法:常用方法:int available():返回下一次对此输入流调用的方法可以不受阻塞地从此输入流读取(或跳过)的估计剩余字节数。void close():关闭此文件输

6、入流并释放与此流有关的所有系统资源。FileDescriptor getFD():返回表示到文件系统中实际文件的连接的FileDescriptor 对象,该文件系统正被此 FileInputStream 使用。int read():从此输入流中读取一个数据字节。int read(byte b):从此输入流中将最多 b.length 个字节的数据读入一个byte 数组中。int read(byte b, int off, int len):从此输入流中将最多 len 个字节的数据读入一个 byte 数组中。long skip(long n):从输入流中跳过并丢弃 n 个字节的数据。2. Buff

7、eredInputStream:此类本身带有一个缓冲区,在读取数据时,先放到缓冲区中,可以减少对数据源的访问,提高运行的效率。构造方法:构造方法:BufferedInputStream(InputStream in):创建一个 BufferedInputStream并保存其参数,即输入流 in,以便将来使用。BufferedInputStream(InputStream in, int size):创建具有指定缓冲区大小的 BufferedInputStream 并保存其参数, 即输入流 in, 以便将来使用。常用方法:常用方法:int available():返回可以从此输入流读取(或跳过)

8、 、且不受此输入流接下来的方法调用阻塞的估计字节数。void close():关闭此输入流并释放与该流关联的所有系统资源。int read():从输入流中读取数据的下一个字节。int read(byte b, int off, int len):从此字节输入流中给定偏移量处开始将各字节读取到指定的 byte 数组中。3. DataInputStream:此类提供一些基于多字节读取方法,从而可以读取基本数据类型的数据。构造方法:构造方法:DataInputStream(InputStream in) :使用指定的底层 InputStream 创建一个 DataInputStream。常用方法:常

9、用方法:int read(byte b) :从包含的输入流中读取一定数量的字节,并将它们存储到缓冲区数组 b 中。int read(byte b, int off, int len) :从包含的输入流中将最多 len 个字节读入一个 byte 数组中。【实例 5-5】通过文件读写实现文件复制。实现了从 c:/temp.txt 文件读取数据,并写入到 c:/temp1.txt 文件中去的功能。程序运行时文件 c:/temp.txt 必须要先存在。【源代码】import java.io.*;class BufferedReaderExamplepublic static void main(Str

10、ing args) throws IOExceptionBufferedReader d = new BufferedReader(new InputStreamReader(new FileInputStream(c:/temp.txt);DataOutputStream o = new DataOutputStream(new FileOutputStream(c:/temp1.txt);String line;while( (line=d.readLine() != null)String a = line.toUpperCase();System.out.println(a);o.wr

11、iteBytes(a+rn);d.close();o.close();System.out.println(程序结束);Java 源程序行号添加程序设计该程序产生的输出如下:HELLO WORLD!SNOW MAN!ITS CHRISTMAS EVE,LETS PRAY!程序结束【注意】FileInputStream 是输入节点流,指向文件 c:/temp.txt,InputStreamReader是处理流,实现了字节流到字符流的转换,BufferedReader 是处理流,实现了带缓冲区读,以上几个流链接在一起构成了输入流链,实现了文件 c:/temp.txt数据到程序(line 变量)的流

12、动;18.3.2 outputStream 字节流OutputStream 是抽象类,所有字节输出流类都直接或间接继承此类。OutputStream 的子类必须始终提供至少一种可写入一个输出字节的方法。OutputStream 类的体系结构如下图 5-2 所示:图 5-2 OutputStream 类体系结构图OutputStream 的常用方法包括: void close() 关闭此输出流并释放与此流有关的所有系统资源。 void flush() 刷新此输出流并强制写出所有缓冲的输出字节。 void write(byte b) 将 b.length 个字节从指定的字节数组写入此输出流。 vo

13、id write(byte b, int off, int len)将指定字节数组中从偏移量off开始的len个字节写入此输出流。 abstract void write(int b) 将指定的字节写入此输出流。字节输出流类很多,这里重点介绍如下字节输出流类很多,这里重点介绍如下 3 种:种:1.FileOutputStream:此类用于从本地文件系统的文件中写入数据。构造方法:构造方法:FileOutputStream(File file) :创建一个向指定 File 对象表示的文件中写入数据的文件输出流。FileOutputStream(String name) : 创建一个向具有指定名称

14、的文件中写入数据的输出文件流。常用方法:常用方法:void close():关闭此文件输出流并释放与此流有关的所有系统资源。protectedvoid finalize():清理到文件的连接, 并确保在不再引用此文件输出流时调用此流的 close 方法。FileDescriptor getFD():返回与此流有关的文件描述符。void write(byte b):将 b.length 个字节从指定 byte 数组写入此文件输出流中。void write(byte b, int off, int len):将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此文件输出流。void

15、 write(int b):将指定字节写入此文件输出流。2.BufferedOutputStream:此类本身带有一个缓冲区,在写取数据时,先放到缓冲区中,实现缓冲的数据流。构造方法:构造方法:BufferedOutputStream(OutputStream out) : 创建一个新的缓冲输出流,以将数据写入指定的底层输出流。BufferedOutputStream(OutputStream out, int size):创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的底层输出流。常用方法:常用方法:void flush():刷新此缓冲的输出流。void write(byte

16、b, int off, int len):将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此缓冲的输出流。void write(int b):将指定的字节写入此缓冲的输出流。DataOutputStream:此类允许应用程序以适当的方式将 Java 中基本数据类型写入输出流中。构造方法:构造方法:DataOutputStream(OutputStream out) :创建一个新的数据输出流,将数据写入指定基础输出流。常用方法:常用方法:void flush() :清空此数据输出流。int size() :返回计数器 written 的当前值,即到目前为止写入此数据输出流的字

17、节数。void write(byte b, int off, int len):将指定 byte 数组中从偏移量 off开始的 len 个字节写入基础输出流。void write(int b):将指定字节(参数 b 的八个低位)写入基础输出流。void writeBoolean(boolean v) :将一个 boolean 值以 1-byte 值形式写入基础输出流。void writeByte(int v) : 将一个 byte 值以 1-byte 值形式写出到基础输出流中。void writeBytes(String s) :将字符串按字节顺序写出到基础输出流中。void writeCha

18、r(int v) :将一个 char 值以 2-byte 值形式写入基础输出流中,先写入高字节。void writeChars(String s) :将字符串按字符顺序写入基础输出流。void writeFloat(float v) :使用 Float 类中的 floatToIntBits 方法将float 参数转换为一个 int 值,然后将该 int 值以 4-byte 值形式写入基础输出流中,先写入高字节。void writeInt(int v) :将一个 int 值以 4-byte 值形式写入基础输出流中,先写入高字节。【实例 5-6】将用户输入保存到文件中。其功能是:从控制台输入 50

19、 个字节的数据,输出到 C 盘 write.txt 文件中,读取 write.txt 文件中的内容,输出到调试窗口中。【源代码】import java.io.*;class ReadWriteFilepublic static byte getInput() throws Exceptionbyte inp = new byte50;System.out.println(输入文本);System.out.println(只有50个字节);System.out.println(每行结束时按下回车键);for(int i=0; i50; i+)inpi = (byte)System.in.read

20、();return inp;public static void main(String args) throws Exceptionbyte input = getInput();FileOutputStream f = new FileOutputStream(c:/write.txt);for(int i=0; i50; i+)f.write(inputi);f.close();int size;FileInputStream f1 = new FileInputStream(c:/write.txt);size = f1.available();System.out.println(读

21、取文件write.txt .);for(int i=0; isize; i+)System.out.println(char)f1.read();f1.close();System.out.println(程序结束);该程序产生的输出如下:输入文本Java 源程序行号添加程序设计只有 50 个字节每行结束时按下回车键hehehehe lalalala dududdudududu dududududududududu读取文件 write.txt .du程序结束18.4 字符流Reader 和 Writer 是 java.io 包中的两个字符流类的顶层抽象父类, 定义了在I/O 流中读写字符数据的

22、通用 API。在 Java 中字符采用是 Unicode 字符编码。常见字符输入/输出流是由 Reader 和 Writer 抽象类派生出来的。处理数据时是以字符为基本单位的。18.4.1 Reader 类Reader 读取字符类型,Reader 类的体系结构如图 5-3 所示:图 5-3 Reader 类体系结构图字符输入流类很多,这里重点介绍 FileReader 和 BufferedReader: FileReader:用来读取字符文件的便捷类用来读取字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是适当的。其构造方法其构造方法有如下 2 种:FileReader(

23、File file) :在给定从中读取数据的 File 的情况下创建一个新 FileReader。FileReader(String fileName) :在给定从中读取数据的文件名的情况下创建一个新 FileReader。 BufferedReader 类是类是 Reader 类的子类类的子类, 为 Reader 对象添加字符缓冲器,为数据输入分配内存存储空间,存取数据更为有效。其构造方法有如下其构造方法有如下 2 种:种:BufferedReader(Reader in) : 创建一个使用默认大小输入缓冲区的缓冲字符输入流。BufferedReader(Reader in, int sz)

24、 : 创建一个使用指定大小输入缓冲区的缓冲字符输入流。其操作方法有:其操作方法有:void close():关闭该流并释放与之关联的所有资源。void mark(int readAheadLimit):标记流中的当前位置。boolean markSupported():判断此流是否支持 mark() 操作(它一定支持) 。int read():读取单个字符。int read(char cbuf, int off, int len):将字符读入数组的某一部分。String readLine():读取一个文本行。boolean ready():判断此流是否已准备好被读取。void reset():

25、将流重置到最新的标记。long skip(long n):跳过字符。18.4.2 Writer 类Writer 写入字符类型,Writer 类的体系结构如下图 5-7 所示:图 5-4 Writer 类体系结构图字符输出流类很多,这里重点介绍 FileWriter 和 BufferedWriter: FileWriter:用来写入字符文件的便捷类:用来写入字符文件的便捷类。FileWriter 用于写入字符流。要写入原始字节流。其构造方法有如下 2 种:FileWriter(File file):根据给定的 File 对象构造一个 FileWriter 对象。FileWriter(String

26、 fileName):根据给定的文件名构造一个 FileWriter 对象。 BufferedWriter:将文本写入字符输出流将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了。除非要求提示输出,否则建议用BufferedWriter 包装所有其 write() 操作可能开销很高的 Writer。其构造方法其构造方法有如下 2 种:BufferedWriter(Writer out):创建一个使用默认大小输出缓冲区的缓冲字符输出流。BufferedWriter(Writer out, int

27、 sz):创建一个使用给定大小输出缓冲区的新缓冲字符输出流。BufferedWriter 常用方法为:void close():关闭此流,但要先刷新它。void flush():刷新该流的缓冲。void newLine():写入一个行分隔符。void write(char cbuf, int off, int len):写入字符数组的某一部分。void write(int c):写入单个字符。void write(String s, int off, int len):写入字符串的某一部分。【实例 5-7】带缓冲的字符流使用示例。 【源代码】import java.io.*;class Rea

28、derWriterpublic static void main(String args)tryJava 源程序行号添加程序设计BufferedReader in = new BufferedReader(newFileReader(args0);String s, s1 = new String();while( (s=in.readLine() != null)s1 += s + n;in.close();BufferedReader stdin = new BufferedReader(newInputStreamReader(System.in);System.out.println(

29、BufferedReader 和InputStreamReader的用法.);System.out.println(输入一行);System.out.println(stdin.readLine();StringReader in2 = new StringReader(s1);int c;System.out.println(输入文件的单个字符+args0);while( (c=in2.read() != -1)System.out.println(char)c);BufferedReader in4 = new BufferedReader(newStringReader(s1);Prin

30、tWriter p = new PrintWriter(new BufferedWriter(newFileWriter(demo.out);while( (s=in4.readLine() != null)p.println(输出+s);p.close();catch(Exception e)任务实施1. 实现思路使用 BufferedReader 从文件中逐行读入 Java 源文件中的代码,在每行代码前加上行号后,使用 PrintWriter 逐行将代码写入新文件。(1)定义类 InsertLineNumber(2)编写 open 方法,将源代码文件内容读入字符串 strFinal 对象中

31、(3)编写 saveAs 方法,从 strFinal 对象中逐行读出代码,增加行号并写入新文件中(4)在 main 方法中创建 InsertLineNumber 类对象,调用 open、saveAs 方法2. 程序代码import java.io.*;public class InsertLineNumber private String strTemp;private String strFinal = new String();public void open(String fileName)tryBufferedReader in = new BufferedReader(new Fil

32、eReader(fileName);while(strTemp = in.readLine()!= null)strFinal = strFinal + strTemp + n;in.close();catch(IOException e)System.out.println(e);public void saveAs(String fileName)tryBufferedReader in = new BufferedReader(new StringReader(strFinal);PrintWriter out = new PrintWriter(new BufferedWriter(n

33、ewFileWriter(fileName);int lineCount = 1;while(strTemp = in.readLine()!= null)out.println(lineCount+ + : + strTemp);in.close();out.close();catch(IOException e)Java 源程序行号添加程序设计System.out.println(e);public static void main(String args) throws IOExceptionInsertLineNumber obj = new InsertLineNumber();ob

34、j.open(E:/EclipseWorkspace/task1/src/com/task25/FileIO.java);obj.saveAs(d:FileIO.txt);任务拓展对象流 ObjectInputStream 和 ObjectOutputStream 可以将 Java 对象输入、输出,例如:将对象保存到文件,实现对象数据的持久化。ObjectInputStream主要方法 Object readObject()负责读入一个对象,读入后类型为 Object,需要通 过 强 制 类 型 转 换 恢 复 原 类 型 。 ObjectOutputStream 主 要 方 法 voidwr

35、iteObject(Object obj)负责写出一个对象。注意读写对象必须是序列化的,实现 Serializable 接口,Java 大多数类都是。【实例 5-8】 对象流示例。 【源代码】下例程序 ObjectStreamDemo.java 演示了将 Date 类的对象写出到文件再从文件读入的方法。 第一次运行时, 因为文件不存在会出异常, 第二次运行时,显示上次和本次程序运行的时间。import java.io.*;import java.util.*;public class ObjectStreamDemo public static void main(String args) t

36、ryObjectInputStream pin = new ObjectInputStream(newFileInputStream(c:/date.txt);Date dlast = (Date)pin.readObject();pin.close();System.out.println(上次运行时间为: + dlast);Java 源程序行号添加程序设计catch(Exception exp)System.out.println(exp);Date dnow = new Date();System.out.println(本次运行时间为: + dnow);tryObjectOutputS

37、tream pout = new ObjectOutputStream(newFileOutputStream(c:/date.txt);pout.writeObject(dnow);pout.close();catch(Exception exp)System.out.println(exp);该程序产生的输出如下:上次运行时间为:Tue Jan 08 01:37:50 CST 2013本次运行时间为:Tue Jan 08 01:37:52 CST 2013任务实训1.实训目的 了解随机文件访问方式的含义; 掌握随机访问文本的方法; 掌握 RandomAccessFile 类的常用方法。2.实训内容编写一个程序, 把几个 int 型整数写入到一个名为 tom.dat 的文件中, 然后按相反顺序读出这些数据。Java 源程序行号添加程序设计

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 大学
版权提示 | 免责声明

1,本文(Java程序设计课件:单元18 流.doc)为本站会员(罗嗣辉)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|