Android之Stream(流)的理解

2021-08-02  本文已影响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();
            }
        }
    }
上一篇下一篇

猜你喜欢

热点阅读