IO流

来源:互联网 发布:web服务器 nginx 编辑:程序博客网 时间:2024/05/13 10:02

一、流定义、流分类、流操作

 1.流我们可以形象的比喻成水流,他有起点和终点。在Java中即是两个设备之间的传输 称之为流。根据不同的传输方式,分为不同的流类。

2.流的分类:
   按流向分为输入流和输出流;
   按传输单位分为字节流(Stream)结尾的和字符流(Reader和Writer);
   按功能还可以分为节点流和过滤流。
   节点流:负责数据源和程序之间建立连接;(相当于裸枪)
   过滤流:用于给节点增加功能。(相当于功能零部件)
   过滤流的构造方式是以其他流位参数构造(这样的设计模式称为装饰模式)。
   I/O流使用完后必须调用close()方法关闭流并释放资源。以便更好的利用资源。

3.流操作的基本规律:
(1)明确源和目的
        源:输入流 inputstream reader
        目的:输出流 outputstream writer
  (2)是否是文本?yes 字符流/no 字节流
(3)明确使用哪个具体的对象、
       源设备:内存、硬盘、键盘
       目的设备:内存、硬盘、控制台
4.Inputstreamreader 是字节流通向字符流的桥梁  Outputstreamwriter是字符流通向字节流的桥梁。
5.newline()是缓冲字符的方法 可以换行。flush()手动刷新缓冲区。toUpperCase()小写变大写

二.File类:我们猛看起来像是文件,其实他也可以指代一个文件集,当作为文件集时我们可以对此调用List方法。

       这个类的常用构造有:File("路径"),File(“前边路径”,“后边路径”)File(File,“路径”)
       这个类的常用方法:exists(),delete(),getName(),getPath(),isDirectory(),isFile(),length(),
                        listFile(FileFilter),主要用来过滤文件这里有(可以用来嵌套内部类)
                        mkdir(),mkdirs(),toString(),
       FileFilter接口只有accept方法,其返回值为Boolean型,可以在其里边写一些正则表达式来对文件进行筛选。
       这里需要注意的是传入accept的参数必须是final类型(匿名内部类的要求),这样他才能使用该类范围之外的队像。
       顺便讲讲:内部类优点 高聚拢性,缺点在于不易阅读,谨慎使用。

三.字节流:
          InputStream/OutputStream 所有输入输入流的父类,是抽象类。
           BufferedInputStream/BufferedOutputStream 字节缓冲流 用于给节点流增加一个缓冲的功能。(牺牲空间换时间)
      1.字节输入流:io包中的InputStream为所有字节输入流的父类。
         Int read();读入一个字节(每次一个);
         可先使用new byte[]=数组,调用read(byte[] b)
         read (byte[])返回值可以表示有效数;read (byte[])返回值为-1 表示结束。
      2.在流中close()方法由程序员控制。因为输入输出流已经超越了JVM的边界,所以有时可能无法回收资源。
         原则:凡是跨出虚拟机边界的资源都要求程序员自己关闭,不要指望垃圾回收。 
四、字节流的字符编码:
     字符编码把字符转换成数字存储到计算机中,按ASCii 将字母映射为整数。
     把数字从计算机转换成相应的字符的过程称为解码。
     乱码的根源在于编解码方式不统一。在世界上任何一种编码方式中都会向上兼容ASCII码。所以英文没有乱码。
     编码方式的分类:
     ASCII(数字、英文):1 个字符占一个字节(所有的编码集都兼容ASCII)
     ISO8859-1(欧洲):1 个字符占一个字节
     GB-2312/GBK:1 个字符占两个字节。GB代表国家标准。
     GBK是在GB-2312上增加的一类新的编码方式,也是现在最常用的汉字编码方式。
     Unicode: 1 个字符占两个字节(网络传输速度慢)
     UTF-8:变长字节,对于英文一个字节,汉字三个字节。
     原则:保证编解码方式的统一,才能不至于出现错误。  
    I/O学习种常范的两个错误 1。忘了加flush2.没有加换行。
五。字符流
 1. Reader/Writer所有字符流的父类
  其子类有
  InputStreamReader/OutputStreamWriter 称为从字节流到字符流的桥转换类。这个类可以设定字符转换方式
  FileReader/FileWriter (FileInputStream/FileOutputStream和InputStreamReader/OutputStreamWriter)的组合,只能是本地默认编码
   2.Bufferedreader/BufferedWriter  字符缓冲流,其特有方法readLine()读取一个文本行,newLine()表示Writer到下一个文本行

   3.filewriter使用的是默认的编码表,GBK。存储时,若果需要加入制定的编码表utf-8时可以使用对象   

  4. outputstreamwriter该对象接受一个字节输出流,还有操作文本的字节输出流fileoutputstream.  5.system.setin()修改输入源目的   system.setout()修改输出目的。
六、打印流
打印流:该流提供了打印方法,可以将各类型的s数据都原样打印
 字节打印流:printstream
  构造函数可以接受的类型
  1.file对象。file
  2.字符串路径;string
  3.字节输出流;outputstream
   字符打印流:printwriter
构造函数可以接受的类型
  1.file对象。file
  2.字符串路径;string
  3.字节输出流;outputstream
  4.字符输出流;writer
七、randomAccessFile
RandomAccessFile它不是IO体系中的子类,而是直接继承自Object,但他是io体系中的成员,因为它具备流
和写的能力,内部封装了一个数组,而且通过数组对指针的元素进行操作,可以通过getfilepoint获取指针位置,同时通过seek改变指针位置。他封装了字节输入流和输出流,她只能操作文件,而且还有模式。
八.如何将流中的数据存储到集合中;
   1. properties是hastable的子类;
   它具备map集合的特点。里卖弄存储的都是字符串;
   是集合与IO技术相结合的集合容器;
   该对象特点用于配制键值对形式的文件;
   需要数据有固定的格式:键=值;
2.
    如何将文件的键值数据存到集合中进行操作。
   1.将流和文件进行关联
   2.读取数据用=进行切割;
   3.=左边为键,右边为值 存储到集合中。

九、递归

    函数自身调用自身这种手法称谓递归。
     实例(1)public void showdir(File f){
        System. err.println(f);
        
        File[] file=f.listFiles();
         for(int x=0;x<file.length;x++){
             if(file[x].isDirectory())
                showdir(file[x]);
                 else
                    System. err.println(file[x]);                        
        }  
    }

 


十.对象序列化
   1. 定义:把一个对象通过I/O流写到文件(持久性介质)上的过程叫做对象的序列化。
   2. 序列化接口:Serializable此接口没有任何的方法,这样的接口称为标记接口。

   3. 不是所有对象都能序列化的,只有实现了Serializable的类,他的实例对象才是可序列化的。
   4. ObjectOutputStream 和ObjectInputStream他是对象过滤流,使节点流直接获得输出对象
    (1)writeObject(Object b)
    (2)readObject();该方法返回的是读到的一个对象,但是需要我们注意的是,该方法不会以返回null表示读到文件末尾。
     而是当读到文件末尾时会抛出一个IOException;

      (3)只能输出堆里面的对象变量,静态的不能输出,要输出对象需要实现Serializable序列流,他没有任何方法,称为标记流;
 

0 0
原创粉丝点击