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

一、输入字节流

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

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

1.1、IO流分类

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

1.2、输入流演示例子

步骤:

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

 package com.dhb.file;

 import java.io.File;
import java.io.FileInputStream;
import java.io.IOException; /**
* @author DSHORE / 2018-7-2
*
*/
public class Demo9 {
public static void main(String[] args) throws IOException {
readTest3();
} //方式一: 缺陷:无法读取完整的一个文件的数据
public static void readTest1() throws IOException{
//找到目标文件
File f=new File("F:\\a.txt");
//建立数据的输入通道
FileInputStream fis=new FileInputStream(f);
//读取文件中的数据
int count=fis.read();//read():读取一个字节的数据,并返回读取到的数据
System.out.println("读取到的内容:"+(char)count);
fis.close();//关闭资源
} //方式二:使用循环读取文件的数据
public static void readTest2() throws IOException{
long start=System.currentTimeMillis();//计时(开始点),返回以毫秒为单位的当前时间
//找到目标文件
File file=new File("F:\\a.txt");
//建立数据输入通道
FileInputStream fis=new FileInputStream(file);
//读取文件中的数据
int countent=;//声明该变量用于存储读取到的数据
while((countent = fis.read()) != -){//-1表示:已经读到文件的末尾了,即:已读完所有数据
System.out.print((char)countent);
}
fis.close();//关闭资源
long end=System.currentTimeMillis();//计时(结束点),返回以毫秒为单位的当前时间
System.out.println();
System.out.println(end-start);//
} //方式三: 使用缓冲数组读取。 缺点:无法完整读取一个文件
public static void readTest3() throws IOException{
//找到目标文件
File f=new File("F:\\a.txt");
//建立数据的输入通道
FileInputStream fis=new FileInputStream(f);
//读取文件
byte[] buf=new byte[];
int length=fis.read(buf);
System.out.println("length:"+length);
//使用字符数组构建字符串
String s=new String(buf,,length);
System.out.println("文件中的内容:"+s);
fis.close();//关闭资源
} //方式四: 推荐使用(效率比方式二高)
public static void readTest4() throws IOException{
long start=System.currentTimeMillis();//计时(开始点),返回以毫秒为单位的当前时间
//找到目标文件
File f = new File("F:\\a.txt");
//建立数据输入通道
FileInputStream fis = new FileInputStream(f);
//读取文件
int length=;
byte[] buf=new byte[*];//存储读取到的数据 缓冲数组是1024的倍数,因为与计算机处理单位是一样的。//理论上缓冲数组越大,效率越高
while ((length = fis.read(buf)) != -) { //read()方法:如果读取到了文件的末尾,那么返回-1
System.out.println(new String(buf,,length));
}
//关闭资源
fis.close();
long end=System.currentTimeMillis(); //计时(结束点),返回以毫秒为单位的当前时间
System.out.println();
System.out.println(end-start);//67秒
}
}

1.3、实例

 package com.dhb.file;

 import java.io.File;
import java.io.FileInputStream;
import java.io.IOException; /**
* @author DSHORE / 2018-7-2
*
*/
//需求:读取一张图片所需的时间
public class Demo8 {
public static void main(String[] args) throws IOException {
oppo();
} public static void oppo() throws IOException{
long start=System.currentTimeMillis();//开始(运行)时间;返回以毫秒为单位的当前时间
File file = new File("F:\\MyJavaCode\\20180702.jpg");
FileInputStream fir=new FileInputStream(file);//读取指定文件中的数据内容
int length = ;
byte[] buf = new byte[];
while((length=fir.read(buf)) != -){//read()方法:如果读取到了文件的末尾,那么返回-1
System.out.println(new String (buf,,length));//从0开始读,到length的最大长度结束
}
fir.close();//关闭资源
long end=System.currentTimeMillis();//结束(运行)时间;返回以毫秒为单位的当前时间
System.out.println(end-start);//返回值:41毫秒
}
}

运行结果图:

二、缓冲输入字节流

2.1、概述

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

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

2.2、使用BufferedInputStream的步骤

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

2.3、实例

 package com.dhb.file;

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

原创作者:DSHORE

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

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

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

java基础43 IO流技术(输入字节流/缓冲输入字节流)的更多相关文章

  1. java基础46 IO流技术(输出字符流/缓冲输出字符流)

    一.输出字符流 1.1.输出字符流体系 --------| Writer:输出字符流的基类(抽象类)  ----------| FileWriter:向文件输出数据输出字符流(把程序中的数据写到硬盘中 ...

  2. java基础44 IO流技术(输出字节流/缓冲输出字节流)和异常处理

    一.输出字节流 输出字节流的体系: -------| OutputStream:所有输出字节流的基类(抽象类) ----------| FileOutputStream:向文件输出数据的输出字节流(把 ...

  3. java基础45 IO流技术(输入字符流/缓冲输入字符流)

    一.输入字符流 1.1.输入字符流体系 ------| Reader:输入字符流的基类(抽象类)  ----------| FileReader:向指定文件读取数据的输入字符流(把硬盘上的数据读取到程 ...

  4. java基础53 IO流技术(转换流)

    1.转换流 1.输入字节的转换流:InputStreamReader是字节流转为字符流的桥梁,可以把输入字节流转换为输入字符流    2.输出字节流的转换流:OutputStreamWriter是字符 ...

  5. java基础48 IO流技术(序列流)

    本文知识点目录: 1.SequenceInputStream序列流的步骤    2.实例    3.附录(音乐的切割与合并) 1.SequenceInputStream序列流的步骤 1.找到目标文件  ...

  6. java基础51 IO流技术(打印流)

    1.打印流(printStream)的概念 打印流可以打印任意的数据类型 2.printStream的步骤 1.找到目标文件    2.创建一个打印流    3.打印信息    4.关闭资源 3.实例 ...

  7. java基础49 IO流技术(对象输入流/对象输出流)

    1.对象输入输出流 对象注意作用是用于写对象信息与读取对象信息 1.对象输出流:ObjectOutputStream    2.对象输入流:ObjectInputStream 2.对象输入输出流的步骤 ...

  8. java基础之IO流(一)字节流

    java基础之IO流(一)之字节流 IO流体系太大,涉及到的各种流对象,我觉得很有必要总结一下. 那什么是IO流,IO代表Input.Output,而流就是原始数据源与目标媒介的数据传输的一种抽象.典 ...

  9. java基础之IO流(二)之字符流

    java基础之IO流(二)之字符流 字符流,顾名思义,它是以字符为数据处理单元的流对象,那么字符流和字节流之间的关系又是如何呢? 字符流可以理解为是字节流+字符编码集额一种封装与抽象,专门设计用来读写 ...

随机推荐

  1. Bypass AV meterpreter免杀技巧

    0x01 meterpreter简介 MetasploitFramework是一个缓冲区溢出测试使用的辅助工具,也可以说是一个漏洞利用和测试平台,它集成了各种平台上常见的溢出漏洞和流行的shellco ...

  2. BZOJ 1497 [NOI2006]最大获利

    1497: [NOI2006]最大获利 Description 新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机遇,更是挑战.THU集团旗下的CS&T通讯公司在新一代通讯技术血战的前 ...

  3. GCC、GNU C、C99、ANSI C

    ANSI C ANSI C是由美国国家标准协会(ANSI)及国际标准化组织(ISO)推出的关于C语言的标准.ANSI C 标准同时规定了 C 标准库. ANSI C发展历史 C 的第一个标准是由ANS ...

  4. windows10 conda2 使用caffe训练训练自己的数据

    首先得到了https://blog.csdn.net/gybheroin/article/details/72581318系列博客的帮助.表示感激. 关于安装caffe已在之前的博客介绍,自用可行,h ...

  5. Hadoop生态圈-Hive快速入门篇之HQL的基础语法

    Hadoop生态圈-Hive快速入门篇之HQL的基础语法 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客的重点是介绍Hive中常见的数据类型,DDL数据定义,DML数据操作 ...

  6. java基础-BigDecimal类常用方法介绍

    java基础-BigDecimal类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.BigDecimal类概述 我们知道浮点数的计算结果是未知的.原因是计算机二进制 ...

  7. html中一些莫名的空格

    我们日常用编辑器编辑代码的时候,为了让代码的可读性更高,通常会有换行,空格或者tab键(bootstrap的规则中非常不建议这样做,不过为了方便,我还是比较习惯这样来缩进)的操作. 而这些也就造成了一 ...

  8. 并查集:POJ No1703 Find them, Catch them

    题目链接:http://poj.org/problem?id=1703 题意:两个坏蛋属于不同的组织,给出两个坏蛋判定是否一个组织. 题解:已知每次输入的两个帮派人员 x, y; 合并 (x, y + ...

  9. 权限 mock location

    1.集成环信的时候,该权限报错: mock location权限是是“允许程序创建模拟位置”,主要是提供用于测试.打包的时候并不需要,所以解决办法分两步: 1.声明tools 2.添加忽略:

  10. 解析html与xhtml的神器——HTMLParser与SGMLParser

    有时候你要把抓回来的数据进行提取,过大篇幅的html标签,你若使用正则表达式进行匹配的话,显然是低效的,这时使用python的HTMLParser模块会显得非常方便.据说还有个比较好用的解析器叫:Be ...