Java学习笔记之IO(二):InputStream输入字节流

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);
				}
			}
		}
	}

}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值