• io系列之字节流


      java中io流系统庞大,知识点众多,作为小白通过五天的视频书籍学习后,总结了io系列的随笔,以便将来复习查看。

      本篇为此系列随笔的第一篇:io系列之字节流。

    一、字节流的File读写操作。

        InputStream and OutputStream

    一)、 OutputStream: 字节输出流。

       以一个操作文件的例子进行说明: FileOutputStream (说明,该类对象必须指向一个文件,)


        构造方法:
            FileOutputStream(File file) 创建一个向指定 File 对象表示的文件中写入数据的文件输出流.
            FileOutputStream(File file, boolean append) 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
            FileOutputStream(FileDescriptor fdObj) 创建一个向指定文件描述符处写入数据的输出文件流,
                      该文件描述符表示一个到文件系统中的某个实际文件的现有连接。


            FileOutputStream(String name) 创建一个向具有指定名称的文件中写入数据的输出文件流。
                  使用方法及注意事项:
                        如: FileOutputStream fo = new FileOutputStream("filme.txt");
                      1、会在程序执行路径下创建一个filme.txt文件,该路径不因包名的变化而变化,只在执行路径下。
                      2、如果该路径下已有同名文件,那么该文件会被覆盖。

            FileOutputStream(String name, boolean append) 根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象。
                  使用方法及注意事项:
                        如: FileOutputStream fo = new FileOutputStream("filme.txt",true);
                      1、如果传入的参数为true,会在程序执行路径下打开一个已有的filme.txt文件。
                      2、如果该路径下没有该文件,则新建一个该文件, 并在文件末尾添加数据。
                      3、如果传入的参数为false,无论有无文件都会新建该文件。

            示例:1、以传入文件名的方式创建一个FileOutputStream对象(该对象一被初始化就必须明确被操作的文件)
               2、而且该文件会被新创建到指定目录下。
                 3、路劲描述: 如: "D:\java\myclass\winter.txt"




        写入方法:void write(byte[] b) 将 b.length 个字节从指定 byte 数组写入此文件输出流中。
             void write(byte[] b, int off, int len) 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此文件输出流。
               void write(int c) 写入指定字节(就是写入该int型数的低八位,最后一个字节)。

                如: fo.write("winter is coming".getBatys());

                注意:字节流与字符流不同,这里每写入一个字节都会直接存入文件中,不需要flush()。

                   off表示开始角标, len为长度。

        刷新方法: 字节流不需要刷新,没有flush方法。


        关闭方法:void close() 关闭此流。

                如: fo.close();
                   (为了节约Windows资源,最后一定要 close ,关闭io。)


            注意:1、 几乎所有的IO操作都会抛出 IOException 异常,注意对异常的处理(try、catch或者throws)
               2、在程序调用Io结束后,一定使用 close语句结束流对象。





    二)、InputStream :字符输入流。
        以一个操作文件的例子进行说明: FileInputStream (说明,该类对象必须指向一个文件,)


        构造方法:
            FileInputStream(String name) 在给定从中读取数据的文件名的情况下创建一个新 FileInputStream
                  使用方法及注意事项:
                        如: FileInputStream fi = new FileInputStream("filme.txt");
                     1、创建一个FileInputStream对象,该对象会指向 filme.txt 文件。
                     2、该文件必须存在,否则抛出 FileNotFoundException 异常。

            FileInputStream(FileDescriptor fdObj) 通过使用文件描述符 fdObj 创建一个 FileInputStream,
                              该文件描述符表示到文件系统中某个实际文件的现有连接。

            FileInputStream(File file) 通过打开一个到实际文件的连接来创建一个 FileInputStream,
                          该文件通过文件系统中的 File 对象 file 指定。

        取出方法:
            int read() 读取单个字节数据, 返回值为该字节值, 可使用(char)强转为字符形式。
                 从文件的开头, 随着该方法的不断调用,一直读到文件结尾, 之后返回 -1.

                 取出的字节本身只有8为,但是变为int型被补0到了32为(平时提升是补1,但是此处有位与255操作).

                        如: int i = fi.read(), char c = (char)i;

            int read(byte[] b, int off, int len) 将字节数据读入字节数组的某一部分
                 将文件中的数据从文件头开始读取,并存入数组,直到文件中数据读完 或者 数组位置存满。
                 只要文件中还有数据可读,便返回读取的字节个数。如果文件中已经没有数据可读,返回-1.
                        如: int i = 0; baty [] b = new baty[1024];
                           while((i = fi.read(c))!=-1)
                           { System.out.print(new String(b,0,i)); }

        获取文件字节数:
            int available() 返回下一次对此输入流调用的方法可以不受阻塞地从此输入流读取(或跳过)的估计剩余字节数。
                  即:返回剩余的字节数。
                  可以用来作为定义接受数据的字节数组长度的依据, 但是大型文件(如视频等)不建议使用该方法。


        结束方法:
            void close() 关闭该流并释放与之关联的所有资源。 此语句为必须执行语句。



    二、字节流的 缓冲功能

        缓冲区的出现是为了增加流的效率的,所以建立缓冲区之前必须要先有流对象。
        缓冲区对象只是给传入的流对象加了一个缓冲区,他的所有的读、写功能其实还是在调用原来的流对象的功能(close关闭的是流对象)

    一)、BufferedOutputStream :

        构造方法:
            BufferedOutputStream(OutputStream out) 创建一个新的缓冲输出流,以将数据写入指定的底层输出流。
                  如:FileOutputStream fo = new FileOutputStream()
                    BufferedOutputStream bo = new BufferedOutputStream(fo);
                为流对象 fo建立了一个缓冲区对象fo。

            BufferedOutputStream(OutputStream out, int size) 创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的底层输出流。
                  如:FileOutputStream fo = new FileOutputStream()
                    BufferedOutputStream bo = new BufferedOutputStream(fo,1024);
                为流对象 fo建立了一个缓冲区对象 bo,缓冲长度为 1024个字符。
        写入方法:
            void write(byte[] b, int off, int len) 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此缓冲的输出流。

            void write(int b) 将指定的字节写入此缓冲的输出流。(其指定字节就是int型数据的最后八位)

                    与传入的流对象相同, 这些方法底层就是在调用流对象的相应方法。

        关闭方法:void close();
              与传入的流对象相同, 此方法底层就是在调用流对象的close方法,缓冲区调用了过后,流对象不用重复关闭。

        其他方法:
            void flush() 刷新此缓冲的输出流。




    二)、BufferedInputStream:

        构造方法:
            BufferedInputStream(InputStream in) 创建一个 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。
                        如:FileInputStream fi = new FileInputStream()
                          BufferedInputStream bi = new BufferedInputStream(fi);
                      为流对象 fi建立了一个缓冲区对象 bi。

            BufferedInputStream(FileInputStream in, int sz) 创建具有指定缓冲区大小的 BufferedInputStream 并保存其参数,。
                        如:FileInputStream fi = new FileInputStream()
                          BufferedInputStream bi = new BufferedInputStream(fi,1024);
                      为流对象 fi建立了一个缓冲区对象 bi,缓冲长度为1024个字符。


        取出方法: 基本方法有流对象的相同(因为在调用流对象方法), 但是多了一个行读取方法。

            int read() 读取单个字节,返回值为该字节前补 0 至4个字节长度(write的 时候只写入最后一个字节)

                        (本来数据提升是在前补1的,但是此处内部有位与255操作)
                 从文件的开头, 随着该方法的不断调用,一直读到文件结尾, 之后返回 -1.



            int read(bate[] cbuf, int off, int len) 将字节读入数组的某一部分
                将文件中的数据从文件头开始读取,并存入数组,知道文件中数据读完 或者 数组位置存满。
                只要文件中还有数据可读,便返回读取的字节个数。如果文件中已经没有数据可读,返回-1.
                      如: int i = 0; Bate [] b = new Bate[1024];
                         while((i = bi.read(b))!=-1)
                         { System.out.print(new String(b,0,i)); }


        结束方法:
            void close() 关闭该流并释放与之关联的所有资源。 此语句为必须执行语句。
                  底层调用 流对象的 close 方法。

  • 相关阅读:
    【转】解决javascript中replace只能替换第一个
    【原】SQL存储过程调用慢,但是重新编译一下存储过程就很快
    【转】iframe自适应高度
    【原】JS点击层外任何地方关闭层
    【原】Iframe with SimpleModal keeps breaking down in IE 9 IE 7
    【原】SQL Server get csv group by
    【原】JQuery Masked Input Plugin
    【原】SQL 取当前年 (年初 1月1号) 当前月 (月初 1号) 当前日 (零点)
    vue 路由配置 和 react 路由配置
    react的几种性能优化
  • 原文地址:https://www.cnblogs.com/soficircle/p/6714315.html
Copyright © 2020-2023  润新知