zoukankan      html  css  js  c++  java
  • java基础43 IO流技术(输入字节流/缓冲输入字节流)

    通过File对象可以读取文件或者文件夹的属性数据,如果要读取文件的内容数据,那么我们就要使用IO技术。

    一、输入字节流

    输入字节流的体系:
      -------| InputStream:所有输入字节流的基类(抽象类)
      -----------| FileInputStream:向指定文件读取数据的输入字节流
      -----------| BufferedInputStream:缓冲输入字节流  注意:凡是缓冲流都不具备读写文件的能力

    注意:所有缓冲流都不具备读写文件的能力(比如BufferedInputStream他要借助FileInputStream的读功能来读文件)

    1.1、IO流分类

    按照数据的流向划分:
             输入流:把硬盘(或内存)中的数据程序中。
             输出流:把程序中的数据硬盘(或内存)中。
    按照处理的单位划分:
             字节流:字节流读取都是文件中的二进制数据,读取到的二进制数据不会经过任何的处理.
             字符流:字符流读取的数据是以字符为单位的;字符流也是读取的是二进制数据,不过会把这些二进制数据转换为我们认识的字符.(字符流=字节流+解码)

    1.2、输入流演示例子

    步骤:

        1、找到目标文件
        2、建立数据的输入通道
        3、读取文件中的数据(把硬盘中的数据读取到程序中)
        4、关闭资源(注意:如果不关闭资源,该资源会一直占用CPU,且 当你要删除该文件时,将无法删除)

     1 package com.dhb.file;
     2 
     3 import java.io.File;
     4 import java.io.FileInputStream;
     5 import java.io.IOException;
     6 
     7 /**
     8  * @author DSHORE / 2018-7-2
     9  *
    10  */
    11 public class Demo9 {
    12     public static void main(String[] args) throws IOException {
    13         readTest3();
    14     }
    15     
    16     //方式一:  缺陷:无法读取完整的一个文件的数据
    17     public static void readTest1() throws IOException{
    18         //找到目标文件
    19         File f=new File("F:\a.txt");
    20         //建立数据的输入通道
    21         FileInputStream fis=new FileInputStream(f);
    22         //读取文件中的数据
    23         int count=fis.read();//read():读取一个字节的数据,并返回读取到的数据
    24         System.out.println("读取到的内容:"+(char)count);
    25         fis.close();//关闭资源
    26     }
    27     
    28     //方式二:使用循环读取文件的数据
    29     public static void readTest2() throws IOException{
    30         long start=System.currentTimeMillis();//计时(开始点),返回以毫秒为单位的当前时间
    31         //找到目标文件
    32         File file=new File("F:\a.txt");
    33         //建立数据输入通道
    34         FileInputStream fis=new FileInputStream(file);
    35         //读取文件中的数据
    36         int countent=0;//声明该变量用于存储读取到的数据
    37         while((countent = fis.read()) != -1){//-1表示:已经读到文件的末尾了,即:已读完所有数据
    38             System.out.print((char)countent);
    39         }
    40         fis.close();//关闭资源
    41         long end=System.currentTimeMillis();//计时(结束点),返回以毫秒为单位的当前时间
    42         System.out.println();
    43         System.out.println(end-start);//864
    44     }
    45     
    46     //方式三: 使用缓冲数组读取。   缺点:无法完整读取一个文件         
    47     public static void readTest3() throws IOException{
    48         //找到目标文件
    49         File f=new File("F:\a.txt");  
    50         //建立数据的输入通道
    51         FileInputStream fis=new FileInputStream(f);
    52         //读取文件
    53         byte[] buf=new byte[1024];
    54         int length=fis.read(buf);
    55         System.out.println("length:"+length);
    56         //使用字符数组构建字符串
    57         String s=new String(buf,0,length);
    58         System.out.println("文件中的内容:"+s);
    59         fis.close();//关闭资源
    60     }
    61     
    62     //方式四: 推荐使用(效率比方式二高)
    63     public static void readTest4() throws IOException{
    64         long start=System.currentTimeMillis();//计时(开始点),返回以毫秒为单位的当前时间
    65         //找到目标文件
    66         File f = new File("F:\a.txt");
    67         //建立数据输入通道
    68         FileInputStream fis = new FileInputStream(f);
    69         //读取文件
    70         int length=0;
    71         byte[] buf=new byte[1024*3];//存储读取到的数据   缓冲数组是1024的倍数,因为与计算机处理单位是一样的。//理论上缓冲数组越大,效率越高
    72         while ((length = fis.read(buf)) != -1) {  //read()方法:如果读取到了文件的末尾,那么返回-1
    73             System.out.println(new String(buf,0,length));
    74         }
    75         //关闭资源
    76         fis.close();
    77         long end=System.currentTimeMillis(); //计时(结束点),返回以毫秒为单位的当前时间
    78         System.out.println();
    79         System.out.println(end-start);//67秒
    80     }
    81 }

    1.3、实例

     1 package com.dhb.file;
     2 
     3 import java.io.File;
     4 import java.io.FileInputStream;
     5 import java.io.IOException;
     6 
     7 /**
     8  * @author DSHORE / 2018-7-2
     9  *
    10  */
    11 //需求:读取一张图片所需的时间
    12 public class Demo8 {
    13     public static void main(String[] args) throws IOException {
    14         oppo();
    15     }
    16     
    17     public static void  oppo() throws IOException{
    18         long start=System.currentTimeMillis();//开始(运行)时间;返回以毫秒为单位的当前时间
    19         File file = new File("F:\MyJavaCode\20180702.jpg");
    20         FileInputStream fir=new FileInputStream(file);//读取指定文件中的数据内容
    21         int length = 0;
    22         byte[] buf = new byte[1024];
    23         while((length=fir.read(buf)) != -1){//read()方法:如果读取到了文件的末尾,那么返回-1
    24             System.out.println(new String (buf,0,length));//从0开始读,到length的最大长度结束
    25         }
    26         fir.close();//关闭资源
    27         long end=System.currentTimeMillis();//结束(运行)时间;返回以毫秒为单位的当前时间
    28         System.out.println(end-start);//返回值:41毫秒
    29     }
    30 }

    运行结果图:

    二、缓冲输入字节流

    2.1、概述

      我们清楚读取文件数据使用缓冲数组读取效率更高,sun公司给我们提供了一个缓冲输入字节流对象,让我们可以更高效率读取文件

     注意:凡是缓冲流都不具备读写文件的能力,BufferedInputStream是借助FileInputStream的功能来进行读写操作的

    2.2、使用BufferedInputStream的步骤

        1.找到目标文件
        2.建立数据的输入通道
        3.建立缓冲输入字节流
        4.读取数据(把硬盘中的数据读取到程序中)
        5.关闭资源

    2.3、实例

     1 package com.dhb.file;
     2 
     3 import java.io.BufferedInputStream;
     4 import java.io.File;
     5 import java.io.FileInputStream;
     6 import java.io.IOException;
     7 
     8 /**
     9  * @author DSHORE / 2018-7-4
    10  *
    11  */
    12 public class Demo1 {
    13     public static void main(String[] args) throws IOException {
    14         readTest();
    15     }
    16     public static void readTest() throws IOException{
    17         //找到目标文件
    18         File file=new File("F:\a.txt");
    19         FileInputStream fis=new FileInputStream(file);
    20         BufferedInputStream bis=new BufferedInputStream(fis);
    21         int length=0;
    22         //疑问:BufferInputStream出现的目的:提供读取文件的效率,但是BufferedInputStream和FileInputStream的read()方法每次读取一个字节的数据,那么BufferInputStream效率高从何而来?
    23         //答:因为BufferInputStream内部维护了一个8kb的字节数组而已。(其实用 FileInputStream 的方式4和 BufferInputStream 的效率一样高,都差不多,自己喜欢哪种就用哪种)
    24         while((length=bis.read())!=-1){
    25             System.out.print((char)length);
    26         }
    27         bis.close();//间接把fis关闭了
    28         //fis.close();
    29     }
    30 }

    原创作者:DSHORE

    作者主页:http://www.cnblogs.com/dshore123/

    原文出自:https://www.cnblogs.com/dshore123/p/9253440.html

    欢迎转载,转载务必说明出处。(如果本文对您有帮助,可以点击一下右下角的 推荐,或评论,谢谢!

  • 相关阅读:
    亚马逊云IoT平台接入开发记录
    pip下载速度慢更换清华源试试
    gitlab回归上一次提交
    uos桌面壁纸存放路径
    python中json中的dump和dumps
    Python中的类中__dict__方法
    C++ | 数组反转的三种方法
    《C++Primer Plus》 | 复合类型
    pwn 中的函数 | 持续更新
    七月安恒DASCTF | 复现
  • 原文地址:https://www.cnblogs.com/dshore123/p/9253440.html
Copyright © 2011-2022 走看看