IO流简要介绍

时间:2022-07-28
本文章向大家介绍IO流简要介绍,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

一、什么是IO流?

流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流。流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。IO流的分类:根据处理数据类型的不同分为:字符流和字节流;根据数据流向不同分为:输入流和输出流。
	

IO流基类

	InputStream
			输入流基类
					read
	OutputStream
			输出流基类
					write

1.IO流分类

1.1流向分类:
		输入输出
1.2文件操作处理单元分类:
		字节流和字符流
1.3
	FileInputStream
			文件操作输入字节流
	FileOutputStream
			文件操作输出字节流
1.4
	FileReader
		文件操作输入字符流
	FileWriter
		文件操作输出字符流

2.文件操作输入字节流 FileInputStream

2.1Constructor 构造方法

FileInputStream(File file);
这里是根据提供的File类对象创建对应的文件操作输入字节流。

FileInputStream(String pathName);	
	这里是根据提供的String类型文件路径,创建对应的文件操作输入字节流。
都会抛出异常:
	FileNotFoundException 文件未找到异常。

2.2Method 成员方法

	int read();
		从文件中读取一个字节数据返回到方法外。
		虽然返回值是一个int类型,但是在整个int类型当中存储的数据是一个byte类型,有
		且只有低8位数据有效
		
	int read(byte[] buf);
		读取文件的内容是存储在byte类型数组中,返回值是读取到的字节个数
		
	int read(byte[] buf, int offset, int count);
		读取文件的内容是存储在byte类型数组中,要求从byte数组offset位置开始,到
		count长度结束,返回值是读取到的字节个数
	
	以上三个方法如果读取到文件末尾,返回值都是 -1 EOF End Of File
	而且以上方法都要异常抛出
		IOException IO异常

2.3代码演示:

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

/*
 * 文件操作输入字节流
 * 	1. 确认读取哪一个文件
 * 	2. 创建对应文件的FileInputStream
 * 	3. 读取数据
 * 	4. 关闭资源 【重点】
 */
public class Demo1 {
	public static void main(String[] args) {
		long start = System.currentTimeMillis();
		
		readTest1();
		
		long end = System.currentTimeMillis();
		System.out.println("Time : " + (end - start));
	}

	public static void readTest2() {
		// 1. 确定操作文件
		File file = new File("C:\aaa\1.txt");

		// 2. 字节输入流读取文件对象
		FileInputStream fileInputStream = null;
		
		try {
			// 3. 根据File类对象创建对应的字节输入流
			fileInputStream = new FileInputStream(file);
			
			// 4. 准备一个8KB字节缓冲数组
			byte[] buf = new byte[1024 * 8];
			int length = -1;
			
			// 5. 读取数据
			while ((length = fileInputStream.read(buf)) != -1) {
				System.out.println(new String(buf, 0, length));
			}
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			// 在finally代码块中关闭资源
			if (fileInputStream != null) {
				try {
					fileInputStream.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}

	/*
	 * 不推荐
	 */
	public static void readTest1() {
		// 1. 确定操作文件
		File file = new File("C:\aaa\1.txt");
		
		// 2. 字节输入流读取文件对象 
		FileInputStream fileInputStream = null;
	
		try {
			// 3. 根据File类对象创建对应的字节输入流
			fileInputStream = new FileInputStream(file);
			
			// 4. 读取文件 
			int content = -1;
			
			while ((content = fileInputStream.read()) != -1) {
				System.out.println((char)content);
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			// 用于处理代码中使用到资源,无法发生什么样的错误,finally中的代码一定会执行
			// 这里发现fileInputStream不是null,证明已经打开了文件资源,关闭资源,捕获异常
			if (fileInputStream != null) {
				try {
					fileInputStream.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
}

3.文件操作输出字节流FileOutputStream

3.1Constructor 构造方法

FileOutputStream(File file);
	根据File类对象创建对应的文件输出字节流对象
FileOutputStream(String pathName);
	根据String类型文件路径创建对应的文件输出字节流对象

以上两个构造方法,创建的FileOutputStream是删除写/清空写操作,会将原文件中的内容全部删除之后,写入数据。

FileOutputStream(File file, boolean append);
	根据File类对象创建对应的文件输出字节流对象。创建对象时给予append参数为
	true,表示追加写。
FileOutputStream(String pathName, boolean append);
	根据String类型文件路径创建对应的文件输出字节流对象,创建对象时给予append参
	数为true,表示追加写。

FileOutputStream构造方法是拥有创建文件的内容,如果文件存在,不创建,文件不存在且路径正确,创建对应文件。否则抛出异常FileNotFoundException

3.2Method 成员方法

void write(int b);
	写入一个字节数据到当前文件中,参数是int类型,但是有且只会操作对应的低八位数
	据
void write(byte[] buf);	
	写入字节数组中的内容到文件中
void write(byte[] buf, int offset, int length);	
	写入字节数组中的内容到文件中,从指定的offset开始,到指定长度length
	
以上方法会抛出异常:IOException

3.3代码演示

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/*
 * 文件操作输出字节流
 * 		1. 确定文件
 * 		2. 创建FileOutputStream
 * 		3. 写入数据到文件中
 * 		4. 关闭资源 
 */
public class Demo2 {
	public static void main(String[] args) {
		writeTest2();
	}

	public static void writeTest2() {
		// 1. 确定文件
		File file = new File("C:/aaa/中国加油.txt");
		
		// 2. 文件操作字节输出流对象
		FileOutputStream fileOutputStream = null;
		
		try {
			// 3. 创建FileOutputStream 
			fileOutputStream = new FileOutputStream(file);
			
			// 4. 准备byte类型数组
			byte[] bytes = "武汉加油!中国加油!".getBytes();
			byte[] arr = {65, 66, 67, 68, 69, 70, 71};
			
			fileOutputStream.write(bytes);
			fileOutputStream.write(arr, 2, 3);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			// 关闭资源
			if (fileOutputStream != null) {
				try {
					fileOutputStream.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}

	public static void wrietTest1() {
		// 1. 确定文件
		File file = new File("C:/aaa/武汉加油.txt");
		
		// 2. 文件操作字节输出流对象
		FileOutputStream fileOutputStream = null;
		try {
			// 3. 创建FileOutputStream
			fileOutputStream = new FileOutputStream(file, true);
			
			// 4. 写入数据
			fileOutputStream.write('D');
			fileOutputStream.write('D');
			fileOutputStream.write('D');
			fileOutputStream.write('D');
			fileOutputStream.write('D');
			fileOutputStream.write('D');
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			// 关闭资源
			if (fileOutputStream != null) {
				try {
					fileOutputStream.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	} 
}