IO流(熟练使用API).doc_第1页
IO流(熟练使用API).doc_第2页
IO流(熟练使用API).doc_第3页
IO流(熟练使用API).doc_第4页
IO流(熟练使用API).doc_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

流(熟练使用)(一):简单介绍(java.io包)1:流的分类:(1) 输入流 / 输出流:根据数据方向分类输入流:读取流输出流:写入流(2)字节流 / 字符流:根据数据单位分类(根据处理数据的不同来区分)(3)节点流 / 过滤流(包装流):根据流功能分类区别:()所有以inputstream/outstream为结尾的流都是字节流, 以reader/writer为结尾的是字符流(但是桥转换流例外InputStreamReader/OutputStreamWriter)是一个包装流()节点流:可以直接读取源数据的流(直接点说:就是参数可以是数据源)6流)。字节流字符流备注FileOutputStreamFileInputStreamFileWriterFileReader二进制文件用字节流,字符文件用字符流PipedOutputStreamPipedInputStreamPipedWriterPipesReader主要用于线程间通信处理流(过滤流)BufferedOutputStreamBufferedInputStreamBufferdWriterBufferedReader带有缓冲的流,只有在缓冲满的时候或者手动刷新的时候DataOutputStream DataInputStream无读写基本类型的数据的方法PrintStreamPrintWriter主要用于记录日志,格式化的输出,所见即所输入,在构造的时候,确定是否自动刷新ObjectOutputStreamObjectInputStream无对象的序列化OutputStreamWriterInputStreamReader无用于字节流和字符流的转化(桥转换流)Java IO的一般使用原则:一、按数据来源(去向)分类:1、是文件: FileInputStream, FileOutputStream, FileReader, FileWriter2、是byte:ByteArrayInputStream, ByteArrayOutputStream3、是Char: CharArrayReader, CharArrayWriter4、是String: StringBufferInputStream, StringReader, StringWriter5、网络数据流:InputStream, OutputStream, Reader, Writer二、按是否格式化输出分:1、要格式化输出:PrintStream, PrintWriter三、按是否要缓冲分:1、要缓冲:BufferedInputStream, BufferedOutputStream, BufferedReader, BufferedWriter四、按数据格式分:1、二进制格式(只要不能确定是纯文本的): InputStream, OutputStream及其所有带Stream结束的子类2、纯文本格式(含纯英文与汉字或其他编码方式);Reader, Writer及其所有带Reader, Writer的子类五、按输入输出分:1、输入:Reader, InputStream类型的子类2、输出:Writer, OutputStream类型的子类六、特殊需要:1、从Stream到Reader,Writer的转换类:InputStreamReader, OutputStreamWriter2、对象输入输出:ObjectInputStream, ObjectOutputStream3、进程间通信:PipeInputStream, PipeOutputStream, PipeReader, PipeWriter4、合并输入:SequenceInputStream(序列流)5、更特殊的需要:PushbackInputStream, PushbackReader, LineNumberInputStream, LineNumberReader决定使用哪个类以及它的构造进程的一般准则如下(不考虑特殊需要):第一,考虑最原始的数据格式是什么:是否为文本?第二,是输入还是输出?第三,是否需要转换流:InputStreamReader, OutputStreamWriter?第四,数据来源(去向)是什么:文件?内存?网络?第五,是否要缓冲:bufferedReader (特别注明:一定要注意的是readLine()是否有定义,有什么比read, write更特殊的输入或输出方法)第六,是否要格式化输出:print?(二):使用注意:1:打开一个流之后,一定要注意关闭。2:OutputStream os=new OutputStream(2,txt);注意:调用完这句话的时候,就会创建一个2.txt文件,如果原来已经有了这个文件,则会把原来的删掉,再创建一个新的。如果需要追加:则这样构造:OutputStream os=new OutputStream(2.txt,true );3:被包装的流对象在关闭流的时候只用关闭最外边的流。 FileOutputStream fa=new FileOutputStream(“a.txt”);BufferedOutputStream bos=new BufferedOutputStream(fa);Bos.close();4:对一个存储文件输出的顺序应该和输入的顺序相同,否则输出的内容就会改变。5:如果用的是带缓冲的输出流,如果没有关闭的话,需要时刻注意清空缓冲区。如果关闭流对象的时候,系统会默认清空缓冲区。6:流的read方法都会引起线程的阻塞,直到流被真正的写入或者读出7:在流中处理异常的机制:关掉流对象的地语句应该放在finally语句里面执行。并且流对象的定义和初始化应该在try 外边,最规范的写法如下所示:Public static int main(String args)FileInputStream fis=null;/一定要在外边定义,并且赋初值NULLTryfis= new FileInputStream (1.txt);catch(IOException e)finallyIf(fis!=null)/判断一下,如果为空的话,就不用再关闭Close(fis);9:编码问题:(1) 解码和编码解码:把本地编码解释成为unicode码编码:把unicode码再解释成为本地编码new String (byte,”编码方式”);注意:对于非unicode码来说,应该先解码再编码,才有可能复原。(2) 代码实现String s=new String(你好.getBytes(gb2312),iso8859_1);String s2=new String(s.getBytes(iso8859_1),gb2312);(三):对象序列化(面试)1:原因(对象持久化):对象只能存储在内存中,它的状态不能够长久保存,需要把对象保存在持久化资源中,对象序列化就是为了对象持久化作准备,并且只有实现了序列化,才能够在持久化资源和内存中传输或者是进行网络传输。2:定义:(1)对象的序列化,在java当中是采用流的方式进行的。把对象作为一个整体,在I/O流中传输,把这个对象写入到持久化资源中。这个过程就叫做对象序列化,(2)反序列化:把对象从持久化资源中读取出来的过程。利用的两个流对象为ObjectOutputStream / ObjectInputStream 3:语法:(面试)():实现了Serializeble接口的对象才能可序列化。这个接口里没有任何方法(标记接口)。例如:Class student implements Serializeble():如果一个序列化后的对象里面有一个属性是个对象属性,那么这个属性对象也需要实现序列化。例如:Class Student implements SerializebleTeacher T;必须序列化Class Teacher implements Serializeble(3):用transient关键字修饰的属性是临时属性,临时属性不参与序列化与反序列化。什么情况下需要序列化 a)当你想把的内存中的对象状态保存到一个文件中或者数据库中时候; b)当你想用套接字在网络上传送对象的时候; c)当你想通过RMI(Remote Method Invocation 远程方法调用)传输对象的时候;I/O流和文件操作Stream流的概念流是程序和设备之间交换数据的工具。源目的地流的分类:输入流/输出流字节流/字符流节点流/包装流输入流:输入程序(读)输出流:程序输出(写)2)底层对数据操作单位p289 corejava字节流(byte)所有文件,网络,键盘(所有设备)字符流(char)所有文本操作3)按数据来源(操作对象)1、节点流(低级)直接操作设备2、处理流(高级)(包装流)操作节点流(增强功能)输入流:以(字节)InputStream结尾 : FileInputStream(节符)Reader结尾 : FileReader输出:(字节)OutputStream :FileOutputStream(字符)Writer :FileWriter节点流:new XXX( 设备 ) :FileReader/FileInputStream包装流:new XXX(流)/这个要看清楚 :BufferedReader/InputStreamReaderjava.io 类 InputStream构造方法摘要InputStream() 方法摘要abstract intread() 从输入流读取下一个数据字节。返回-1作为流的结束标志。intread(byteb) 从输入流中读取一定数量的字节并将其存储在缓冲区数组 b 中。返回的整形值,表示读了多少个字节。intread(byteb, intoff, intlen) off表偏移量,可以不从0号下标开始分;len表示最多读len个字节。将输入流中最多 len 个数据字节读入字节数组。voidclose() 关闭此输入流并释放与该流关联的所有系统资源。java.io 类 OutputStream方法摘要voidwrite(byteb) 将 b.length 个字节从指定的字节数组写入此输出流。只写最低的那个字节,高位三个字节没有abstract voidwrite(intb) 将指定的字节写入此输出流。voidwrite(byteb, intoff, intlen) 将指定字节数组中从偏移量 off 开始的 len 个字节写入此输出流。voidclose() 关闭此输出流并释放与此流有关的所有系统资源。当流关闭了,流也会同时清空掉的。voidflush() 刷新此输出流并强制写出所有缓冲的输出字节。把缓冲区中没有写出去的数据写出去。要掌握的具体实现类FileInputStream / FileOutputStream用于文件的输入和输出ObjectInputStream / ObjectOutputStream对象的输入和输出DataInputStream / DataOutputStream基本类型数据和String类型的输入和输出BufferdReader / PrintStream用于逐行读写文本桥梁流(转换流)字节流字符流InputStreamReaderOutputStreamWriterjava.io 类 FileInputStream构造方法摘要FileInputStream(Stringname) 通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定。java.io 类 DataInputStream 类 DataOutputStreamBufferdInputStreamBufferdOutputStream没有提供特殊的方法,所以不用研究直接研究DataInputStream DataOutputStream.1010字符节点流字符缓冲包装成字符加个缓冲区包装应用程序字符缓冲字符1010文件输入输出FileInputStreamDataInputStream文件DataInputStream / DataOutputStream 是包装流。小于int的数值进行移位运算,系统都会当作int进行位运算。java.io 类 ObjectInputStream类 ObjectOutputStream把对象写到流中去,我们把这样的过程叫做对象序列化。进行传输时,只是将属性传了过去,要想在另一端反射的产生对象。要把对象序列化到流中,必须让这个类实现java.io. Serializable写入流的有:类名,属性名,属性类型,属性的值,serialVersionUID要注意的是,在传输两端,都必须要有所传输的类的定义,并且要相同。对象的序列化也可得到对像的深拷贝。ByteArrayInputStreamBufferedInputStreamReader / Writer 字符流一次读写一个字符java.io 类 Readerjava.lang.Objectjava.io.Reader用于读取字符流的抽象类。子类必须实现的方法只有 read(char, int, int) 和 close()。但是,多数子类将重写此处定义的一些方法,以提供更高的效率和/或其他功能。java.io 类 FileReaderjava.lang.Object java.io.Reader java.io.InputStreamReader java.io.FileReaderjava.io类 InputStreamReader类 OutputStreamWriterjava.lang.Object java.io.Reader java.io.InputStreamReaderjava.lang.Object java.io.Writer java.io.OutputStreamWriter是专门把字节流包装成字符流的对象。java.io 类 BufferedReaderjava.lang.Object java.io.Reader java.io.BufferedReaderFileInputStream- InputStreamReader 指定编码方式- BufferedReader 包装成这样。把字节流包装成字符流的固定方式,经常会用到。java.lang 类 System字段摘要staticPrintStreamerr “标准”错误输出流。staticInputStreamin “标准”输入流。staticPrintStreamout “标准”输出流。出错和输出默认指向屏幕输入默认从键盘java.io 类 PrintStreamjava.lang.Object java.io.OutputStream java.io.FilterOutputStream java.io.PrintStreamPiped 管道流线程间的对象交互 构造方法摘要PipedInputStream() 创建尚未连接的 PipedInputStream。PipedInputStream(PipedOutputStreamsrc) 实现管道对接创建 PipedInputStream,以使其连接到传送输出流 src。Int 3Data输出管道输出4byte|V进入接受线程 4byte|VData输入管道输入管道流,线程间的对象交互主要是实现管道对接线程间的通信,首先要起两个线程,然后,假如要用DataInputStream和DataOutputStream进行对话,要将他们默转成Pip管道。可以多发送,不能多接收。逐行读readLine()BufferedReader readLine()InputStreamReaderInputStream逐行写PrintStream Println();经常用到的流FileInputStream( 文件/文件名 )FileOutputStream( 文件/文件名 )文件读写(字节流)DataInputStream( InputStream is )DataOutputStream( OutputStream os )读写基本类型或String(字节流)InputStreamReader( InputStream is )OutputStreamWriter( OutputStream os )完成字节流到字符流(自身是字符流)BufferedReader( Reader r )PrintStream( 文件/文件名/InputStream o )用于逐行读写(BR字符流,PS字节流)PipedInputStream(例外的:不是处理流,还是节点流)PipedOutputStream了解内容:BufferedInputStreamBufferedOutputStream键盘输入BufferedReader br = new BufferedReader( new InputStreamReader( System.in);String temp = br.readLine();Properties读配置文件java.util. Propertiesjava.lang.Object java.util.Dictionary java.util.Hashtable java.util.PropertiesSUN类库性类(对象)Load(InputStream)Store(输出流,注释)属性文件(文本).properties.txtgetProperty()setProperty()它的KEY和VALUE都是字符串类型,不能是别的类型。经常用于读配置文件voidload(InputStreaminStream) 从输入流中读取属性列表(键和元素对)。配置文件中用或:隔开的两部分。将左边解析为KEY,右边的解析为VALUEStringgetProperty(Stringkey, StringdefaultValue) 用指定的键在属性列表中搜索属性。key=value 形式, 并且它的扩展名为 .properties如: pertiesname=张三age=18gender=男desccritpion=大学生SUN提供了一个 类 专门来负责加载此类文件,并且把数据解析成key和value的形;程序员可以通过key来获取值value这个类就是: java.util.Properties它是 HashTable 的子类, 但是它的KEY和VALUE只能是 字符串String通过此类如何来加载一个本地的 属性文件String file = perties;InputStream in = new FileInputStream(file);Properties p = new Properties();p.load(in);in.close(); /释放/如何访问加载进 Properties 中的编码问题ISO8859-1拉丁GBK,gb2312UTF-8name = new String( name.getBytes(ISO8859-1), GBK );可能出现乱码的地方:1、 在流传递时,有可能出现2、 网页上有可能3、 网络传输File类是对文件或目录的描述,既可以描述磁盘中存在的文件或目录,也可以用来描述磁盘上暂时还没有的。1、 exists()是否存在?2、 length()大小3、 createNewFile()4、 delete()5、 getName()6、 list()System.exit(0);程序结束java.io 类 RandomAccessFile构造方法摘要RandomAccessFile(Filefile, Stringmode) 创建从中读取和向其中写入(可选)的随机存取文件流,该文件由 File 参数指定。RandomAccessFile(Stringname, Stringmode) 创建从中读取和向其中写入(可选)的随机存取文件流,该文件具有指定名称。mode 参数指定用以打开文件的访问模式。允许的值及其含意为: 值含意r以只读方式打开。调用结果对象的任何 write 方法都将导致抛出 IOException。 rw打开以便读取和写入。如果该文件尚不存在,则尝试创建该文件。 rws打开以便读取和写入,对于 rw,还要求对文件的内容或元数据的每个更新都同步写入到基础存储设备。 rwd打开以便读取和写入,对于 rw,还要求对文件内容的每个更新都同步写入到基础存储设备。 方法摘要longgetFilePointer() 返回此文件中的当前偏移量。代表文件位置指针离开头的相离字节数。longlength() 返回此文件的长度。intread() 从此文件中读取一个数据字节。intread(byteb) 将最多 b.length 个数据字节从此文件读入字节数组。intread(byteb, intoff, intlen) 将最多 len 个数据字节从此文件读入字节数组。voidseek(longpos) 设置到此文件开头测量到的文件指针偏移量,在该位置发生下一个读取或写入操作。voidwrite(byteb) 将 b.length 个字节从指定字节数组写入到此文件,并从当前文件指针开始。voidwrite(byteb, intoff, intlen) 将 len 个字节从指定字节数组写入到此文件,并从偏移量 off 处开始。voidwrite(intb) 向此文件写入指定的字节。Serializable对象序列化串行化,对象序列化没有方法的接口,标记接口,代表一种规范(资格),无需程序员实现。在网络中传递对象流中传递对象对象序列化(发送)反序列化(接收时)想在流中传递对象,必须先对象序列化,实现方

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论