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