Java(字节流)

二.字节流

1.概念

一切皆为字节(文本,图片,视频等)
使用字节流读取中文:
  一个中文:
    GBK:占两个字节
    UTF-8:占三个字节

2.字节输出流OutputStream(超类)

1)概念:
    java.io.OutputStream :字节输出流
    抽象类,输出字节流的所有类的超类
2)子类共性的方法:
    void close();关闭此输出流并释放与此流相关联的任何系统资源。
    void flush();刷新此输出流并强制任何缓冲的输出字节被写出。
    void write(byte[] b);将 b.length字节从指定的字节数组写入此输出流。
    void write(byte[] b, int off, int len);从指定的字节数组写入 len个字节,从偏移 off开始输出到此输出流。
    abstract void write(int b)将指定的字节写入此输出流;

2.1 FileOutputStream(子类,实现类)

1)概念:
    java.io.FileOutputStream extends OutputStream
    FileOutputStream:文件字节输出流
    作用:把内存中的数据写入硬盘中

2)构造方法:
    FileOutputStream(String name);创建文件输出流,写入指定名称的文件。
    FileOutputStream(File file);创建文件输出流,写入指定File对象表示的文件.
    参数:
        String name:一个文件的路径
        File file:一个文件(File对象)
     构造方法的作用:
        1.创建一个FileOutputStream对象
        2.根据构造方法中传递的文件/文件路径,创建一个空的文件
        3.会把FileOutputStream对象指向创建好的文件

3)写入数据的原理(内存->硬盘):
    java程序-->JVM-->OS(操作系统)-->OS调用写数据的方法-->数据写入到文件

4)字节输出流的使用步骤:
    1.创建一个FileOutputStream对象,构造方法中传递写入数据的目的地
    2.调用FileOutputSteam对象中的方法write,把数据写入到文件中
    3.释放资源(流会占用一定内存,使用完要释放流)

5)将字符转换成字节:
    String str="学习使我快乐";//GBK两个字节一个中文,UTF-8三个字节一个中文
    byte[] bytes1 = str.getBytes();//使用getBytes()方法

6)代码实现:
    //1.创建一个FileOutputStream对象,构造方法中传递写入数据的目的地
        FileOutputStream fos = new FileOutputStream("G:\\a.txt");
        //2.调用FileOutputSteam对象中的方法write,把数据写入到文件中
        fos.write(97);//写入一个字节

        byte[] bytes ={65,66,67,68,69};//ABCDE
        fos.write(bytes);//写入一个字节数组

        fos.write(bytes,0,3);//写入字节数组的一部分(开始0,长度3)

        fos.flush();//刷新
        //3.释放资源(流会占用一定内存,使用完要释放流)
        fos.close();

7)字节输出流的续写和换行
    FileOutputStream(File file, boolean append)创建文件输出流,写入由指定的 File对象表示的文件。
    FileOutputStream(String name, boolean append)创建文件输出流,以指定的名称写入文件。
    参数:
        String name,File file:写入数据的目的地
        boolean append:追加写开关,
        ture:创建对象不会覆盖原文件,在文件内容末尾追加数据
        false:创建新文件,覆盖原文件

    写换行:
        windows:\r\n
        linux:/n
        mac:/r

3.字节输入流InputStream(超类)

1)概念:
    java.io.InputStream 字节输入流
    抽象类表示字节输入流的所有类的超类

2)子类共性方法:
    abstract int read() ;从输入流读取数据的下一个字节。  
    int read(byte[] b); 从输入流读取一些字节数,并将它们存储到缓冲区 b中 。  
    int read(byte[] b, int off, int len); 从输入流读取最多 len字节的数据到一个字节数组。  
    void close() ;关闭此输入流并释放与流相关联的任何系统资源。 

3.1 FileInputStream

1)概念:
    java.io.FileInputStream extend InputStream 文件字节输入流
    作用:把硬盘文件中的数据,读取到内存中

2)构造方法
    FileInputStream(String name)
    FileInputStream(File file)
    参数:读取文件的数据源
          String name:文件路径
          File file:文件
    构造方法作用:
          1.会创建一个FileInputStream对象
          2.会把FileInputStream对象指定构造方法中药读取的文件

3)读取数据的原理(硬盘-->内存):
    java程序-->JVM-->OS操作系统-->OS读取数据的方法-->读取文件

4)字节输入流的使用步骤:
    1.创建FileInputStream对象,构造方法中绑定要读取的数据源
    2.使用FileInputStream对象中的方法read,读取文件
    3.释放资源close

5)将字节数组转换为字符串
    String类的构造方法:
        String(byte[] bytes):把字节数组转换为字符串
        String(byte[] bytes, int offset, int length):将字节数组的一部分转换为字符串,offset开始索引,length长度

6)代码实现:
        public static void main(String[] args) throws IOException {
            FileInputStream fis = new FileInputStream("G:\\a.txt");//a.txt:ABC
    //        System.out.println("---循环读取一个字节---");
    //        int len1 = 0;//记录读取到的字节
    //        while ((len1 = fis.read()) != -1) {//fis.read():读取一个字节,判断下一个字节是否存在,不存在就等于-1结束循环
    //            System.out.println(len1);//65 66 67
    //        }
            System.out.println("---一次读取多个字节---");
            byte[] bytes = new byte[1024];//存储读取到的多个字节
            int len2 = 0;//记录每次读取的有效字节个数
            while ((len2 = fis.read(bytes)) != -1) {//一次读取一个数组长度的字节
                System.out.println(new String(bytes, 0, len2));//转换为字符串输出
            }

            fis.close();
        }
posted @ 2021-03-23 17:15  一名初学者  阅读(202)  评论(0)    收藏  举报