第一章 java 基础 - 08.IO输入流与输出流

无意间都到一篇《走心的安卓工程师跳槽经验分享》,发现自己工作几年了,技术方面虽然有了飞跃的进步,可是不知道自己的技术到了什么地步,每个方面我都涉及到了,但都不深,这大概是初级工程师的诟病吧!
即使知道也不知道从何下手,非常感谢《走心的安卓工程师跳槽经验分享》的作者!
感兴趣的朋友和我一起走下去吧!

08.IO输入流与输出流

java的核心库java.io提供了全面的IO接口。包括:文件读写、标准设备输出等。Java中IO是以流为基础进行输入输出的,所有数据被串行化写入输出流,或者从输入流读入。

java.io 的描述
通过数据流、序列化和文件系统提供系统输入和输出。


流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。这时候你就可以想象数据好像在这其中“流”动一样。

Java流输入输出原理
Java把这些不同来源和目标的数据都统一抽象为数据流。Java语言的输入输出功能是十分强大而灵活的,美中不足的是看上去输入输出的代码并不是很简洁,因为你往往需要包装许多不同的对象。
在Java类库中,IO部分的内容是很庞大的,因为它涉及的领域很广泛:标准输入输出,文件的操作,网络上的数据流,字符串流,对象流,zip文件流。

Java流的分类
按流向分:
输入流: 程序可以从中读取数据的流。
输出流: 程序能向其中写入数据的流。
按数据传输单位分:
字节流: 以字节为单位传输数据的流
字符流: 以字符为单位传输数据的流
按功能分:
节点流: 用于直接操作目标设备的流
过滤流: 是对一个已存在的流的链接和封装,通过对数据进行处理为程序提供功能强大、灵活的读写功能。

java.io常用类
JDK所提供的所有流类位于java.io包中,都分别继承自以下四种抽象流类。
InputStream:
继承自InputStream的流都是用于向程序中输入数据的,且数据单位都是字节(8位)。
OutputStream:
继承自OutputStream的流都是程序用于向外输出数据的,且数据单位都是字节(8位)。
Reader:
继承自Reader的流都是用于向程序中输入数据的,且数据单位都是字符(16位)。
Writer:
继承自Writer的流都是程序用于向外输出数据的,且数据单位都是字符(16位)。

接口摘要
Closeable
是可以关闭的数据源或目标。
DataInput
接口用于从二进制流中读取字节,并根据所有 Java 基本类型数据进行重构。
DataOutput
接口用于将数据从任意 Java 基本类型转换为一系列字节,并将这些字节写入二进制流。
Externalizable
实例类的唯一特性是可以被写入序列化流中,该类负责保存和恢复实例内容。
FileFilter
用于抽象路径名的过滤器。
FilenameFilter
实现此接口的类实例可用于过滤器文件名。
Flushable
是可刷新数据的目标地。
ObjectInput
扩展 DataInput 接口以包含对象的读操作。
ObjectInputValidation
允许验证图形中对象的回调接口。
ObjectOutput
扩展 DataOutput 接口以包含对象的写入操作。
ObjectStreamConstants
写入 Object Serialization Stream 的常量。
Serializable
类通过实现 java.io.Serializable 接口以启用其序列化功能。

类摘要
BufferedInputStream
为另一个输入流添加一些功能,即缓冲输入以及支持 mark 和 reset 方法的能力。
BufferedOutputStream
该类实现缓冲的输出流。
BufferedReader
从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
BufferedWriter
将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
ByteArrayInputStream
包含一个内部缓冲区,该缓冲区包含从流中读取的字节。
ByteArrayOutputStream
此类实现了一个输出流,其中的数据被写入一个 byte 数组。
CharArrayReader
此类实现一个可用作字符输入流的字符缓冲区。
CharArrayWriter
此类实现一个可用作 Writer 的字符缓冲区。
Console
此类包含多个方法,可访问与当前 Java 虚拟机关联的基于字符的控制台设备(如果有)。
DataInputStream
数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。
DataOutputStream
数据输出流允许应用程序以适当方式将基本 Java 数据类型写入输出流中。
File
文件和目录路径名的抽象表示形式。
FileDescriptor
文件描述符类的实例用作与基础机器有关的某种结构的不透明句柄,该结构表示开放文件、开放套接字或者字节的另一个源或接收者。
FileInputStream
从文件系统中的某个文件中获得输入字节。
FileOutputStream
文件输出流是用于将数据写入 File 或 FileDescriptor 的输出流。
FilePermission
此类表示对文件和目录的访问。
FileReader
用来读取字符文件的便捷类。
FileWriter
用来写入字符文件的便捷类。
FilterInputStream
包含其他一些输入流,它将这些流用作其基本数据源,它可以直接传输数据或提供一些额外的功能。
FilterOutputStream
此类是过滤输出流的所有类的超类。
FilterReader
用于读取已过滤的字符流的抽象类。
FilterWriter
用于写入已过滤的字符流的抽象类。
InputStream
此抽象类是表示字节输入流的所有类的超类。
InputStreamReader
是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。
LineNumberInputStream
已过时。此类错误假定字节能充分表示字符。

 /**
     * 获取输入字节流 8位
     *
     * @return
     */
    public static void getInputStreamByByte() throws IOException {
        Log.e(TAG, "getInputStreamByByte: 获取输入字节流");
        String path = Environment.getExternalStorageDirectory().getPath();
        //输入目标文件
        File file = new File(path, "config_yt");
        //定义输入流
        InputStream is = new FileInputStream(file);
        // 进行读操作
        byte b[] = new byte[1024];
        //读取长度
        int read = 0;

        int length;
        while ((length = is.read(b)) != -1) {
            //字节装换成字符输出
            Log.e(TAG, "getInputStream: 读取的内容:" + new String(Arrays.copyOf(b, length), "utf-8"));
            read += length;
        }
        //关闭流
        is.close();
        Log.e(TAG, "getInputStream: 读入数据的长度:" + read);
    }
 /**
     * 获取输入字符流 16位
     *
     * @return
     */
    public static void getInputStreamByString() throws IOException {
        Log.e(TAG, "getInputStreamByString: 获取输入字符流");
        String path = Environment.getExternalStorageDirectory().getPath();
        //输入目标文件
        File file = new File(path, "config_yt");
        //定义输入流
        FileReader reader = new FileReader(file);
        BufferedReader br = new BufferedReader(reader);
        String result;
        while ((result = br.readLine()) != null) {
            Log.e(TAG, "getInputStream: 读取的内容:" + result);
        }
        //关闭流
        br.close();
        reader.close();
    }
 /**
     * 获取输出字节流 8位
     *
     * @return
     */
    public static void getOutStreamByByte() throws IOException {
        Log.e(TAG, "\n\n getOutStreamByByte: 获取输出字节流");
        String path = Environment.getExternalStorageDirectory().getPath();
        //输入目标文件
        File file = new File(path, "config_yt");
        //定义输入流
        OutputStream out = new FileOutputStream(file, false);//false? 覆盖:追加
        // 准备一个字符串
        String str = "yancyang";
        // 只能输出byte数组,所以将字符串变为byte数组
        byte b[] = str.getBytes("utf-8");
        // 将内容输出,保存文件
        out.write(b);
        // 关闭输出流
        out.close();
    }
/**
     * 获取输出字符流 16位
     *
     * @return
     */
    public static void getOutStreamByString() throws IOException {
        Log.e(TAG, "getOutStreamByString: 获取输出字符流");
        String path = Environment.getExternalStorageDirectory().getPath();
        //输入目标文件
        File file = new File(path, "config_yt");
        //定义输入流
        FileWriter fileWriter = new FileWriter(file, true);//true? 追加:覆盖
        BufferedWriter writer = new BufferedWriter(fileWriter);
        String result = "today is good day!!!!";
        writer.newLine();//开启新行
        writer.write(result);
        //关闭流
        writer.close();
        fileWriter.close();
    }

Test:

  @Test
    public void testIO() throws Exception {
        Log.e(TAG, "testIO: 1.写入 yancyang ********************************");
        IO.getOutStreamByByte();
        Log.e(TAG, "testIO: 2.读取写入的文件 ********************************");
        IO.getInputStreamByByte();
        Log.e(TAG, "testIO: 3.写入 today is good day ********************************");
        IO.getOutStreamByString();
        Log.e(TAG, "testIO: 4.读取写入的文件********************************");
        IO.getInputStreamByString();
    }

打印结果

testIO: 1.写入 yancyang ********************************
 getOutStreamByByte: 获取输出字节流
testIO: 2.读取写入的文件 ********************************
getInputStreamByByte: 获取输入字节流
getInputStream: 读取的内容:yancyang
getInputStream: 读入数据的长度:8
testIO: 3.写入 today is good day ********************************
getOutStreamByString: 获取输出字符流
testIO: 4.读取写入的文件********************************
getInputStreamByString: 获取输入字符流
getInputStream: 读取的内容:yancyang
getInputStream: 读取的内容:today is good day!!!!

你可能感兴趣的:(Android,进阶之路,Android,进阶之路)