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();
}
}
package com.io;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
/*
* IO流的异常处理
*/
public class Demo5 {
public static void main(String[] args) {
testRead();
}
// 读取文件数据的异常处理
public static void testRead() {
FileInputStream in = null;
try {
// 找到目标文件
File file = new File("D:\\a.txt");
// 建立数据输入通道
in = new FileInputStream(file);
int len = 0;
byte[] buf = new byte[1024];
// 读取数据
while ((len = in.read(buf)) != -1) {
System.out.println(new String(buf, 0, len));
}
} catch (IOException e) {
// 异常的处理:首先要阻止后面的代码执行,然后通知调用者此处出错了
// 把IOException传递给RuntimeException包装一层,然后再抛出,目的是为了让调用者使用更加灵活;
System.out.println("读取文件失败。。。");
throw new RuntimeException(e);
}finally {
// 在finaly块中,保证关闭资源的代码一定会执行
if (in != null){
try {
in.close();
System.out.println("关闭资源成功。。。");
} catch (IOException e) {
System.out.println("关闭资源失败。。。");
throw new RuntimeException(e);
}
}
}
}
}