深入IO 想学必看!受益匪浅哦~

一:IO流概述

  IO流简单来说就是Input和Output流,IO流主要是用来处理设备之间的数据传输,Java对于数据的操作都是通过流实现,而Java用于操作流的对象都在IO包中。
   分类:
    按操作数据分为:字节流和字符流。如:Reader和InputStream
    按流向分:输入流和输出流。如:InputStream和OutputStream
  字节流的基类:
    InputStream  ,   OutputStream
  字符流的抽象基类:
    Reader , Writer
  缓冲流的基类:
    BufferReader,BufferWriter  (必须依赖于 Reader和Writer)
  二进制流的基类:
    DataInputStream,DataOutputStream (必须依赖于InputStream 和 OutputStream)
  序列化:
    ObjectInputStream,ObjectOutputStream (必须依赖于InputStream 和 OutputStream )

  我们的程序需要通过InputStream或Reader从数据源读取数据,然后用OutputStream或者Writer将数据写入到目标媒介中。其中,InputStream和Reader与数据源相关联,OutputStream和writer与目标媒介相关联。 以下的图说明了这一点:

二:字符流

1.字符流简介:
  01.字符流中的对象融合了编码表,也就是系统默认的编码表。我们的系统一般都是GBK编码。
  02.字符流 只用来处理文本数据,字节流用来处理媒体数据。
  03.数据最常见的表现方式是文件,字符流用来操作文件的子类一般是FileReader和FileWriter
2.字符流读写:
  注意事项:
    01.写入文件后必须要用flush()刷新
    02.用完流后记得要关闭流
    03.使用流对象要抛出IO异常
    04.定义文件路径时,可以用"/"或者"\\"
    05.在创建一个文件时,如果目录下有同名文件将被覆盖
    06.在读取文件时,必须保证该文件已存在,否则出异常
 
 示例:
 
public class CharDemo {
    public static void main( String[] args )
    {
        //创建输入和输出流
        Reader reader = null;
        Writer writer = null;
        try {
            //目的是明确数据要存放的目的地。  
            reader = new FileReader("e:/a.txt");
            writer = new FileWriter("e:/a.txt",true);
            //在文件中写入
            writer.write("啦啦啦");
            writer.write("啦啦啦");
            writer.write("我是卖报的小行家");
            //清空缓冲区
            writer.flush();
            writer.write("啦啦啦");
            writer.write("啦啦啦");
            writer.write("啦啦啦");
            writer.close();
            //读取
            //创建一次性读取多少个字符
            char[] data = new char[1024];
            int num = 0;
            StringBuffer sb = new StringBuffer();
            //判断如果文件中有数据,则在后面追加数据
            while ((num = reader.read(data))!=-1){
                sb.append(data);
            }
            System.out.println(sb.toString());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                // writer.close();应该放到添加数据完之后
                reader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

三:字节流 

   在Java中,字节流一般适用于处理字节数据(诸如图片、视频),字符流适用于处理字符数据(诸如文本文件),但二者并没有严格的功能划分,因为有转换流的存在,使得对于数据的处理变得更加灵活。InputStream和OutputStream分别是字节输入流与字节输出流的基类,它们的子类都是字节流,主要用在按字节来处理二进制数据。 

废话不多说,上示例!

public class ByteDemo {
    public static void main( String[] args )
    {
        //创建输入流和输出流对象
        InputStream inputStream = null;
        OutputStream outputStream = null;
        try {
            inputStream = new FileInputStream("e:/a.txt");
            //true 代表是否向文件中拼接,不删除之前的内容
            outputStream = new FileOutputStream("e:/a.txt",true);
            //先向文件写入内容
            outputStream.write("54321".getBytes());//outputStream.flush();自己没有实现
            //read方法将返回0-255之间的数字  如果流读到了最后,将返回-1
            int num = 0;
            while ((num=inputStream.read())!=1){
                System.out.println((char) num);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                inputStream.close();
                outputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

 四:二进制流

   二进制流有两个顶级类:InputStream和OutputStream, 下面的两个类是各种附属类。作为对比,二进制流的关系比字符流的更加多样化和复杂。关于二进制流,LineNumberInputStream和StringBufferInputStream两个类在JDK1.5中,尽量不要使用,因为它们已被弃用。
给你们看一个简单的小示例,来了解一下吧!
 
 
public class DataDemo {
    public static void main(String[] args) {
        //创建输入流和输出流对象
        InputStream inputStream = null;
        OutputStream outputStream=null;
        DataInputStream dis = null;
        DataOutputStream dos=null;
        try {
            //获取了输入流   txt进入内存
            inputStream=new FileInputStream("e:/a.txt");
            dis=new DataInputStream(inputStream);
            //获取输出流
            outputStream=new FileOutputStream("e:/public/a.txt");
            dos=new DataOutputStream(outputStream);
            //先读取
            int num=0;
            while ((num=dis.read())!=-1){
                dos.write(num);  //复制
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {  //释放资源
            try {
                dos.close();
                dis.close();
                outputStream.close();
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

猜你喜欢

转载自www.cnblogs.com/fl72/p/9266533.html