Java 输入输出机制.docx_第1页
Java 输入输出机制.docx_第2页
Java 输入输出机制.docx_第3页
Java 输入输出机制.docx_第4页
Java 输入输出机制.docx_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

1, 操作文件或目录的属性数据流Java中把一组由序的数据序列称为流,根据操作的类型,可以把流分成输入流和输出流。程序从输入流读取数据,从输出流写入数据。Java.io包包含一组流类它对各种常见的输入流和输出流进行了抽象。 用来访问文件的java.io.File类文件的定义:相关记录或放在一起的数据的集合。Java的File类提供定位本地文件系统,描述文件和目录的一个功能。File类对象即可表示文件,也可以表示一个目录。File 类构造方法:第一种构造方法:只有一个参数,它用来指定受操作的文件名,创建一个指向该文件的文件对象。File(String pathname)例如: File fl = new File (“c:hello.txt”);这个就是指向c盘的根目录下hello.txt文本文件的对象。注意:在windows操作系统当中我们的分隔符采用的是反斜杠,在其他的操作系统如Linux操作体统这个文件的分隔符应该就用斜杠。在这里用两个斜杠的意思就是其中有一个表示转换符。这里为了不出现斜杠的问题,最保险的办法是使用File.Separator静态成员。第二种构造方法:它有两个参数,其中第一个参数用来指定目录路径,第二个参数用来指定文件名。File(String dir,String subpath)例如:File f2 = new File(“c:myDoc”,”temp.txt”);第三个构造方法:跟第二种构造方法的使用基本一致,第一个参数指定根目录,第二个参数设置子目录或文件。File(File parent,String subpath)这个File对象是java.io包当中引用磁盘文件的唯一对象。File类仅仅用来描述File对象的属性,它并不说明数据时如何存储的。File类常用的方法:File类查看文件属性:判断文件的可读写性:输出结果:File类创建或删除文件和目录的方法 创建文件方法:以上这段代码表示如果文件不存在则创建一个空文件删除文件方法:以上这段代码表示如果文件存在则删除文件下面是调用创建文件方法和删除文件方法的示例:fm是类对象,f1和f2是文件对象。2, Java中的数据流读文件,是把文件当中的数据读取到内存中来。写文件,是把内存中的数据写到文件中去。Java中的流流,stream,是指一连串流动的字符,以先进先出的方式发送或者接受数据的通道。一个流,是一个输入设备或输出设备的抽象表示。可以写入到流当中,也可以从流当中读数据。输出流:向一个流写入数据时;输出流可以将信息送往程序的外部。输入流:从一个流当中读取数据时;原则上这些数据可以使用任何串行的数据源。流对象:在程序当中这些输入输出流的类的对象称为流对象。可以通过这些流对象将内存中的数据以流的方式写入文件。也可以通过流对象将文件中的数据以流的方式读取到内存中。流对象构造的时候往往和数据源(比如文件)会联系起来。数据源分为源数据源和目标数据源。输入流,联系的是源数据源。输出流,联系的是目标数据源。流分类一,按照流的流向进行划分,可以分为输入流和输出流。输入流,只能从中读取信息,而不能向其中写入信息。 输出流,只能向其中写入数据,而不能从中读取数据。二,按照处理数据单元划分,流又可以划分为字节流和字符流。字节流,操作的最小数据单元为8位的字节。字节流还可以划分为字节输入流和字节输出流。字符流,操作的最小数据单元是16位的字符。字符流也可以划分为字符输入流和字符输出流。流的基类输出流,OutputStream和Writer作为基类。输入流,InputStream和Reader作为基类。这四个基类都是抽象类,这四个基类只用来实现更具体的输入或输出功能子类的基类。字节流基类介绍字节流基类分为:字节输入流InputStream 字节输出流OutputStream1, InputStream体系结构字节输入流InputStream是所有输入流的基类,它是抽象类,本身不能创建实例来执行输入。所有的字节输入流都是InputStream类的字节或间接子类。1, FileInputStream用于从文件中读取数据。2, StringBufferInputStream是把字符串转换为输入流,注意这个类已经被废弃了,取而代之的是StringBufferReader。3, PipedInputStream连接一个PipedOutputStream用的,它是管道输入。4, ByteArrayInputStream把字节数组转换为输入流。5, FilterInputStream是个装饰类,有些地方也叫过滤器,它具有扩展其他输入流的功能。它还有实现的子类。InputStream类方法第一个read方法不带参数,它从输入流读取1个8位的字节,然后把它转换为0-255之间的整数返回。后两个read方法从输入流批量读取若干个字节。在从文件或键盘读数据时一般采用后两者方法可以减少读物理文件或键盘的时间,提高io操作效率。2, OutputStream体系结构字节输出流OutputStream也是一个抽象类,它用来作为所有表示字节输出流的其他类的基类。所有的字节输出流都是OutputStream类的字节或间接子类。1, FileOutputStream是向文件写入数据。2, FilterOutputStream扩展其他输出功能,他还有几个常用的子类。3, PipedOutputStream向管道中输出数据,与PipedInputStream搭配使用。4,ByteArrayOutputStream向字节数组,即内存缓冲区写入数据。OutputStream类方法从OutputStream派生出的子类,都将继承下面的几个与写数据有关的方法。Write方法有三个重载方法,如果在向控制台或文件批量写数据时,则选择后两种write方法将会提高io效率。flush方法可以理解为:清空缓冲区。注意:所有的这些方法在出现错误的时候都会抛出一个IOException异常。因此在使用这些类或者方法操作数据的时候一定要注意抓取异常。字符流基类介绍字符流基类分为:字符输入流Reader 字符输出流Writer1, Reader类体系结构1, BufferedReader是接受对象Reader作为参数并且对其添加字符缓冲器。2, CharArrayReader这个类允许将字符数组用做输入流。3, FilterReader允许过滤字符流的读取。4, InputStreamReader类从输入流读取字节,再根据映射算法将它们转化为Java的Unicode字符。它有一个常用的子类叫FileReader,FileReader使得读取字符文件称为可能,它使用缺省字符编码。其构造函数与FileInputStream类似完全相同的。Reader类方法2, Writer类体系结构这里强调两个类:一个是FileWriter,这个类允许将字符类型数据写入文件,它使用缺省字符编码和缓冲器大小。 另一个类是PrintWriter,包含一些使生成的格式化输出变得很简单的方法, 他可以用来代替PrintSteam。Writer类方法 表格中的方法是字符输出流的抽象基类Writer定义的需要被子类继承的方法。 由于字符流直接以字符作为单位,因此在Writer中字符数组以字符串来替代。 第一个方法有一个参数,这个参数的作用就是将这个参数字符串包含的字符输出到指定的输出流中。第二个方法就是将这个字符串里从off这个位置开始长度为len的字符输出到输出流中小常识:在数据被传输到流时,国际统一码将被自动地转换为本地计算机使用的编码,与字节流相比在字节流里字符是不进行自动转换的。如果写文本到文件中或写字符串表示数据时,就可以使用字符流。关闭流当执行完对文件或数据的操作后,都需要流关闭,这是因为输入输出流不属于内存的资源,系统无法进行回收。如果不关闭流,则资源会一直被占用,同时也无法对该文件进行下一步的操作。关闭流的方法是,close(),最好的是将close方法放在finally中。就是无论怎么样最后都要关闭它。3,文件的读写1, 文本文件的读写字节流用FileInputStream读文本文件用FileOutputStream写文本文件字符流用BufferedReader读文本文件用BufferedWriter写文本文件字节流类FileInputStream读取文本文件FileInputStream是inputStream的子类FileInputStream称为文件输入流,它的作用就是将文件中的数据输入到内存中,也就是读取文件的信息。FileOutputStream写文本文件FileOutputStream是OutputStream的子类FileOutputStream是文件输出流,它的作用是把内存中的数据输出到文件中去。也就是写文件。注意:第三个构造方法,在创建FileOutputStream实例的时,如果相应的文件并不存在,就会自动创建一个空的文件。如果参数file或name表示的文件路径尽管存在,但是代表一个文件的路径,一个目录,此时会抛出一个FileNotFoundException异常,就是文件没有找到的一个异常。在默认情况下,向文件写数据时,将覆盖文件中原有的内容。所以如果文件当中的内容不需要了,可以选取前两种方法,覆盖文件原有内容。第三个构造方法,里面有个布尔类型的参数append,如果将这个布尔类型的参数append设置为true,那么则可以避免覆盖文件中原有的内容。也就是在文件末尾追加数据。字符流类BufferedReader读文本文件BufferedReader是render的子类BufferedReader带有缓冲区,它可以先把一些数据读到缓冲区中,接下来的读操作都是从缓冲区获取数据,这样,可以避免每次都从数据源读取数据,进行字符编码转换,从而提高读操作的效率。它有两个构造方法。接受Reader对象作为参数,并对其添加字符缓冲器。这个代码片段,第一行创建一个InputStreamReader的对象isr,那它的标准输入 是从键盘输入System.in。然后将读取的内容放在BufferedReader 对象当中br。第二行创建了一个BufferedReader的对象br。然后程序读取数据数据的时候直接从br当中获取,这样,可以大大的提高效率。BufferedWriter写文本文件bufferedWriter是Writer的子类BufferedWriter与BufferedReader的流方向正好相反BufferedWriter是把一批数据写到缓冲区,当缓冲区满的时候,再把缓冲区的数据先写到字符流当中。这可以避免每次都执行物理写操作,从而提高io操作的效率。BufferedWriter换行方法newline()BufferedWriter写完文件内容后要用Flush()方法清空缓冲区然后在关闭流。读写二进制文件可以用两个类来进行:DataInputStream和DataOutputStream用字节流类DataInputStream读二进制文件DataInputstream与DataOutputStream搭配使用,可以按照与平台无关的方式从流中读取基本类型的数据,如读取int,Float,long,double和boolean等。此外,DataInputStream的readUTF方法还能读取UTF-8字符编码的字符串。 注意:DataInputStream类的所有读方法都是以read开头用字节流DataOutputStream写二进制文件DateOutputStream与DateInputStream搭配使用DataOutputStream可以按照与平台无关的方式向流中写入基本类型的数据,如int,float,long,double,和boolean等。此外,DataOutputStream的writeUTF方法还能写采用UTF-8字符编码的字符串。注意:DataOutputStream类的所有写方法都是以write开头。示例:DataOutputStream的构造方法:DataOutputStream(OutStream os) 其中的os表示指定将数据写入哪个输出流。输入输出流的使用原则重定向标准I/OJava.lang.System提供三个静态变量System.in从键盘输入 System.out输出到显示器 System.err将错误信息输出到显示默认情况下,System.in,System.out分别代表键盘和显示器,当程序通过System.in来获取输入时,实际上是从键盘读取输入,当程序试图通过System.out执行输出时,程序总是输出到显示器。有些时候就需要对这样的情况进行改变,也就是说重新将输入输出的默认改到文件或其他位置,而不再是键盘和显示器。这就涉及到重定向标准输入输出。重定向标准输出到文件重定向标准输入读取文件内容4,对象序列化所谓对象序列化是指将一个Java对象借助I/O流的形式,实现数据的传输或者保存。序列化的定义:序列化就是将对象的状态存储到特定存储介质中的过程。也可以解释为,是将对象状态转换为可保持或可传输的格式的过程。序列化就是将各种对象状态,保存起来,并且在必要的时候方便地将对象状态再读取出来。4.1为什么需要序列化?程序在运行过程中说创建的对象都位于内存中,当程序运行结束时,对象的生命周期就结束了。对象序列化和反系列化技术能简单的一劳永逸的将对象的信息保存下来进行读写操作,下次程序再启动时读取这些信息,还原这些对象,使它们持有与上次结束时相同的状态。4.2序列化的过程在序列化过程中,会将对象的公有成员,私有成员包括类名等等,都转换为字节流,然后再把字节流写入数据流,存储到存储介质中。这里的存储介质通常指的是文件。4.3序列化的意义使用序列化的意义在于将Java对象序列化后,可以将其转换为字节序列,这些字节序列可以被保存在磁盘上,也可以借助网络进行传输,同时序列化后的对象保存的是二进制状态,这样就实现了平台无关性,即可以在Windows系统中实现序列化一个对象,传输到一个Unix系统机器上,通过反序列化后得到这个对象,而不需担心数据因平台问题显示异常。4.4对象序列化的“聪明”之处对象序列化的“聪明”之处还体现在,不仅保存了对象的“全景图”而且能追踪对象内部所包含的所有引用,并保存那些对象,接着又能对对象内部包含的每个这样的引用进行追踪,以此类推,这种情况称为“对象网”,序列化构建一个对象的360度的全景天窗。4.5实现对象的序列化Java中,要求只有实现了java.io.Serializable这个接口的类的对象,才能被序列化。Jdk类库中有些,如String类,包装类和Data类,都实现了这个接口。实现Serializable这个接口不需要实现它的任何方法。4.6对象序列化的实现步骤对象序列化的实现步骤,可以概括成两大步骤:1, 创建一个对象输出流-ObjectOutputStream,它可以包含一个其他类型的输出流,比如文件输出流FileOutputStream。例如:创建一个ObjectOutputStream对象oos,它包装了一个文件输出流,就是C盘下myDoc文件夹下的stu.txt文件流。2, 通过对象输出流的WriteObject()方法写对象,也就是输出可序列化对象。例如:调用oos的writeObject()方法,对象stu为某Java类的对象4.7对象序列化的示例1,定义一个学生类Student,为了让它是可序列化的,让它实现接口java.io.Serializable。2,定义了 类SerializableObj,, 在这个类里将对Student对象信息写入磁盘文件。以上就简单的完成了序列化的过程,程序运行以后,就会在c盘的myDoc文件下生成stu.txt文件,这个文件的内容就是刚才Student对象的信息。(安娜,30岁,女)4.8实现反序列化如果希望从二进制流中恢复Java对象,则需要用到反序列化。反序列化的步骤:1, 创建一个对象输入流-ObjectInputStream,它可以包装一个其他类型的输入流,比如文件输入流FileInputStream。2,通过对象输入流的ReadObject()方法读取对象,该对象返回一个Object类型的对象,如果程序知道该Java对象的类型,则可以使用该对象强制类型转换成其真实的类型。4.9实现反序列化示例1,定义一个ObjectInputStream对象ois,来包装一个文件输入流。 这个文件输入流指向c盘myDoc下stu.txt文本文件。2,使用ReadObject()方法读取文件中的Java对象。并且进行了强制类型转换,将readObject()返回来的Object对象转换为Student类型。4.10,对于对象的序列化反序列化,需要强调的几点内容1,反序列化机制无需通过构造器来初始化Java对象。2,如果向文件中使用序列化机制写入多个对象,那么反序列化 在恢复对象时,必须按照写入的顺序读取。3,如果一个可序列化的类,有多个父类,包括直接或间接父类, 则这些父类要么也是可序列化的,要么有无参数的构造方法。 否则会抛出异常。4.11禁止序列化某属性信息出于对信息安全的考虑,某些信息属性就不应该被序列化。解决的办

温馨提示

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

评论

0/150

提交评论