黑马程序员---java的IO系统学习总结

---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------

 java的IO系统学习总结
 1.IO即我们说的输入输出,在java中分为输入流输出流,根据流对字符的处理方式,又分为了字符流字节流writer和reader是所有字符流的父类inputstream和
  outputStream是所有字节流的父类
字节流向字符流转换需要用到转换流,即inputStreamReader和outputStreamWriter,在转换流中可以设置转换编码表,转换流
  是字符流的子类。

 
  2.fileInputStream是inputStream的子类,这是一个操作文件的流对象,他有三个构造函数,可以以三种不同的方式创建或链接到一个文件,我们常用的是以文件名加路径的方式
  访问或创建本地文件
,也可以以file对象的方式来创建或访问文件,fileInputStream对文件的操作可以以字节为单位,也可以以数组为单位,以字节操作的话,用的是read()函数,
  以数组来操作的话用的是read(byte[]b)函数。


  3.fileOutputStream是outputStream的子类,和fileinputStream一样,他也是直接操作文件的流对象,他有五个构造函数,其中三个和inputStream类似,另外两个带一个
  参数,用来控制是以追加的方式还是以覆盖的方式保存文件,他操作文件常用的两个函数是write()和write(byte[] b),其用法和inputstream相同,因其内部都没有缓冲区
  因此如果频繁的读写效率很低,可以通过bufferedInputstream和bufferedOutputStream来包装他们,以提高效率


  4,可以通过转换流将字节流封装到字符流里,这种模式叫装饰器模式,因为所有的字符流内部都自带缓冲区,频繁的读写操作可以通过缓冲区周转,这样可以提高IO的利用率


  5.fileReader和fileWriter是操作文件的字符流对象,它对从文件读取的数据进行查表操作,如果文件中含有非字符数据,用它读取的数据可能和原数据不同,因为对于查表没查到
  的数据,reader或writer会用表示未知的字符来填充,他操作文件的方法定义和构造函数定义都和上面的fileinputStream和fileoutputStream很像。


  6.Objectinputstream和ObjectoutputStream是操作对象的字节流,他们可以将堆中运行的动态对象序列化在本地或从本地加载对象,被保存在本地的对象本身必须具备可
  串行化
,也就是要实现Serializable接口静态变量(static关键字修饰)和瞬态变量(transient关键字修饰)序列化保存在本地,被本地化的对象内部有一个serialVersionUID字段
  用它来表示对象对应的类的版本
,对类的修改将改变这个字段值,也可以显示的指定这个字段值,当加载本地对象时,会比较类中的这个字段和对象中的这个字段是否相等
  相等才能加载成功。写入对象用到的函数是writeObject()函数,读取对象用到的是readObject()函数,另外这两个流对象中还有一个特殊的函数,writeUTF和readUTF函数
  他们能写入设备无关的修改的UTF-8字符,对于用writeUTF写入的字符,只能用readUTF来读取,用其它的方式读取的结果是未定义的。


  7.dataInputstream和dataOutputstream是操作基本数据类型的流对象,他允许应用程序以与设备无关的方式从底层读取基本的java数据类型,或将基本数据数据类型以适当
  的方式写入输出流中
,常用的操作数据的函数是:

    dataInputStream:

    readboolean()读取一个布尔型数据

    readbyte()读取一个字节,

    readchar()读取一个字符,

    readdouble()读取一个双精度浮点数,

    readfloat()读取一个浮点数,

    readint()读取一个整数,

    readlong()读取一个长整数,

    readshort()读取一个短整数。

  dataoutputstream:
   writeboolean()
写入一个布尔型数据,

   writebyte()写入一个字节,

   writechar()写入一个字符,

   writedouble()写入一个双精度浮点数,

   writefloat()写入一个浮点数
   writeint()写入一个整数,

   writelong()写入一个长整数,

   writeshort()写入一个短整数。
  8.bytearrayInputStream和bytearrayOutputStream,这两个流对象的源和目的都是byte数组,其不涉及底层的IO操作,不会产生IO异常,其用法和fileInputstream和fileOutputStream 相似


  9.pipedInputStream和pipedOutputStream,通过这两个流对象,不同进程或不同线程间可以进行大批量的快速的数据交互一个pipedinputStream要和一个pipedoutputStream绑定
  这样才能进行操作,其操作和其它流操作类似。


  10.PrintStream打印流对象,它能够方便的打印各种数据值表现形式,而且他不会抛出任何异常,PrintStream打印的字符都以平台默认的字符编码转换为字节。

  11.sequenceinputstream的输入源是多个输入流,他从各个输入流中依次读取数据,当输入源是两个流时,可以用它的SequenceInputStream(InputStream s1, InputStream s2)构造函数
  来初始化,当输入源是两个以上的流时,要用到SequenceInputStream(Enumeration<? extends InputStream> e)构造函数。


  12.fileReader和fileWriter是字符文件的便携流对象,他们使用平台默认的字符编码从文件中读取字符数据,若想指定字符编码可以在inputStreamreader和outputStreamwriter中设置.


  13.bufferedReader和bufferedWeriter在reader和writer的基础上,设置了内部缓冲区,同时增加了一个特有方法readline()和writeline(),可以以行为单位来读取或写入
  字符数据
,因此建议操作字符首选这个流对象。


  14.inputStreamReader和outputStreamWriter转换流对象,当想以操作字符流的方式操作字节流时,可以用这个转换流对象将字节流转换成字符流,在转换流中可以设置
  字符编码
  15.linenumberReader,跟踪行号的缓冲字符输入流,此类定义了方法 setLineNumber(int) 和 getLineNumber(),它们可分别用于设置和获取当前行号。 默认情况下,
  行编号从 0 开始。该行号随数据读取在每个行结束符处递增,并且可以通过调用 setLineNumber(int) 更改行号。但要注意的是,setLineNumber(int) 不会实际更改流中的当前位置; 
  它只更改将由 getLineNumber() 返回的值。可认为行在遇到以下符号之一时结束:换行符('\n')、回车符('\r')、回车后紧跟换行符。


  16.pipedReader和pipedWriter,带缓冲的字符管道流对象,通过它可以在不同进程或线程间传送字符数据,用法和其它流类似,一个pipedreader必须连接一个pipedwriter才能正常工作


  17.printwriter,向文本输出流打印对象的格式化表示形式。此类实现在 PrintStream 中的所有 print 方法。它不包含用于写入原始字节的方法,对于这些字节,
  程序应该使用未编码的字节流进行写入。 与 PrintStream 类不同,如果启用了自动刷新,则只有在调用 println、printf 或 format 的其中一个方法时才可能完成此操作,
  而不是每当正好输出换行符时才完成。这些方法使用平台自有的行分隔符概念,而不是换行符。

 18.randomAccessFile, 父类为Object的独立的文件操作流对象,这个流对象支持对文件的随机读取和写入,可以在创建这个对象的时候指定读取或写入文件的方式
 可选的方式是:“r”:只读方式,"rw"读写方式,若文件不存在则创建文件。“rws”读写方式,并且每次写入都不缓存,直接写入文件,“rwd”读写方式,
 对文件内容的每个更新都同步写入到底层存储设备
。 其操作与其他流类似,他有一个特有函数seek(),可以设置输入的位置.


 19.StringReader和StringWriter,源或目的为字符串的字符流,操作和其它字符流类似。


 20.当我们操作文件时,还常常用到fileFilter和filenameFilter,即文件过滤器,可以通过它来筛选我们想要的文件,我们可以实现它的接口并重写它的accept方法来定义具体的
 筛选规则。


 以下是一些示例:


 1通过filenameFilter过滤文件:

  

/**
 *File类的list函数可以接受一个filenameFilter对象,list函数
 *将遍历到的每个文件的文件名传递给filenameFilter对象中的accept函数
 *当这个函数返回真时就列出这个文件,当accept函数返回假时就不列出
 *这个文件,从而实现了通过文件名过滤文件的目的,具体的文件名过滤
 *规则要在accept函数中进行定义
 */
 File myfile=new File("D:\\");
 String dir=myfile.list(new filenameFilter(){
 boolean accept(File dir,String name){
 if(name.endwith(".txt"))//定义文件名过滤规则
 return true;
 return false;
 }
 });


 2.将字节流通过转换流对象用字符流进行包装:
 bufferedreader br=new bufferedreader(new inputstreamreader(new fileinputstream("D:\\my.txt")));//包装类的标准写法
 bufferedwriter bw=new bufferedwriter(new outputstreamwriter(new fileoutputstream("D:\\out.txt")));//包装类的标准写法


 3.通过转换流设置字符编码:
 inputstreamreader isr=new inputstreamreader(new fileinputstream("D:\\my.txt"),"utf-8");//设置字符编码只能在转换流中进行
 outputstreamwriter osr=new outputstreamwriter(new fileoutputstream("D:\\out.txt"),"gbk")


 4.管道流的使用方式:
  pipedinputstream pis=new pipedinputstream();
  pipedoutputstream pos=new pipedoutputstream();//从管道流中读取数据前要确保两个管道流之间已经建立连接,否则会出异常
  pis.connect(pos);//连接到另一个管道流,连接成功后就可以像其他流那样从管道流中读取或写入数据了


  5.randomaccessfile的用法:
   randomaccessfile raf=new randomaccessfile("D:\\my.txt","rw")//初始化时指定操作方式
   raf.seek(25)//设置输入位置
   raf.readline()//读取一行
   raf.write(byte[]b)//写入数据,因其操作和其它流类似,不再举例 

 


---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------

详细请查看:www.itheima.com 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值