0
点赞
收藏
分享

微信扫一扫

字节流_FileInputStream类读取


File类:用于描述一个文件或者文件夹的。



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



IO流(Input Output)



IO技术主要的作用是用于解决设备与设备之间的数据传输问题。比如:硬盘-->内存          内存的数据-->硬盘上         把键盘的数据-->内存中



IO流分类:


    如果我们按照数据的流向划分:


        输入流:


        


        输出流:


    如果按照处理的单位划分:


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


        


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


            字符流 = 字节流 + 解码


        


判断使用输入流还是输出流的依据:    


    以当前程序作为参照物,观察数据是流入还是流出,如果流出则使用输出流,如果流入则使用输入流。



输入字节流:


-------------| InputStream 此抽象类是表示字节输入流的所有类的超类。 


------------------| FileInputStream 从文件系统中的某个文件中获得输入字节。



使用FileInputStream读取文件数据的步骤:


    1.找到目标文件


    2.建立数据的输入通道


    3.读取文件中的数据


    4.关闭资源,实际上就是释放资源



推荐使用方式4读取: 使用缓冲数组 + 循环 配合读取。

注意事项:



    1.资源文件一旦使用完毕,应该立即释放资源文件


    2.读取文件时,循环读取时,缓冲数组每次都是覆盖,并不是先清空再读取。所以应该采用new String(buff, 0, length)方法而不是new String(buff)  

package com.cn.input;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
/**
* Author:Liu Zhiyong(QQ:1012421396)
* Version:Version_1
* Date:2016年7月24日16:49:24
* Desc:
File类:用于描述一个文件或者文件夹的。
通过File对象我们可以读取文件或者文件夹的属性数据,如果我们需要读取文件的内容数据,那么我们需要使用IO流数技术。
IO流(Input Output)
IO技术主要的作用是用于解决设备与设备之间的数据传输问题。比如:硬盘-->内存 内存的数据-->硬盘上 把键盘的数据-->内存中
IO流分类:
如果我们按照数据的流向划分:
输入流:

输出流:
如果按照处理的单位划分:
字节流:字节流读取的都是文件中的二进制数据,读取到的二进制数据不会经过任何的处理。

字符流:字符流读取的数据是以字符为单位的。字符流也是读取文件中的二进制数据,不过会把这些二进制数据转换成我们能识别的字符。
字符流 = 字节流 + 解码

判断使用输入流还是输出流的依据:
以当前程序作为参照物,观察数据是流入还是流出,如果流出则使用输出流,如果流入则使用输入流。
输入字节流:
-------------| InputStream 此抽象类是表示字节输入流的所有类的超类。
------------------| FileInputStream 从文件系统中的某个文件中获得输入字节。
使用FileInputStream读取文件数据的步骤:
1.找到目标文件
2.建立数据的输入通道
3.读取文件中的数据
4.关闭资源,实际上就是释放资源
推荐使用方式4读取:使用缓冲数组 + 循环 配合读取。
*/
public class Demo1 {
public static void main(String[] args) throws IOException {
// readTest1();
// readTest2();
// readTest3();
readTest4();
}

//方式1:一次读一个字节
public static void readTest1() throws IOException{
//1.找到目标文件
File file = new File("f:/a.txt");
//2.建立数据的输入通道
FileInputStream fileInputStream = new FileInputStream(file);
//3.读取文件中的数据
int i = fileInputStream.read();
System.out.println((char)i);
//4.关闭资源,实际上就是释放资源
fileInputStream.close();
}

//不使用缓冲数组,一次一个字节循环读取
public static void readTest2() throws IOException{
long startTime = System.currentTimeMillis();
//1.找到目标文件
// File file = new File("f:/a.txt");
File file = new File("f:/cool.png");
//2.建立数据的输入通道
FileInputStream fileInputStream = new FileInputStream(file);
//3.读取文件的数据
int content = 0;
while((content = fileInputStream.read()) != -1){
System.out.print((char)content);
}
//4.关闭资源,实际上就是释放资源
fileInputStream.close();
long stopTime = System.currentTimeMillis();

System.out.println("方式2读取总共耗时:" + (stopTime-startTime) + "ms"); //480毫秒
}

//方式3:使用缓冲数组读取。 缺点:无法读取完整一个文件的数据。 缓冲不能太大,因为假如读取12G电影,得分配很多内存,不可行。
public static void readTest3() throws IOException{
//1.找到目标文件
File file = new File("f:/a.txt");
//2.建立数据的输入通道
FileInputStream fileInputStream = new FileInputStream(file);
//3.读取文件的数据
// Long l = file.length();
// byte[] buff = new byte[l.intValue()];//缓冲不能太大,因为假如读取12G电影,得分配很多内存,不可行。
byte[] buff = new byte[40];//相当于超市里面的购物车,从此输入流中将最多 buff.length 个字节的数据读入一个 byte 数组中
int length = fileInputStream.read(buff);//如果使用read读取数据传入字节数组,那么数据是存储到字节数组中的,而这时候read()方法的返回值是本次读取了几个字节数据到字节数组byte[]中
System.out.println(new String(buff) + "前面有空白");
System.out.println(new String(buff, 0, length) + "前面没有空白");
//4.关闭资源,实际上就是释放资源
fileInputStream.close();
}

//方式4:使用缓冲数组 + 循环 配合读取。
public static void readTest4() throws IOException{
// //1.找到目标文件
// File file = new File("f:/a.txt");
long startTime = System.currentTimeMillis();
//1.找到目标文件
// File file = new File("f:/a.txt");
File file = new File("f:/cool.png");
//2.建立数据的输入通道
FileInputStream fileInputStream = new FileInputStream(file);
//3.建立缓冲数组配合循环读取文件的数据
byte[] buff = new byte[1024];//用来存储每次读取到的数据,缓冲数组的长度一般是1024的倍数,因为与计算机的处理单位有关。理论上缓冲数组越大效率越高。
int length = 0;//保存每次都去到的字节个数。
int count = 1;//读取的次数
while((length = fileInputStream.read(buff)) != -1){//读入缓冲区的字节总数,如果因为已经到达文件末尾而没有更多的数据,则返回 -1。
System.out.print("读的第" + count++ + "次:" + new String(buff, 0, length));
}
//4.关闭资源,实际上就是释放资源
fileInputStream.close();

long stopTime = System.currentTimeMillis();

System.out.println("方式4读取总共耗时:" + (stopTime-startTime) + "ms"); //32ms
}
}


FileInputStream读取时要注意的细节:



字节流_FileInputStream类读取_数据


举报

相关推荐

0 条评论