认识IO流
I:input 输入流 read 读取数据
o:output 输出流 write 写入数据
根据当前程序使用的内存为参照物来考虑数据的走向问题。
文件操作为例:
1.从内存中保存数据到硬盘 output
2.从硬盘中读取数据到内存 input
特征:1GB完整的文件拷贝过程,要远远高于1GB散文件的拷贝过程。
原因:1.打开文件,关闭文件消耗资源较少
2. 1GB散文件就需要不断的打开,关闭资源
IO流基类:InputStream输入流基类 read
OutputStream输出流基类 write
IO流分类
基本操作介绍
1.流向分类 输入输出
2.文件操作处理单元分类 字节流和字符流
- FileInputStream 文件操作输入字节流
- FileOutputStream 文件操作输出字节流
- FileReader 文件操作输入字符流
- FileWriter 文件操作输出字符流
文件操作字节流
1.FileInputStream 文件操作输入字节流
Constructor 构造方法:
- FileInputStream(File file);这里是根据提供的File类对象创建对应的文件操作输入字节流。
- FileInputStream(String pathName);这里是根据提供的String类型文件路径,创建对应的文件操作输入字节流。
都会抛出异常:FileNotFoundException 文件未找到异常。
Method 成员方法 :
- 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异常。
文件操作字节流使用演示
/*
* 文件操作输入字节流
* 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();
}
}
}
}
文件读取使用缓冲和非缓冲差距
内存的运作速度看做是火箭
硬盘就是一个自行车
以上代码中,使用缓冲之后,从硬盘中一口气读取8KB数据存储在内存中,供程序使用。
8KB固态硬盘,4KB对齐。固态硬盘中每一个扇区都4KB。缓冲这里是要求CPU读取两个4KB数据,对于CPU而言没有太多压力。
如果是一个字节一个字节读取,CPU取出4KB数据,结果有4095无效。
文件操作输出字节流
FileOutputStream 文件操作输出字节流
Constructor 构造方法:
- 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。
Method 成员方法
void write(int b);写入一个字节数据到当前文件中,参数是int类型,但是有且只会操作对应的低八位数据。
void write(byte[] buf); 写入字节数组中的内容到文件中。
void write(byte[] buf, int offset, int length); 写入字节数组中的内容到文件中,从指定的offset开始,到指定长度length。
以上方法会抛出异常: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();
}
}
}
}
文件操作字符流
字符流 = 字节流 + 解码过程
字节组合操作 ==> 对应当前环境编码集的一个字符
如果字符找不到,该数据无效,需要被删除。
如果是字符内容操作,效率还可以!!!
字符流操作文件:个人建议,该文件可以使用notepad 记事本打开无乱码,可以使用字符流操作。
视频文件,图片文件,特定格式的文件,都无法使用字符操作。
文件操作输入字符流
FileReader 文件操作输入字符流
Constructor 构造方法-
FileReader(File file)
根据File类对象创建对应的FileReader字符流输入对象
FileReader(String pathName)
根据String类型文件路径创建对应的FileReader字符流输入对象,如果文件不存在,抛出异常FileNotFoundException
Method 成员方法
int read();
读取文件中的一个字符数据,通过返回值返回,返回值类型是int类型,但是在int类型中有且只有低16位数据有效.
int read(char[] arr);
读取文件中的数据保存到字符数组中,返回值类型是读取到的字符个数.
int read(char[] arr, int off, int len);
读取文件中的数据保存到字符数组中,要求从数组中下标offset开始,到len结束,返回值类型是读取到的字符个数.
以上方法,如果读取到文件默认,返回值为-1 EOF End Of File,如果读取操作工作中,出现问题,抛出异常IOException
文件操作输入字符流
public class Demo4 {
public static void main(String[] args) {
long start = System.currentTimeMillis();
readTest2();
long end = System.currentTimeMillis();
System.out.println("Time : " + (end - start));
}
// 10
public static void readTest2() {
FileReader fileReader = null;
try {
fileReader = new FileReader(new File("C:/aaa/3.txt"));
char[] buf = new char[1024 * 4];
int length = -1;
while ((length = fileReader.read(buf)) != -1) {
System.out.println(new String(buf, 0, length));
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (fileReader != null) {
try {
fileReader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
来源:CSDN
作者:small_Stone1.0
链接:https://blog.csdn.net/qq_40197991/article/details/104522791