美文网首页
Android之Stream(流)的理解

Android之Stream(流)的理解

作者: 乌托邦式的爱情 | 来源:发表于2021-08-02 18:11 被阅读0次

    Android之Stream(流)的理解

    在Java中,流是一个很重要的概念,特别是在做文件操作和网络读取这一块的时候,一定会用到流相应的派生类,那么,今天我们就来一起看看在Java以及Android中流到底是怎么一回事。

    定义:

    流是一个相对抽象的概念,所谓流就是一个传输数据的通道,这个通道可以传输相应类型的数据。进而完成数据的传输。这个通道被实现为一个具体的对象。

    分类:
    输入流:从外部空间(文件、网络连接、内存块)读入字节序列的管道(对象)。
    输出流:可以向外部(文件、网络连接、内存块)写入字节序列的管道(对象)。

    两种最基本的抽象类:

    字节类:InputStream/OutputStream

    字符类:Reader/Writer

    其他重要方法:

    (1)available():检查可读入字节的数量,避免造成线程阻塞。

    (2)close():关闭当前的流,避免造成资源流失。

    (3)flush():冲刷输出流,让数据成功的保存到目标地址(文件)。

    流家族的构成:

    读取字节的最顶级是InputStream(输入流)和OutputStream(输出流),读取字符的是Reader(输入流)和Writer(输出流)。

    字节类.png
    字符类.png
    常用流的介绍:

    (1)对文件进行操作:FileInputStream(字节输入流),FileOutputStream(字节输出流),FileReader(字符输入流),FileWriter(字符输出流)。

    (2)对管道进行操作:PipedInputStream(字节输入流),PipedOutStream(字节输出流),PipedReader(字符输入流),PipedWriter(字符输出流)。

    (3)字节/字符数组:ByteArrayInputStream,ByteArrayOutputStream,CharArrayReader,CharArrayWriter是在内存中开辟了一个字节或字符数组。

    (4)Buffered缓冲流:BufferedInputStream,BufferedOutputStream,BufferedReader,BufferedWriter,是带缓冲区的处理流,缓冲区的作用的主要目的是:避免每次和硬盘打交道,提高数据访问的效率。

    (5)转化流:InputStreamReader:在读入数据的时候将字节转换成字。OutputStreamWriter:在写出数据的时候将字符转换成字节。

    (6)数据流:DataInputStream,DataOutputStream。

    因为平时若是我们输出一个8个字节的long类型或4个字节的float类型,那怎么办呢?可以一个字节一个字节输出,也可以把转换成字符串输出,但是这样转换费时间,若是直接输出该多好啊,因此这个数据流就解决了我们输出数据类型的困难。数据流可以直接输出float类型或long类型,提高了数据读写的效率。

    (7)打印流:printStream,printWriter,一般是打印到控制台,可以进行控制打印的地方和格式,其中的 print方法不会抛出异常,可以通过checkError方法来查看异常。

    (8)对象流:ObjectInputStream,ObjectOutputStream,把封装的对象直接输出,而不是一个个在转换成字符串再输出。

    (9)RandomAccessFile随机访问文件

    (10)ZipInputStream、ZipOutputStream读取zip文档 getNextEntry、putNextEntry 得到或创建ZipEntry对象。

    具体使用:

    (一) FileInputStream和FileOutputStream

    FileInputStream fileInputStream = null;
    FileOutputStream fileOutputStream = null;
    try {
         // 文件流的使用
         File fileA = new File("G:\\", "a.txt");
         if (!fileA.exists()) {
              fileA.createNewFile();
         }
         File fileB = new File("G:\\", "b.txt");
         if (!fileB.exists()) {
             fileB.createNewFile();
         }
         // 创建字节输入流
         fileInputStream = new FileInputStream(fileA);
         fileOutputStream = new FileOutputStream(fileB);
         byte[] b = new byte[1024];
         int hasRead = 0;
         System.out.println(System.currentTimeMillis());
         while ((hasRead = fileInputStream.read(b)) != -1) {
                fileOutputStream.write(b, 0, hasRead);
         }
         fileOutputStream.flush();
         System.out.println(System.currentTimeMillis());
       } catch (IOException e) {
                e.printStackTrace();
       } finally {
           try {
               fileInputStream.close();
               fileOutputStream.close();
           } catch (IOException e) {
               e.printStackTrace();
          }
     }
    

    (二) FileReader和FileWriter

            Reader reader = null;
            Writer writer = null;
            try {
    
                File fileA = new File("G:\\", "a.txt");
                if (!fileA.exists()) {
                    fileA.createNewFile();
                }
                File fileB = new File("G:\\", "b.txt");
                if (!fileB.exists()) {
                    fileB.createNewFile();
                }
                reader = new FileReader(fileA);
                writer = new FileWriter(fileB);
                char[] temp = new char[1024];
                int hasRead = 0;
                System.out.println(System.currentTimeMillis());
                while ((hasRead = reader.read(temp)) != -1) {
                    writer.write(temp, 0, hasRead);
                }
                writer.flush();
                System.out.println(System.currentTimeMillis());
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    reader.close();
                    writer.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
    

    (三) BufferedInputStream和BufferedOutputStream

            FileInputStream fileInputStream = null;
            FileOutputStream fileOutputStream = null;
            BufferedInputStream bufferedInputStream = null;
            BufferedOutputStream bufferedOutputStream = null;
            int bufferedSize = 1024;
            try {
                File fileA = new File("G:\\", "a.txt");
                File fileB = new File("G:\\", "c.txt");
                if (!fileB.exists()) {
                    fileB.createNewFile();
                }
                fileInputStream = new FileInputStream(fileA);
                fileOutputStream = new FileOutputStream(fileB);
                // 创建缓存流
                bufferedInputStream = new BufferedInputStream(fileInputStream, bufferedSize);
                bufferedOutputStream = new BufferedOutputStream(fileOutputStream, bufferedSize);
                byte[] buffer = new byte[bufferedSize];
                int hasRead = 0;
                long startTime = System.currentTimeMillis();
                while ((hasRead = bufferedInputStream.read(buffer)) != -1) {
                    bufferedOutputStream.write(buffer);
                }
                bufferedOutputStream.flush();
                long endTime = System.currentTimeMillis();
                System.out.println("copy time:" + (endTime - startTime) / 1000 + "s");
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    bufferedInputStream.close();
                    bufferedOutputStream.close();
                    fileInputStream.close();
                    fileOutputStream.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
    

    (四) BufferedReader和BufferedWriter

      Reader reader = null;
            Writer writer = null;
            BufferedReader bufferedReader = null;
            BufferedWriter bufferedWriter = null;
            try {
                File fileA = new File("G:\\", "a.txt");
                File fileB = new File("G:\\", "b.txt");
                if (!fileB.exists()) {
                    fileB.createNewFile();
                }
                reader = new FileReader(fileA);
                writer = new FileWriter(fileB);
                bufferedReader = new BufferedReader(reader, 512);
                bufferedWriter = new BufferedWriter(writer, 512);
                String readBuff = null;
                while ((readBuff=bufferedReader.readLine())!=null){
                    System.out.println(readBuff);
                    bufferedWriter.write(readBuff);
                }
                bufferedWriter.flush();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    bufferedReader.close();
                    bufferedWriter.close();
                    writer.close();
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    

    相关文章

      网友评论

          本文标题:Android之Stream(流)的理解

          本文链接:https://www.haomeiwen.com/subject/cisjvltx.html