1、IO流概述及其分类
  * 1.概念
      * IO流用来处理设备之间的数据传输
      * Java对数据的操作是通过流的方式
      * Java用于操作流的类都在IO包中
      * 流按流向分为两种:输入流,输出流。
      * 流按操作类型分为两种:
          * 字节流 : 字节流可以操作任何数据,因为在计算机中任何数据都是以字节的形式存储的
          * 字符流 : 字符流只能操作纯字符数据,比较方便。

  * 2.IO流常用父类
      * 字节流的抽象父类:
          * InputStream 
          * OutputStream
      * 字符流的抽象父类:
          * Reader 
          * Writer        
  * 3.IO程序书写
      * 使用前,导入IO包中的类
      * 使用时,进行IO异常处理
      * 使用后,释放资源

2、FileInputStream
  * read()一次读取一个字节
  * 
        FileInputStream fis = new FileInputStream("aaa.txt");    //创建一个文件输入流对象,并关联aaa.txt
        int b;                                                    //定义变量,记录每次读到的字节
        while((b = fis.read()) != -1) {                            //将每次读到的字节赋值给b并判断是否是-1
            System.out.println(b);                                //打印每一个字节
        }
        
        fis.close();                                            //关闭流释放资源

3、read()方法返回值为什么是int
  * read()方法读取的是一个字节,为什么返回是int,而不是byte
  * 
        因为字节输入流可以操作任意类型的文件,比如图片音频等,这些文件底层都是以二进制形式的存储的,如果每次读取都返回byte,有可能在读到中间的时候遇到111111111

        那么这11111111是byte类型的-1,我们的程序是遇到-1就会停止不读了,后面的数据就读不到了,所以在读取的时候用int类型接收,如果11111111会在其前面补上


        24个0凑足4个字节,那么byte类型的-1就变成int类型的255了这样可以保证整个数据读完,而结束标记的-1就是int类型

4、FileOutputStream
  * write()一次写出一个字节
  * 
        FileOutputStream fos = new FileOutputStream("bbb.txt");    //如果没有bbb.txt,会创建出一个
        //fos.write(97);                        //虽然写出的是一个int数,但是在写出的时候会将前面的24个0去掉,所以写出的是一个byte
        fos.write(98);
        fos.write(99);
        fos.close();

5、FileOutputStream追加
  * A:案例演示
      * FileOutputStream的构造方法写出数据如何实现数据的追加写入
  * 
        FileOutputStream fos = new FileOutputStream("bbb.txt",true);    //如果没有bbb.txt,会创建出一个
        //fos.write(97);                        //虽然写出的是一个int数,但是在写出的时候会将前面的24个0去掉,所以写出的一个byte
        fos.write(98);
        fos.write(99);
        fos.close();

6、拷贝图片
  * FileInputStream读取
  * FileOutputStream写出

FileInputStream fis = new FileInputStream("致青春.mp3");    //创建输入流对象,关联致青春.mp3
        FileOutputStream fos = new FileOutputStream("copy.mp3");//创建输出流对象,关联copy.mp3
        
        int b;
        while((b = fis.read()) != -1) {
            fos.write(b);
        }
        
        fis.close();
        fos.close();

7、拷贝音频文件画原理图
  * A:案例演示
      * 字节流一次读写一个字节复制音频
  * 弊端:效率太低

8、字节数组拷贝之available()方法
  * A:案例演示
      * int read(byte[] b):一次读取一个字节数组
      * write(byte[] b):一次写出一个字节数组
      * available()获取读的文件所有的字节个数
  * 弊端:有可能会内存溢出
    
        FileInputStream fis = new FileInputStream("致青春.mp3");
        FileOutputStream fos = new FileOutputStream("copy.mp3");
        byte[] arr = new byte[fis.available()];                    //根据文件大小做一个字节数组
        fis.read(arr);                                            //将文件上的所有字节读取到数组中
        fos.write(arr);                                            //将数组中的所有字节一次写到了文件上
        fis.close();
        fos.close();

9、定义小数组
  * write(byte[] b)
  * write(byte[] b, int off, int len)    写出有效的字节个数

10、定义小数组的标准格式
  * A:案例演示
      * 字节流一次读写一个字节数组复制图片和视频
        FileInputStream fis = new FileInputStream("致青春.mp3");
        FileOutputStream fos = new FileOutputStream("copy.mp3");
        int len;
        byte[] arr = new byte[1024 * 8];                    //自定义字节数组
        
        while((len = fis.read(arr)) != -1) {
            //fos.write(arr);
            fos.write(arr, 0, len);                            //写出字节数组写出有效个字节个数
        }
        
        fis.close();
        fos.close();

11、BufferedInputStream和BufferOutputStream拷贝
  * A:缓冲思想
      * 字节流一次读写一个数组的速度明显比一次读写一个字节的速度快很多,
      * 这是加入了数组这样的缓冲区效果,java本身在设计的时候,
      * 也考虑到了这样的设计思想(装饰设计模式后面讲解),所以提供了字节缓冲区流
  * B.BufferedInputStream
      * BufferedInputStream内置了一个缓冲区(数组)
      * 从BufferedInputStream中读取一个字节时
      * BufferedInputStream会一次性从文件中读取8192个, 存在缓冲区中, 返回给程序一个
      * 程序再次读取时, 就不用找文件了, 直接从缓冲区中获取
      * 直到缓冲区中所有的都被使用过, 才重新从文件中读取8192个
  * C.BufferedOutputStream
      * BufferedOutputStream也内置了一个缓冲区(数组)
      * 程序向流中写出字节时, 不会直接写到文件, 先写到缓冲区中
      * 直到缓冲区写满, BufferedOutputStream才会把缓冲区中的数据一次性写到文件里
  * D.拷贝的代码

FileInputStream fis = new FileInputStream("致青春.mp3");            //创建文件输入流对象,关联致青春.mp3
        BufferedInputStream bis = new BufferedInputStream(fis);            //创建缓冲区对fis装饰
        FileOutputStream fos = new FileOutputStream("copy.mp3");        //创建输出流对象,关联copy.mp3
        BufferedOutputStream bos = new BufferedOutputStream(fos);        //创建缓冲区对fos装饰
        
        int b;
        while((b = bis.read()) != -1) {        
            bos.write(b);
        }
        
        bis.close();                        //只关装饰后的对象即可
        bos.close();

  * E.小数组的读写和带Buffered的读取哪个更快?
      * 定义小数组如果是8192个字节大小和Buffered比较的话
      * 定义小数组会略胜一筹,因为读和写操作的是同一个数组
      * 而Buffered操作的是两个数组

12、flush和close方法的区别
  * flush()方法
      * 用来刷新缓冲区的,刷新后可以再次写出 
  * close()方法
      * 用来关闭流释放资源的的,如果是带缓冲区的流对象的close()方法,不但会关闭流,还会再关闭流之前刷新缓冲区,关闭后不能再写出

13、字节流读写中文
  * 字节流读取中文的问题
      * 字节流在读中文的时候有可能会读到半个中文,造成乱码 
  * 字节流写出中文的问题
      * 字节流直接操作的字节,所以写出中文必须将字符串转换成字节数组 
      * 例:写出回车换行 write("\r\n".getBytes());

14、流的标准处理异常代码1.6版本及其以前
  * try finally嵌套

FileInputStream fis = null;
        FileOutputStream fos = null;
        try {
            fis = new FileInputStream("aaa.txt");
            fos = new FileOutputStream("bbb.txt");
            int b;
            while((b = fis.read()) != -1) {
                fos.write(b);
            }
        } finally {
            try {
                if(fis != null)
                    fis.close();
            }finally {
                if(fos != null)
                    fos.close();
            }
        }

15、流的标准处理异常代码1.7版本
  * try close

try(
            FileInputStream fis = new FileInputStream("aaa.txt");
            FileOutputStream fos = new FileOutputStream("bbb.txt");
        ){
            int b;
            while((b = fis.read()) != -1) {
                fos.write(b);
            }
        }

  * 原理
      * 在try()中创建的流对象必须实现了AutoCloseable这个接口,如果实现了,在try后面的{}(读写代码)执行后就会自动调用流对象的close方法将流关掉 

16、图片加密
  * 给图片加密

BufferedInputStream bis = new BufferedInputStream(new FileInputStream("a.jpg"));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("b.jpg"));
        
        int b;
        while((b = bis.read()) != -1) {
            bos.write(b ^ 123);
        }
        
        bis.close();
        bos.close();

17、拷贝文件
  * 在控制台录入文件的路径,将文件拷贝到当前项目下

Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个文件路径");
        String line = sc.nextLine();                //将键盘录入的文件路径存储在line中
        File file = new File(line);                    //封装成File对象
        FileInputStream fis = new FileInputStream(file);
        FileOutputStream fos = new FileOutputStream(file.getName());
        
        int len;
        byte[] arr = new byte[8192];                //定义缓冲区
        while((len = fis.read(arr)) != -1) {
            fos.write(arr,0,len);
        }
        
        fis.close();
        fos.close();

18、录入数据拷贝到文件
  * 将键盘录入的数据拷贝到当前项目下的text.txt文件中,键盘录入数据当遇到quit时就退出

Scanner sc = new Scanner(System.in);
        FileOutputStream fos = new FileOutputStream("text.txt");
        System.out.println("请输入:");
        while(true) {
            String line = sc.nextLine();
            if("quit".equals(line))
                break;
            fos.write(line.getBytes());
            fos.write("\r\n".getBytes());
        }
        
        fos.close();

java-IO流-字节流-概述及分类、FileInputStream、FileOutputStream、available()方法、定义小数组、BufferedInputStream、BufferedOutputStream、flush和close方法的区别、流的标准处理异常代码的更多相关文章

  1. Java——IO类 字节流概述

    body, table{font-family: 微软雅黑} table{border-collapse: collapse; border: solid gray; border-width: 2p ...

  2. Java IO: 其他字节流(上)

    作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) 本小节会简要概括Java IO中的PushbackInputStream,SequenceInputS ...

  3. java IO之字节流和字符流-Reader和Writer以及实现文件复制拷贝

    接上一篇的字节流,以下主要介绍字符流.字符流和字节流的差别以及文件复制拷贝.在程序中一个字符等于两个字节.而一个汉字占俩个字节(一般有限面试会问:一个char是否能存下一个汉字,答案当然是能了,一个c ...

  4. java——io、字节流缓冲区拷贝文件、字节缓冲流

    使用try catch finally关闭文件流: 写入文件: import java.io.*; public class exp{ public static void main(String[] ...

  5. java IO的字节流和字符流及其区别

    1. 字节流和字符流的概念    1.1 字节流继承于InputStream    OutputStream,    1.2 字符流继承于InputStreamReader    OutputStre ...

  6. java IO通过字节流,字符流 读出写入

    一:通过字节流操作数据的写入,读出 /** * 通过字节流写入和读出 * @param args */ public static String filePath = "G:" + ...

  7. [Java IO]02_字节流

    概要 字节流有两个核心抽象类:InputStream 和 OutputStream.所有的字节流类都继承自这两个抽象类. InputStream 负责输入,OutputStream 负责输出. 字节流 ...

  8. Java IO之字节流

    Java中的输入是指从数据源等读到Java程序中,这里的数据源可以是文件,内存或网络连接,输出则是指从Java程序中写到目的地. 输入输出流可以分为以下几种类型(暂时不考虑File类) 类名 中文名 ...

  9. Java IO学习--(一)概述

    在这一小节,我会试着给出Java IO(java.io)包下所有类的概述.更具体地说,我会根据类的用途对类进行分组.这个分组将会使你在未来的工作中,进行类的用途判定时,或者是为某个特定用途选择类时变得 ...

随机推荐

  1. Java的程序执行过程与编译原理

    百度云:https://pan.baidu.com/s/16FVPI8PSqk5O8qufljCNHg 提取码:a2vr 一,文字步骤 1.编写源代码 2.进入cmd 3.输入javac将文件编译转换 ...

  2. Code Pages

    https://docs.microsoft.com/en-us/windows/desktop/intl/code-pages Most applications written today han ...

  3. IDEA中静态资源无法找到的原因

    IDEA中静态资源无法找到, 原因1:同名的文件但是在不同的包里. 原因2:IDEA重启,web清空缓存. 原因3:错误的文件及路径. 原因4:其他原因排除后,可使用绝招重启试试.

  4. 【NOI 2015】品酒大会

    Problem Description 一年一度的"幻影阁夏日品酒大会"隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发"首席品酒家"和" ...

  5. PSR4规范

    定义类名规则: 完全限定类名必须有一个顶级命名空间(Vendor Name): 完全限定类名可以有多个子命名空间: 完全限定类名应该有一个终止类名: 下划线在完全限定类名中是没有特殊含义的: 字母在完 ...

  6. Mongo数据库操作/数据库版本号

    第一步,找到mongodb安装目录第二步,从命令行进入mongodb安装目录下的bin目录 附:http://www.runoob.com/mongodb/mongodb-create-databas ...

  7. http随笔

    1.什么是http? HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从WWW服务器传输超文本到本地浏览器的传送协议.它可以使浏览器更加高效,使网 ...

  8. 3、VNC

    VNC(Virtual Network Computing,虚拟网络计算机) VNC分为两部分组成:VNC server 和 VNC viewer VNC安装 1.yum install tigerv ...

  9. javascript中的词法分析

    词法分析 JavaScript中在调用函数的那一瞬间,会先进行词法分析. 词法分析的过程: 当函数调用的前一瞬间,会先形成一个激活对象:Avtive Object(AO),并会分析以下3个方面: 1: ...

  10. laravel5.5 调用系统自带登陆认证auth

    1执行命令 php artisan make:auth 2 编辑文件 config/auth guardes 'admin' => [ 'driver' => 'session', 'pr ...