• Java基础——IO


    一、概述

    I/O,Input/Output输入输出。输入机制比如读取文件数据、用户键盘输入等,输出,比如将数据输出到磁盘等。

    Java的IO是以流(Stream)为基础的。

    流的叫法十分形象,你可以想象数据在被读取或写入时动态的状态。
    如果把输入(出)设备当成一个管道,那么流就是这个管道中的information信息或数据。

    这里写图片描述

    二、体系

    这里写图片描述

    IO体系结构大致如上图所示,流式部分是基础也是重点。

    三、分类

    java中存在各式各样的流,按照不同的分类角度,先做个大致的了解。

    依据 内容
    流向 输入流、输出流
    数据单元 字节流、字符流
    角色 节点流、处理流

    1、流向

    输入流:只读不写
    输出流:只写不读

    从程序运行所在内存的角度来理解“方向”:

    1)输出
    这里写图片描述

    2)输入

    这里写图片描述

    2、数据单元

    字节、字符流的用法几乎完全一样,最大的区别就在于前者操作的是8位的字节,而后者是16位的字符。

    字节流的基类是InputStream、OutputStream,字符流是Reader和Writer。



    下面通过InputStream和Reader看一下,操作十分类似,核心方法read()也只是参数类型不同,一个byte,一个char。同样输出流也是如此。

    public abstract class InputStream implements Closeable {
         public int read(byte b[]) throws IOException {
            return read(b, 0, b.length);
        }
        ......
    }
    
    
    public abstract class Reader implements Readable, Closeable {
         public int read(char cbuf[]) throws IOException {
            return read(cbuf, 0, cbuf.length);
        }
    }

    字符/节的输出

    前面提到InputStream、Reader等都是抽象基类,因此例子中使用的实现类FileReader或FileInputStream。

    public static void main(String[] args) {
            try {
    
                //字符流
        FileReader fis=new FileReader("G:/TGB/Demo/TaotaoResult.java");
                char[] biff=new char[32];
    
                //字节流
                /*FileInputStream fis=new FileInputStream("G:/TGB/Demo/TaotaoResult.java");*/
                /*byte[] biff=new byte[1024];*/
    
                int hasRead=0;
    
                //重复读取
                while((hasRead=fis.read(biff))>0){
                    System.out.println(new String(biff,0,hasRead));
                }
                //关闭文件流
                fis.close();
            } catch (IOException e) {
    
                e.printStackTrace();
            }   
        }

    执行后,在Console中输出“G:/TGB/Demo/TaotaoResult.java”中的代码内容。

    字符/节的输入

    与输出相比,输入就比较容易了,不会涉及大量的循环读取。

    FileWriter fw;
        try {
            fw = new FileWriter("G:/TGB/Demo/1.txt");
            fw.write("你好");
            fw.write("hi");
            fw.write("hello");
        } catch (IOException e) {
    
            e.printStackTrace();
        }

    运行程序后,会在制定路径下生成1.txt文件,内容即给定的信息。

    3、角色

    节点流是与特定节点(如内存、设备等)读写数据,又称低级流。相应的,处理流是对一个已经存在的流进行连接或封装,高级流。

    处理流包装节点流是一种装饰模式的体现,更封装更加方便,因此也称为包装流。

    以InputStreamReader为例,来介绍处理流的使用。

    public static void main(String[] args) {
            try {
                //将System.in转换成Reader
                InputStreamReader reader=new InputStreamReader(System.in);
                //包装成BufferedReader,缓冲
                BufferedReader br=new BufferedReader(reader);
                String line=null;
                //只有输入exit时,程序退出
                while((line=br.readLine())!=null){
                    if(line.equals("exit")){
                        System.exit(1);;
                    }
                    System.out.println("输出:"+line);
                }
            } catch (Exception e) {
    
            }
        }

    System.in是java的标准输入流,即键盘输入。他是InputStream的实例,不方便使用。首先InputStreamReader将输入的文本内容转换为字符输入流,还可以包装一层缓冲,利于读取。

    小结

    这里写图片描述

    本篇博客介绍了Java IO的基本概念和操作,下篇博客继续介绍IO中的重要内容:序列化和NIO。

  • 相关阅读:
    mybatis文件映射之select操作返回List集合
    mybatis文件映射之使用#取值时的一些规则
    mybatis文件映射之获取参数值时#和$的区别
    Java之对象池
    Java多线程设计模式(6)两阶段终止模式
    Future和FutureTask
    Java多线程设计模式(3)读写锁模式
    Java中的对象池模式
    创建资源池(对象池)
    Java多线程设计模式之线程池模式
  • 原文地址:https://www.cnblogs.com/saixing/p/6730212.html
Copyright © 2020-2023  润新知