package com.io; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import org.junit.Test; /* File类:用于描述一个文件或者文件夹的; 通过File对象我们可以读取文件或者文件夹的属性;如果需要读取文件的内容数据,则需要使用IO流技术; IO流:input output IO流解决问题:解决设备与设备之间的数据传输问题。 内存-->硬盘 硬盘-->内存 IO流分类: 按照数据的流向划分: 输入流: 输出流: 判断使用输入流还是输出流的依据: 以当前程序作为参照物,观察数据是流入还是流出;如果数据流出则使用输出流(output);如果数据流入则使用输入流(input); 按照处理的单位来划分: 字节流:字节流读出的都是文件中的二进制数据,读取到的二进制数据不会经过任何的处理; 字符流:字符流也是读取文件中的二进制数据,不过会把这些二进制数据转换成我们能认识的字符; 输入字节流: --------| InputStream:所有输入字节流的基类;抽象类; -----------| FileInputStream:读取文件数据的输入字节流; 使用FileInputStream读取文件数据的步骤: 1、找到目标文件(用File类表示); 2、建立数据的输入通道(创建输入字节流对象); 3、读取文件中的数据; 4、关闭输入流,释放资源; 问题:读取完文件中的数据之后,不关闭资源有什么影响? 如果不关闭资源,其他程序无法对该资源文件进行操作; */ public class Demo3 { // 使用read()方法直接读取数据 @Test public void test1() throws IOException{ // 1、找到目标文件:用File类表示; File file = new File("D:\\a.txt"); // 2、建立数据的输入通道:创建FileInputStream输入流对象 FileInputStream fileInputStream = new FileInputStream(file); // 声明一个变量,用于存储读取到的内容; int content = 0; // 3、读取文件中的数据;read():读取一个字节的数据;返回读取到的内容; while ((content = fileInputStream.read()) != -1){ // 读取到文件末尾返回-1 // 直接读取到的是字节数据,需要转换成字符数据; // 回车(\r)读取到的是13; 换行(\n)读取到的是10; 空格(" ")读取到的是32; // 此处转换只能转换字符数据;中文数据在此处转换成的是乱码; char c = (char)content; System.out.println("读取的数据为:" + content + "-" + c); } // 关闭输入流,释放资源; fileInputStream.close(); } // 使用缓冲数组 byte[] 读取数据;效率要比使用read()方法直接读取数据高很多; @Test public void test2() throws IOException{ // 1、找到目标文件 File file = new File("D:\\a.txt"); // 2、建立数据的输入通道 FileInputStream in = new FileInputStream(file); int len = 0; // 建立缓冲字节数组,存储读取到的数据;字节数组的长度一般为1024的倍数,与计算机的处理单位有关; // 理论上缓冲数组越大,效率越高; byte[] buf = new byte[1024]; // 将数据读取到缓冲字节数组中,返回读取数据的字节长度; while ((len = in.read(buf)) != -1){ System.out.println("读取数据的字节长度:" + len); // 将读取到的数据转换成字符串; String content = new String(buf, 0, len); System.out.println("读取到的数据:" + content); } // 关闭流,释放资源 in.close(); } }