收藏 分享(赏)

9_2java输入输出.ppt

上传人:hwpkd79526 文档编号:9116757 上传时间:2019-07-24 格式:PPT 页数:39 大小:592.50KB
下载 相关 举报
9_2java输入输出.ppt_第1页
第1页 / 共39页
9_2java输入输出.ppt_第2页
第2页 / 共39页
9_2java输入输出.ppt_第3页
第3页 / 共39页
9_2java输入输出.ppt_第4页
第4页 / 共39页
9_2java输入输出.ppt_第5页
第5页 / 共39页
点击查看更多>>
资源描述

1、java.io package,part2 Java的输入输出,主要内容,Java的基本输入输出 面向Byte 面向Character 节点流与处理流 IO流的类层次 简单IO流 过滤流,JAVA的输入/输出,程序经常需要从外部获取数据或者向外部输出数据。 位置:磁盘、网络、内存、另一个程序 形式:对象、字符、文本文件、声音、图形 Java中,输入与输出(I/O)是通过流进行的。它的特点是数据的发送和获取都是沿数据顺序进行的。 流模型建立在从某个数据源到数据池的数据传输基础上(from source to sink),也就是说把不同的输入/输出源(键盘,文件,网络连接)等抽象表示为“流”。 两

2、类基本的流: 输出流,只能向其写出数据,而不能从中读取数据。 输入流,只能从中读取数据,而不能向其写出数据,流编程基础,按流的数据单位大小分字符流和字节流。 流是单向的,流提供数据是输入流,向流中写数据是输出流。 见下图流模型中四个抽象类,它们是流模型的父类。,InputStream,字节输入流InputStream是抽象类,定义了字节输入流的框架。 它的最重要的三个方法(输入流提供数据输入): int read() int read(byte buffer) int read(byte buffer, int offset, int length) 大部分子类的命名是XxxInputStre

3、am,例如FileInputStream,DataInputStream,OutputStream,字节输出流OutputStream是抽象类,定义了字节输出流的功能框架。 它的最重要的三个方法(提供数据输出): void write(int c) void write(byte buffer) void write(byte buffer, int offset, int length)close() 大部分子类的命名是XxxOutputStream,例如FileOutputStream,DataOutputStream,InputStream类层次,OutputStream类层次,Java

4、1.1的I/O:Reader与Writer,与1.0.2相比的优越性 国际化引入了字符流(Character Stream)处理16位的Unicode码,而1.0.2中的字节流(Byte Stream)仅处理8位字节。新引入的Reader及Writer类均支持Unicode码。 性能新的API的速度优于1.0.2的类库 举例:ReadFile2.java,Java1.1的I/O:工作原理,Java使用unicode字符集,用其来表示字符和字符串,所有的字符都是16位的。 Reader能够将采用其他字符编码的输入流中的数据转化为Unicode字符;Writer再把Unicode字符转化为指定字符

5、,写到输出中。比如:英语国家的缺省字符编码是ISO8859-1。 当读写文本数据的时候必须指定编码,否则可能会出现乱码。,Reader & Writer,Reader和Writer类是一切字符流的超类。它们封装的功能大致和InputStream,OutputStream一样,子类命名常为XxxReader,XxxWriter。以下为二类的主要API方法:int read() int read(char cbuf)int read(char cbuf, int offset, int length)void write(int c) void write(char cbuf)void write

6、(char cbuf, int offset, int length)void write(String s)void write(String s, int offset, int length),Reader类层次,Writer类层次,节点流和处理流,节点流(node stream): 传输未经处理数据 可以从/向一个特定的地方(节点)读写数据,例如磁盘或者一块内存。 处理流(processing stream): 传输经处理数据 是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读/写功能 二者的区分大致可以从构造器参数中或类名称中看出来。,常见节点流列表,常见处理流列表,

7、I/O链,在java中,并不是用一个单一的类来创建流对象,通过叠加多个对象提供所期望的功能创建一个目的单一的结果流,却需要创建多个流的对象。输出流与输入流之间不能建立连接。,I/O链,直接与数据源或者数据目的连接的流一般没有缓冲区,可以串联到另一流的流一般有缓冲区,比如BufferedOutputStream。 如果流带有缓冲区,数据不会直接到达通道另一端,会暂时保存在缓存区当中,当数据超过缓冲区,才会到达通道另一端。或者使用flush()方法,强迫数据通过流通道。 流的串联是堆栈方式的,显示地调用栈顶流的flush()方法,程序会依次调用所有串联流的flush()方法。调用close()方法

8、关闭流,显示地关闭栈顶流即可。对于输出流,close()方法会自动调用flush()方法。 举例:,I/O Stream Chaining,Proxy & Decorator Patterns,FilterInputStream和FilterOutputStream使用了代理(Proxy)模式,代理模式是代理对象对被代理对象的一个功能不变的封装。 Decorator模式也是某个对象对另外一个对象的功能包装,某些方法它直接转给包含对象,而某些方法则由包装对象来提供,这样新包装对象可以提供扩展的功能。 处理流大部分采用了Decorator模式,处理流就是对其它节点流或处理流进一步的功能包装。,简单

9、的IO流(1),FileInput/OutputStream 代表一个在本地文件系统中的文件的IO流,可通过文件名或文件对象创建。 FileInputStream fis=new FileInputStream(“.in.txt”); FileOutputStream fos=new FileOutputStream( new File(“.out.txt”); int c; while(c=fis.read()!= -1) fos.write(c); fis.close(); fos.close(); Example: ReadFile1.java,简单的IO流(2),SequenceInp

10、utStream SequenceInputStream(InputStream, InputStream) 把两个InputStream连接为一个InputStream ByteArrayInput/OutputStream 从字节数组读取/向字节数组写入8位数据 StringBufferInputStream(String s) 把一个String 转换为InputStream ObjectInputStream/ObjectOutputStream 举例:ObjectExample.java 和 MyServer.java MyClient.java,简单的IO流(3),FilterIn

11、put/OutputStream 过滤流 作用:给朴素的Input/OutputStream加上一些修饰某些有用的格式 来源:Input/OutputStream 种类: DataInput/OutputStream BufferedInput/OutputStream PrintStream / 提供了print 和println 其他,简单的IO流(4),DataInput/OutputStream 对于基本数据类型进行有格式的读写 DataInputStream实现了DataInput接口 readInt/Float/Char/Boolean/Long/Double() DataOutp

12、utStream实现了DataOutput接口 writeInt/Float/Char/Boolean/Long/Double(),简单的IO流:举例 DataInOut.java,int i=20; float d=(float)20.22; String s=“Hello测试“; tryDataOutputStream dout = new DataOutputStream(new FileOutputStream(“test.txt”); /dout可格式输出DataInputStream din = new DataInputStream(new FileInputStream(“te

13、st.txt”); /din可格式输入/利用DataOutputStream dout写出数据dout.writeInt(i);dout.writeFloat(d);dout.writeUTF(s);System.out.println(“write successfully!“);/利用DataInputStream din读入数据System.out.println(“reading out:“);System.out.println(din.readInt();System.out.println(din.readFloat();System.out.println(din.readUT

14、F(); catch(Exception e) ,简单的IO流(5),BufferedInput/OutputStream 自动利用内存缓冲,避免每次想要数据时都进行物理性的读取BufferedInputStream(InputStream in) BufferedInputStream(InputStream in, int size) 还可在其外面再加包装 new DataInputStream(new BufferedInputStream(new FileInputStream(“File1.txt”) ) );,简单的IO流(5),PrintStream类是FilterOutputS

15、tream PrintStream(OutputStream out, boolean autoFlush) 自动刷新,这意味着可在写入字节数组之后自动调用 flush 方法,可调用其中一个 println 方法,或写入一个新行字符或字节 (n)。,System的标准输入与标准输出,System.in,System.out是由JVM自动创建的对象,System.in是InputStream的子类,System.out是PrintStream的子类。 System.in.read() /返回一个16位整型为了方便,经常进行封装处理BufferedReader br = new BufferedR

16、eader (InputStreamReader(System.in);br.readLine();,桥梁类,桥梁:InputStreamReader类和 OutputStreamWriter类,InputStream,Reader,OutputStream,Writer,Input/OutputStreamReader,从该类的构造器可以看出(以输入为例): public InputStreamReader(InputStream in) public InputStreamReader(InputStream in, String charset) /指定字符编码方式 例如:文件Hello

17、.txt采用了UTF8编码方式 new InputStreamReader ( new FileInputStream (“Hello.txt”),” UTF8”); 为了提高效率,一般把inputStreamReader封装在BufferReader里面。,FileReader与FileWriter,用于从文件中读取字符数据,该类只能使用平台默认的字符编码方式,不能指定其它方式。存在跨平台的风险。 构造方法FileReader(File file) FileReader(String fileName) FileWriter(File file) FileWriter(File file,

18、boolean append) FileWriter(String fileName) FileWriter(String fileName, boolean append),BufferReader与PrintWriter,BufferReader提高效率,可直接读入一行字符串readLine(). PrintWriter的构造方法: PrintWriter(OutputStream/Writer) PrintWriter(OutputStream/Writer, boolean autoFlush) 提供了print()和println()方法,练习,编写一段java Applicatio

19、n程序,从一个文件in.txt中读取内容,再将它写到文件out.txt中。in.txt采用本地平台默认的字符编码,而out.txt采用和本地平台不同的字符编码UTF8。MyReaderWriter.java,RandomAccessFile类(1),随机访问文件:RandomAccessFile类 不属于Input/OutputStream 用于访问本地文件 可读可写 同时实现了DataInput和DataOutput接口,可同时进行有格式的读写 创建时指定对应某一文件完成读或写操作 RandomAccessFile s1=new RandomAccessFile(“a.txt”,”r”);

20、File f1=new File(“a.txt”); RandomAccessFile s2=new RandomAccessFile(f1,”rw”); / ”r” 和“rw” 是java中文件访问权限的两种mode,练习,如何打开一个文件(例如a.dat),读其内容?(请选择1个选项) a) new RandomAccessFile(new FileInputStream(“a.dat“) b) new FileInputStream(new RandomAccessFile(“a.dat“,“r“) c) new RandomAccessFile(“a.dat“,“rw“) d) new

21、 RandomAccessFile(“a.dat“),RandomAccessFile类(2),随机文件读写 readXx(),writeXx( ):实现DataInput/Output接口readInt/Float/Char/Boolean/Long/Double()writeInt/Float/Char/Boolean/Long/Double()readLine() 读写位置:文件指针及其操作函数 public long getFilePointer(); /相当于开头部分的指针的位置 public void seek(long n); public int skipBytes(int n

22、); 所有的方法都可能产生异常,要使用try和catch,RandomAccessFile类 举例,/第一次操作,依次写出10个数据 RandomAccessFile rf = /读写模式new RandomAccessFile(“rtest.dat“, “rw“); for(int i = 0; i 10; i+)rf.writeDouble(i*1.414); rf.close(); /第二次操作,随机输出修改一个数值 rf = new RandomAccessFile(“rtest.dat”, “rw”); /读写模式 rf.seek(8); rf.writeDouble(47.0001

23、); rf.close(); /第三次操作,依次读入10个数据 rf = new RandomAccessFile(“rtest.dat”, “r”); /读模式 for(int i = 0; i 10; i+) System.out.println(“Value “ + i + “: “ + rf.readDouble(); rf.close();,A tip,并不是所有的java程序都可以处理文件并执行文件操作。 由于java Applet程序通常是从网络上下载到本地运行的,不可知也不可控,因此,java的安全机制禁止java Applet访问和存取本地文件,以避免对本地硬盘的潜在攻击。 如果试图在java Applet程序中使用文件操作,则将引发java的安全异常。,作业,1 P230-7 :首先获得在某一路径下的“.java”结尾的所有文件;去掉空行及注释,创建一组新文件(可以指定到某一新路径下),也是“.java”结尾,保存处理过的文件。 2 使用RandomAccessFile类实现英文单词统计器。对于一个纯英文文章的txt文件,实现单词统计功能: (1)一共出现了多少个单词 (2)有多少个互不相同的单词 (3)计算单词出现的频率,将出现频率最高的5个单词及其频率显示出来。,

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

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报