• (16)IO流之输入字节流FileInputStream和输出字节流FielOutputStream


     IO流技术解决的问题:设备与设备之间的传输问题,内存——>硬盘,硬盘——>内存,等等

     IO流技术

      如果按照数据的流向划分可以划分为:输入流和输出流

      输入输出的标准是以程序为参考物的,如果流出则选用输出流,如果数据流入则使用输入流。

      如果按照处理的单位来划分:字节流和字符流

      字节流:读取文件中的二进制数据,而且读取的二进制数据不会经过任何的处理

      字符流:***也是读取文件中的二进制数据,不过会吧这些二进制的数据转换成我们能识别的字符。

      字符流  = 字节流 + 解码

      上面的分析告诉们先看字节流学字符流

    IO流中的类的名字,都很好叫,一般都是把父类作为子类名字的后缀。


    输入字节流:最大的特点是一看的名字就知道这个是可以干什么的

    InputStream 所有输入字节流的基类

    |————FileInputStream

    使用FileInputStream如何读取文件:

    1、找到目标文件 。File类来解决

      2、建立数据的输入通道。

      3、读取文件的数据,使用流对象的read方法.当读到文件结尾时返回-1,表示结束

      4、关闭资源。实质上就是释放资源的作用.一般调用close方法

    这一块介绍了4中读取字符流的方法,最后,留下一种是最好的。贴在下面:

    //使用缓冲数组配合循环一起来读取 这是最最推荐的方式 以后都是这种方式

     1 public static void readTest4() throws IOException
     2{
     3         long start = System.currentTimeMillis();
     4         //找到目标文件
     5         File file = new File("D:\pic.jpg");
     6         //建立数据的输入通道
     7         FileInputStream fileInputStream = new FileInputStream(file);
     8         //建立缓冲数组配合循环 读取文件的数据
     9         int length = 0;    //保存每次读取到的字节个数
    10         byte[] buf = new byte[1024*3];    //缓冲数组的长度一般是1024的倍数,因为正好是计算机处理单位,理论上来说缓冲数组越大,效率越高
    11         while((length = fileInputStream.read(buf))!=-1)
    12         {
    13             System.out.println(new String(buf, 0, length));        
    14       }
    15         long end = System.currentTimeMillis();
    16         System.out.println("使用时间:"+(end - start));
    17 }

    注意:

    1、资源文件一旦使用完毕要立马是释放,不然别的程序将无法对该资源进行操作、

    2、用户混错的buf构建字符串的时候必须应当new String(buf, 0, length),因为length是每次read出的长度,又能最后一次独处的内容没有buf总的长度那么长,那么buf中残存的又上一次的数据。

    字节流之输出 OutputStream 所有输出字节流的基类

    OutputStream 所有输出字节流的基类 抽象类

    |——FileOutputStream 向文件输出数据的输出的字节流

    FileOutputStream 输出字节流的使用步骤

    1、找到目标文件

    2、建立文件与程序的输出通道

    3、把数据转换成字节数组写出

    4、关闭资源

    FileOutputStream要注意的事情:

    1、使用FileOutputStream的时候,如果目标文件不错在,就会自动创建目标文件。

    2、使用FileOutputStream的时候,如果文件已经存在,那么会先清空目标文件中的数据,然后在写入数数据。

    3、使用FileOutputStream的时候,如果文件已经存在,需要在原来的文件末尾追加元素的时候,应当使用构造函数new FileOutputStream(file, true);每创建一个FileOutputStream的时候,指正会指向文件的开始位置。每写一次指针都会做出相应的移动,拷贝文件的时候,会新建一个文件,因为指针是一直持续向后移动的。

    4、使用FileOutputStreamwrite方法写数据的时候,虽然每次接受而的是一个int型的数据,但是整整写出的只是一个字节的数据,只是把低8位的二进制数据写出,其他24位的数据全部丢弃。

    使用输出流,把字节数组中的数字写出:

     1 public static  void writeTest2() throws IOException
     2     {
     3         //找到目标文件
     4         File file = new File("D:\b.txt");
     5         //建立文件与数据的输出通道
     6         FileOutputStream fileOutputStream = new FileOutputStream(file, true);
     7         //把数据写出
     8         String data = "hello world";    //getbytes()转变为字节数组
     9         fileOutputStream.write(data.getBytes());
    10         //关闭资源
    11         fileOutputStream.close();
    12     }
    View Code

    拷贝一张图片:

     1 public static void copyImage() throws IOException
     2     {
     3         //找到目标文件
     4         File inFile = new File("D:\1.jpg");
     5         File destFile = new File("E:\1.jpg");
     6         //建立数据的输入输出通道
     7         FileInputStream fileInputStream = new  FileInputStream(inFile);
     8         FileOutputStream fileOutputStream = new FileOutputStream(destFile); //追加数据....
     9         
    10         //每新创建一个FileOutputStream的时候,默认情况下FileOutputStream 的指针是指向了文件的开始的位置。 每写出一次,指向都会出现相应移动。
    11         //建立缓冲数据,边读边写
    12         byte[] buf = new byte[1024]; 
    13         int length = 0 ; 
    14         while((length = fileInputStream.read(buf))!=-1){ //不限丢人的输出来第一次我写的时候,read(buf)中的参数buf被我写丢了,好久才发现的错误
    15             fileOutputStream.write(buf,0,length); //写出很多次数据,所以就必须要追加。
    16         }
    17         //关闭资源 原则: 先开后关,后开先关。
    18         fileOutputStream.close();
    19         fileInputStream.close();
    20     }
    View Code
  • 相关阅读:
    C#跨平台物联网通讯框架ServerSuperIO(SSIO)正式开源... 1
    神秘值分解(Singular Value Decomposition)
    mysql的sql执行计划详解(非常有用)
    springweb flux websocket
    springweb flux 服务器推送事件
    nodejs-express 报错View is not a constructor
    深入理解 Laravel Eloquent(三)——模型间关系(关联)
    Laravel 校验规则之字段值唯一性校验
    Notice: Trying to get property of non-object problem(PHP)解决办法 中间件只能跳转不能返任何数据
    慕客网laravel学习笔记
  • 原文地址:https://www.cnblogs.com/OliverZhang/p/6021949.html
Copyright © 2020-2023  润新知