zoukankan      html  css  js  c++  java
  • JavaIo编程基础复习

    什么是Io

    io是指Input和Output,指输入和输出 Input是指外部读入数据到内存,例如读取一个文件,或者从网络中读取 Output是指把内存中的数据输出到外部,例如写文件,输出到网络

    什么是Io流(InputStream/OutputStream)

    Io流是顺序读写数据的模式 数据是单向流动的,类似自来水再水管的流动,所以称为IO流 二进制数据以Byte为最小单位在InputStream/OutputStream中单向流动

    读取的数据是中文(Reader/Writer)

    如果字符不是单字节表示的ASCI,Java提供了Reader/Writer表示字符流 字符数据以char为最小单位在Reader/Writer中单向流动 字符流输出的Byte取决去编码方式 Reader/Writer本质上是一个能够自动编解码的InputStream/OutputStream,再读取数据源的Byte自动做了编解码

    什么是同步Io和异步Io

    同步Io:读写Io时等待读取的数据返回时才会执行后面的代码,代码编写简单,执行效率低 异步Io:读写Io仅仅发出请求,立刻执行后面代码,代码编写复杂,执行效率高 JDK提供的java.io是同步Io,java.nio是异步Io

    Java.io有哪些抽象类

    Java.io提供的总共有4个抽象类,分别是InputStream/OutputStream以及Reader/Writer,其中Reader/Writer就是对InputStream/OutputStream进行了自动编解码的包装 当然他们的实现类有很多,以读写文件为例,有FileInputStream/FileOutputStream,以及FileReader/FileWriter

    File对象

    java.io.File表示文件系统的一个文件或者目录: 
    - isFile():是否是文件
    - isDirectory():是否是目录 
    创建File对象本身不涉及IO操作 
    获取路径/绝对路径/规范路径:getPath() / getAbsolutePath() / getCanonicalPath() 
    文件操作:
    - canRead():是否允许读取该文件
    - canWrite():是否允许写入该文件 
    - canExecute():是否允许运行该文件 
    - length():获取文件大小 
    - createNewFile():创建一个新文件 
    - static createTempFile():创建一个临时文件 
    - delete():删除该文件 
    - deleteOnExit():在JVM退出时删除该文件 
    目录操作: 
    - String[] list():列出目录下的文件和子目录名 
    - File[] listFiles():列出目录下的文件和子目录名 
    - File[] listFiles(FileFilter filter) 
    - File[] listFiles(FilenameFilter filter)
    - mkdir():创建该目录 
    - mkdirs():创建该目录,并在必要时将不存在的父目录也创建出来
    - delete():删除该目录

    InputStream对象

    InputStream是所有输入流的超类:
    - int read()读取一个字节 
    - int read(byte[])读取若干字节并填充到byte[]数组 
    read()方法是阻塞(blocking)的 
    使用try(resource)可以保证InputStream正确关闭 
    常用InputStream: 
    - FileInputStream 
    - ByteArrayInputStream

    案例:使用InputStream/OutputStram拷贝一个文件的示例

       public static void main(String[] args) throws IOException {
            InputStream inputStream = new FileInputStream("C:\Users\jimisun\Desktop\hello.txt");
            OutputStream outputStream = new FileOutputStream("C:\Users\jimisun\Desktop\hello1.txt");
            int n;
            byte[] buff = new byte[1000];
    
            while ((n = inputStream.read(buff)) != -1) {
                outputStream.write(buff,0,n);
            }
            inputStream.close();
            outputStream.close();
        }

    OutputStream对象

    OutputStream是所有输出流的超类:
    - write(int b)写入一个字节 
    - write(byte[])写入byte[]数组的所有字节
    - flush()方法将缓冲器内容输出
    - write()方法是阻塞(blocking)的 
    使用try(resource)可以保证OutputStream正确关闭 
    常用OutputStream:
    - FileOutputStream
    - ByteArrayOutputStream

    案例:使用OutputStram向一个文件中输入"hello你好"

        public static void main(String[] args) throws IOException {
            OutputStream outputStream = new FileOutputStream("C:\Users\jimisun\Desktop\hello1.txt");
            byte [] b1 = "hello".getBytes("UTF-8");
            byte [] b2 = "你好".getBytes("UTF-8");
            outputStream.write(b1);
            outputStream.write(b2);
            outputStream.close();
        }

    对InputStream/OutputStram进行增强Filter模式

    Filter模式是为了解决子类数量爆炸的问题。
    直接提供数据的InputStream:
    - FileInputStream 
    - ByteArrayInputStream 
    - ServletInputStream 
    提供附加功能的InputStream从FilterInputStream派生:
    - BufferedInputStream 
    - DigestInputStream
    - CipherInputStream 
    - GZIPInputStream 
    Filter模式又称Decorator模式,通过少量的类实现了各种功能的组合。
    FilterOutputStream和FilterInputStream类似

    案例:缓冲读取一个GZ压缩后的文件

        public static void main(String[] args) throws IOException {
            InputStream inputStream = new GZIPInputStream(new BufferedInputStream(new FileInputStream("C:\Users\jimisun\Desktop\hello1.txt.gz")));
            ByteOutputStream byteOutputStream = new ByteOutputStream();
            int n;
            byte[] buff = new byte[1024];
            while ((n = inputStream.read(buff)) != -1) {
                byteOutputStream.write(buff, 0, n);
            }
            byte[] data = byteOutputStream.toByteArray();
            String text = new String(data, "UTF-8");
            System.out.println(text);
        }
    Java io使用Filter模式为InputStream/OutputStream增加功能
    可以把一个InputStream和任意的FilterInputStream组合
    可以把一个OutputStream和任意的FilterOutputStream组合
    Filter模式可以在运行期动态增加功能(又称Decorator模式)

    读取classpath下的文件资源

    classpath资源 classpath中可以包含任意类型的文件。 从classpath读取文件可以避免不同环境下文件路径不一致的问题。

    案例:读取classpath资源

    try(InputStream input = getClass().getResourceAsStream("/default.properties"))
        {   if (input != null) 
            {         // Read from classpath     }
        } 

    序列化与反序列化

    序列化是指把一个Java对象变成二进制内容(byte[]) 
    Java对象实现序列化必须实现Serializable接口
    反序列化是指把一个二进制内容(byte[])变成Java对象 使用ObjectOutputStream和ObjectInputStream实现序列化和反序列化
    readObject()可能抛出的异常: 
    - ClassNotFoundException:没有找到对应的Class
    - InvalidClassException:Class不匹配 
    反序列化由JVM直接构造出Java对象,不调用构造方法 
    可设置serialVersionUID作为版本号(非必需)

    案例:把person类进行序列化和反序列化

    public static void main(String[] args) throws IOException, ClassNotFoundException {
            String dataFile = "saved.data";
            try (ObjectOutputStream output = new ObjectOutputStream(
                    new BufferedOutputStream(new FileOutputStream(dataFile)))) {
                // 依次写入 int, String, Person:
                output.writeInt(999);
                output.writeUTF("Hello, world!");
                output.writeObject(new Person("Xiao Ming"));
            }
            System.out.println("Read...");
            try (ObjectInputStream input = new ObjectInputStream(new BufferedInputStream(new FileInputStream(dataFile)))) {
                // 依次读入 int, String, Person:
                System.out.println(input.readInt());
                System.out.println(input.readUTF());
                Person p = (Person) input.readObject();
                System.out.println(p);
            }
        }

    Reader对象

    Reader以字符为最小单位实现了字符流输入:
    int read() 读取下一个字符 
    int read(char[]) 读取若干字符并填充到char[]数组 
    常用Reader类:
    - FileReader:从文件读取 
    - CharArrayReader:从char[]数组读取 Reader是基于InputStream构造的,任何InputStream都可指定编码并通过InputStreamReader转换为Reader:
    Reader reader = new InputStreamReader(input, "UTF-8") 

    案例:使用Reader读取一个文件

        public static void main(String[] args) throws IOException {
            Reader reader = (new FileReader("C:\Users\jimisun\Desktop\hello1.txt"));
            int n;
            while ((n = reader.read()) != -1) {
                System.out.print((char) n);
            }
        }

    Writer对象

    Writer以字符为最小单位实现了字符流输出:
    write(int c) 写入下一个字符 write(char[]) 
    写入char[]数组的所有字符 
    常用Writer类:
    - FileWriter:写入文件
    - CharArrayWriter:写入char[]数组 Writer是基于OutputStream构造的,任何OutputStream都可指定编码并通过OutputStreamWriter转换为Writer:
    Writer writer = new OutputStreamWriter(output, "UTF-8") 

    案例:使用Writer写入文件内容

     public static void main(String[] args) throws IOException {
            FileWriter writer = (new FileWriter("C:\Users\jimisun\Desktop\hello1.txt"));
            writer.write("我是");
            writer.write("jimisun");
            writer.close();
        }
  • 相关阅读:
    openssh升级到openssh-7.5p1踩坑
    office online server部署和简单操作
    aspnetmvc和aspnetcoremvc的一些区别
    office web app server部署和简单操作
    PHP之cURL
    认识PHP的全局变量
    认识Linux系统/etc/hosts
    git学习——stash命令(4)
    Linux netstat命令
    phpstorm+xdebug
  • 原文地址:https://www.cnblogs.com/jimisun/p/9425505.html
Copyright © 2011-2022 走看看