《java网络编程第6章.ppt》由会员分享,可在线阅读,更多相关《java网络编程第6章.ppt(29页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第一章第一章JAVA IO字符流字符流 课程目标课程目标1.Reader2.Writer3.InputStreamReader4.OutputStreamWriter5.FileReader6.FileWriter7.BufferedReader8.PrintWriter 体验项目体验项目 如图的窗体布局,当点击如图的窗体布局,当点击“打开打开”时打开文件对话框,时打开文件对话框,并把打开的文本文件的内容显示到窗体的文本域中,当点并把打开的文本文件的内容显示到窗体的文本域中,当点击击“保存保存”时把文本域的内容保存到文件中,点击时把文本域的内容保存到文件中,点击“Exit”时退出程序。时退出程
2、序。字符流字符流 字符流顾名思义是用来操作字符的,其实字节字符流顾名思义是用来操作字符的,其实字节流类提供的功能足以满足处理任何类型流类提供的功能足以满足处理任何类型I/O操作的操作的需要,但是它们不能直接处理需要,但是它们不能直接处理Unicode字符。但字符。但JAVA的一个主要目的是支持的一个主要目的是支持“只写一次,在各处只写一次,在各处运行运行”的思想,所以它必须包括对字符直接的的思想,所以它必须包括对字符直接的I/O支持。本节讨论了几个字符支持。本节讨论了几个字符I/O类。在字符流层次类。在字符流层次的顶部是的顶部是Reader和和Writer抽象类。抽象类。字节流和字符流的区别和
3、各自的用途字节流和字符流的区别和各自的用途 字符流处理的单元为两个字节的字符流处理的单元为两个字节的Unicode字符,字符,分别操作字符、字符数组或字符串,而字节流处分别操作字符、字符数组或字符串,而字节流处理单元为理单元为1个字节,操作字节和字节数组。所以字个字节,操作字节和字节数组。所以字符流是由符流是由JAVA虚拟机将字节转化以两个字节的虚拟机将字节转化以两个字节的Unicode字符为单位的字符而组成的,所以它对多字符为单位的字符而组成的,所以它对多国语言支持性比较好,如果是音频文件、图片、国语言支持性比较好,如果是音频文件、图片、歌曲,就用字节流比较好,但如果是关系到中文歌曲,就用字
4、节流比较好,但如果是关系到中文(文本)的,用字符流比较好。(文本)的,用字符流比较好。流类表流类表 流流 类类意意 义义BufferedReader缓缓冲冲输输入字符流入字符流BufferedWriter缓缓冲冲输输出字符流出字符流CharArrayReader从字符数从字符数组读组读取的取的输输入流入流CharArrayWriter写到字符数写到字符数组组的的输输出流出流FileReader从文件从文件读读取的取的输输入流入流FileWriter输输出到文件的出到文件的输输出流出流FilterReader过滤读过滤读放流放流FilterWriter过滤过滤写入流写入流InputStreamR
5、eader将字将字节转换节转换到字符的到字符的输输入流入流LineNumberReader计计算行数的算行数的输输入流入流OutputStreamWriter转换转换字符到字字符到字节节的的输输出流出流PipedReader输输入管道入管道PipedWriter输输出管道出管道PrintWriter包含包含print()和和println()的的输输出流出流PushbackReader返回一个字符并把此字返回一个字符并把此字节节放回放回输输入流入流Reader描述字符流描述字符流输输入的抽象入的抽象类类StringReader从字符串从字符串读读取的取的输输入流入流StringWriter输输
6、出到字符串的出到字符串的输输出流出流Writer描述字符流描述字符流输输出的抽象出的抽象类类字符类的层次结构字符类的层次结构 Reader Reader类是所有输入流类的祖先,所以类是所有输入流类的祖先,所以它只定义了一些最基本的方法,它直接的它只定义了一些最基本的方法,它直接的下一级子类是下一级子类是BufferedReader类、类、CharArrayReader类、类、FilterReader类、类、InputStreamReader类、类、PipedReader类和类和StringReader类等。这些类的所有方法在发类等。这些类的所有方法在发生错误时都会抛出生错误时都会抛出IOExc
7、eption异常。异常。Reader的常用方法的常用方法 abstract void close()关闭输入源。如果继续读会产生关闭输入源。如果继续读会产生IOException异常。异常。void mark(int numChars)放置一个标记到输入流的当前点。它会一直有效,直到读取了放置一个标记到输入流的当前点。它会一直有效,直到读取了numChars个字符。个字符。boolean markSupported()如果这个流支持如果这个流支持mark()/reset()方法,将返回方法,将返回true。int read()返回调节器所用的输入流中下一个可用字符的整数表示。如果文件结返回调节
8、器所用的输入流中下一个可用字符的整数表示。如果文件结束,返回束,返回-1。Reader的常用方法的常用方法 int read(char buffer)试图读试图读buffer.length个字符到个字符到buffer中,并且返回成功读取的实际字符中,并且返回成功读取的实际字符数。如果遇到文件结尾,返回数。如果遇到文件结尾,返回-1。abstract int read(char buffer,int offset,int numChars)将字符读入数组的某一部分,返回成功读取的字符数。如果遇到文件将字符读入数组的某一部分,返回成功读取的字符数。如果遇到文件结尾,则返回结尾,则返回-1。bool
9、ean ready()如果下一个输入请求不必等待,则返回如果下一个输入请求不必等待,则返回true;否则,返回;否则,返回false。void reset()重置输入指针到前面设置的标记。重置输入指针到前面设置的标记。long skip(long numChars)跳过跳过numChars个字符输入,返回实际跳过的字符数。个字符输入,返回实际跳过的字符数。Writer Writer类最直接的子类是类最直接的子类是BufferedWriter类、类、CharArrayWriter类、类、FileWriter类、类、PrintWriter类等。类等。Writer类与类与Reader类一样,它也是抽
10、象类,类一样,它也是抽象类,用于定义字符流输出的抽象类。因此它提供的方用于定义字符流输出的抽象类。因此它提供的方法中不包括构造方法,无法直接产生它的一个实法中不包括构造方法,无法直接产生它的一个实例对象。所以要由其子类去构造真正的输出流实例对象。所以要由其子类去构造真正的输出流实体对象,然后就可以把那个由其子类构造的输出体对象,然后就可以把那个由其子类构造的输出流拿来使用。并且在有异常的情况下会抛出流拿来使用。并且在有异常的情况下会抛出IOException异常。异常。Writer的常用方法的常用方法 writer append(char ch)throws IOException追加追加ch
11、到调用输出流末尾,返回对调用输出流的引用。到调用输出流末尾,返回对调用输出流的引用。writer append(CharSequence chars)throws IOException追加追加chars到调用输出流末尾,返回对调用输出流的引用。到调用输出流末尾,返回对调用输出流的引用。abstract void close()关闭输出流。如果继续写入会产生关闭输出流。如果继续写入会产生IOException异常。异常。abstract void flush()确定输出状态以便清空任何缓冲区,即清空输出缓冲区。确定输出状态以便清空任何缓冲区,即清空输出缓冲区。Writer的常用方法的常用方法
12、void write(int ch)写入单个字符到调用的输出流。注意参数是一个整数,它允许使用不写入单个字符到调用的输出流。注意参数是一个整数,它允许使用不必转换为必转换为char的表达式来调用的表达式来调用write。void write(char buffer,int offset,int numChars)写入写入buffer数组中从数组中从offset开始的开始的numChars个字符到调用输出流。个字符到调用输出流。void write(String str)写入写入str到调用输出流。到调用输出流。void write(String str,int offset,int numCh
13、ars)写入写入str字符串中从字符串中从offset开始的开始的numChars字符。字符。InputStreamReader InputStreamReader继承了继承了Reader,它实现了,它实现了Reader的抽象方法,的抽象方法,InputStreamReader是字节流通向字符流的是字节流通向字符流的桥梁:它使用指定的桥梁:它使用指定的charset读取字节并将其解码为字符。读取字节并将其解码为字符。它使用的字符集可以由名称指定,否则可能为默认的字符它使用的字符集可以由名称指定,否则可能为默认的字符集。每次调用集。每次调用InputStreamReader中的一个中的一个rea
14、d()方法都会方法都会导致从基础输入流读取一个或多个字节。为了达到最高效导致从基础输入流读取一个或多个字节。为了达到最高效率,可以考虑在率,可以考虑在BufferedReader内包装内包装InputStreamReader,BufferedReader类在后面小节中介类在后面小节中介绍。例如以下语句把一个读取从控制台输入的绍。例如以下语句把一个读取从控制台输入的InputStreamReader转换为了转换为了BufferedReader:BufferedReader in=new BufferedReader(new InputStreamReader(System.in);InputSt
15、reamReader的常用方法的常用方法 void close()关闭当前流。关闭当前流。String getEncoding()返回此流使用的字符编码的名称。返回此流使用的字符编码的名称。int read()读取单个字符。读取单个字符。int read(char cbuf,int offset,int length)将字符读入数组中的某一部分。将字符读入数组中的某一部分。boolean ready()告知是否准备读取此流。告知是否准备读取此流。OutputStreamWriter OutputStreamWriter继承了继承了Writer类并且实现了类并且实现了Writer的抽象方法,它与
16、的抽象方法,它与InputStreamReader相反,相反,OutputStreamWriter是字符流通向字节流的桥梁:他使用指是字符流通向字节流的桥梁:他使用指定的定的charset将写入的字符编码转换为字节输出。它使用的字将写入的字符编码转换为字节输出。它使用的字符集可以由名称指定或显示给定,否则可能接受平台默认的符集可以由名称指定或显示给定,否则可能接受平台默认的字符集。注意,传递到此字符集。注意,传递到此write()方法的字符是未经缓冲的。方法的字符是未经缓冲的。为了达到最高效率,可考虑将为了达到最高效率,可考虑将OutputStreamWriter包装到包装到BufferedW
17、riter中以避免频繁调用转换器,中以避免频繁调用转换器,BufferedWriter类类将在后面小节中介绍。例如:将在后面小节中介绍。例如:BufferedWriter out=new BufferedWriter(new OutputStreamWriter(System.out);OutputStreamWriter的常用方法的常用方法 void close()关闭当前流。关闭当前流。String getEncoding()返回此流使用的字符编码的名称。返回此流使用的字符编码的名称。int write(int c)写入单个字符。写入单个字符。int write(char cbuf,int
18、 offset,int length)写入字符数组的某一部分。写入字符数组的某一部分。void flush()刷新流的缓冲。刷新流的缓冲。FileReader FileReader类继承了类继承了InputStreamReader,所以除了有,所以除了有InputStreamReader的功能以外还有自己的一些功能,可的功能以外还有自己的一些功能,可以使用它直接读取文件的内容。它也是读取字符文件的以使用它直接读取文件的内容。它也是读取字符文件的便捷类。以前读取汉字时都要先用便捷类。以前读取汉字时都要先用File对象构造出字节流对象构造出字节流对象,再用字节流对象构造出字符流对象,才能读写字对象
19、,再用字节流对象构造出字符流对象,才能读写字符,符,FileReader可以直接实现以上功能,它的两种最常用可以直接实现以上功能,它的两种最常用的构造函数如下所示:的构造函数如下所示:1.FileReader(String filePath)2.FileReader(File fileObj)每一个构造函数都能够抛出每一个构造函数都能够抛出FileNotFoundException异异常。这里,常。这里,filePath是文件的路径全名,是文件的路径全名,fileObj是描述文是描述文件的件的File对象。对象。FileReader的常用方法的常用方法 从类从类java.io.InputStr
20、eamReader继承的方法:继承的方法:int read()读取单个字符,返回值为数据内容。读取单个字符,返回值为数据内容。int read(char cbuf,int offset,int length)将字符读入数组中的某一部分,返回值为读到的个数而不是内容。将字符读入数组中的某一部分,返回值为读到的个数而不是内容。FileWriter FileWriter类继承了类继承了OutputStreamWriter类,类,所以它有所以它有OutputStreamWriter类的全部功能,另类的全部功能,另外它还有自己的一些功能,外它还有自己的一些功能,FileWriter类可以创建类可以创建一
21、个写文件的对象,它也是向文件写入字符的便一个写文件的对象,它也是向文件写入字符的便捷类,以前学习过写入字符的方法,先生成捷类,以前学习过写入字符的方法,先生成File对对象,再用象,再用File对象构造出字节流对象,然后用字节对象构造出字节流对象,然后用字节流对象构造出字符流对象,流对象构造出字符流对象,FileWriter可以实现直可以实现直接向文件中写入字符的功能。接向文件中写入字符的功能。FileWriter的几种构造方法的几种构造方法 FileWriter(String filePath)FileWriter(String filePath,Boolean append)FileWri
22、ter(File fileObj)FileWriter(File fileObj,Boolean append)其中构造函数中的参数意义分别是:其中构造函数中的参数意义分别是:Boolean append是否附加写。是否附加写。String filePath文件路径。文件路径。File fileObjFile对象。对象。FileWriter的常用方法的常用方法 从类从类 java.io.OutputStreamWriter继承的方法有:继承的方法有:void write(char cbuf,int off,int len)写入字符数组的某一部分。写入字符数组的某一部分。void write(i
23、nt c)写入单个字符。写入单个字符。void write(String str,int off,int len)写入字符串的某一部分。写入字符串的某一部分。BufferedReader BufferedReader由由Reader类扩展而来,提供通用的类扩展而来,提供通用的缓冲方式文本读取,而且提供了很实用的缓冲方式文本读取,而且提供了很实用的readLine()方方法,读取分行文本很适合,法,读取分行文本很适合,BufferedReader是针对是针对Reader的,不直接针对文件,所以它在实例化对象时只的,不直接针对文件,所以它在实例化对象时只能以能以Reader为参数构造。为参数构造。
24、BufferedReader有两个构造函数:有两个构造函数:1.BufferedReader(Reader inputStream)创建使用缺省尺寸输入缓冲区的缓冲字符输入流。创建使用缺省尺寸输入缓冲区的缓冲字符输入流。2.BufferedReader(Reader inputStream,int bufsize)创建一个使用指定大小输入缓冲区的缓冲字符输入流。创建一个使用指定大小输入缓冲区的缓冲字符输入流。BufferedReader的常用方法的常用方法 BufferedReader继承了继承了Reader类,所以它也有一些基本的读方法,类,所以它也有一些基本的读方法,在此基础上还新增了读文
25、本行的方法:在此基础上还新增了读文本行的方法:close()关闭流。关闭流。mark(int)标记此流的当前位置。标记此流的当前位置。markSupported()报告此流是否支持报告此流是否支持 mark()实现的操作。实现的操作。read()读取单一字符。读取单一字符。read(char,int,int)将若干字符读入一个数组中。将若干字符读入一个数组中。readLine()读取一文本行。读取一文本行。ready()报告此流是否读就绪。报告此流是否读就绪。reset()将该流复位为最近标记。将该流复位为最近标记。skip(long)跳过若干字符。跳过若干字符。PrintWriter Pri
26、ntWriter继承了继承了Writer类,但除此之外此类还实现了类,但除此之外此类还实现了PrintStream中的所有中的所有print()方法,与方法,与OutputStreamWriter类类不同,不同,PrintWriter可以直接输出字符串,使用很方便,注意可以直接输出字符串,使用很方便,注意在实例化时如果在实例化时如果“flushOnNewline”的值设为的值设为ture,在输出,在输出时会自动刷新该流的缓冲,如果不设置该值,则使用时会自动刷新该流的缓冲,如果不设置该值,则使用println()输出时需要手动刷新,即调用输出时需要手动刷新,即调用flush()方法,才会生效,如
27、方法,才会生效,如果用果用write()输出,不管把输出,不管把“flushOnNewline”设为何值,都设为何值,都必须调用必须调用flush()方法。方法。PrintWriter的几种常用的构造方法的几种常用的构造方法PrintWriter(OutputStream outputStream)根据一个存在的根据一个存在的 OutputStream,创建一个新的,创建一个新的 PrintWriter,没有自动行没有自动行刷新功能。刷新功能。PrintWriter(OutputStream outputStream,boolean flushOnNewline)根据一个存在的根据一个存在的
28、OutputStream,创建一个新的,创建一个新的 PrintWriter,有自动行刷有自动行刷新功能。新功能。PrintWriter(Writer outputStream)根据一个存在的根据一个存在的 Writer,创建一个新的,创建一个新的 PrintWriter,没有自动行刷新功能。没有自动行刷新功能。PrintWriter(Writer outputStream,boolean flushOnNewline)根据一个存在的根据一个存在的 Writer,创建一个新的,创建一个新的 PrintWriter,有自动行刷新功能。有自动行刷新功能。PrintWriter的常用方法的常用方法
29、void print(String s)打印字符串。打印字符串。void write(String s)写入字符串。写入字符串。void write(String s,int off,int len)写入字符串的某一部分。写入字符串的某一部分。close()关闭流。关闭流。flush()刷新流。刷新流。print(boolean)打印一个布尔值。打印一个布尔值。实践项目实践项目 实现以下三种功能:实现以下三种功能:(1)打开功能,当点击打开按钮时打开记事本。)打开功能,当点击打开按钮时打开记事本。(2)保存功能,当点击保存按钮时保存记事本信息。)保存功能,当点击保存按钮时保存记事本信息。(3)关闭功能,当点击关闭按钮时关闭记事本。)关闭功能,当点击关闭按钮时关闭记事本。本章总结本章总结1.Reader2.Writer3.InputStreamReader4.OutputStreamWriter5.FileReader6.FileWriter7.BufferedReader8.PrintWriter