什么是IO流
I
input 输入流
read 读取数据
O
output 输出流
write 写入数据
一般情况下都是按照当前程序使用的内存为参照物来考虑数据的走向问题。
文件操作为例
从内存中保存数据到硬盘 output
从硬盘中读取数据到内存 input
文件操作为例
1GB完整的文件拷贝过程,要远远高于1GB散文件的拷贝过程。
1. 打开文件,关闭文件消耗资源较少
2. 1GB散文件就需要不断的打开,关闭资源
操作时间的消耗和打开文件,关闭文件或者说打开硬盘,关闭硬盘有直接关系
看视频,缓冲
使用缓冲可以让用户体验提高,相对来说较为平和的观看体验。
网页第一次访问时,加载时间较慢,第二次打开,速度很快
IO流基类
InputStream
输入流基类
read
OutputStream
输出流基类
write
IO流分类
流向分类
输入输出
文件操作处理单元分类
字节流和字符流
FileInputStream
文件操作输入字节流
FileOutputStream
文件操作输出字节流
FileReader
文件操作输入字符流
FileWriter
文件操作输出字符流
文件操作字节流
文件操作输入字节流
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异常
使用演示
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
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() {
File file = new File("C:\\aaa\\1.txt");
FileInputStream fileInputStream = null;
try {
fileInputStream = new FileInputStream(file);
byte[] buf = new byte[1024 * 8];
int length = -1;
while ((length = fileInputStream.read(buf)) != -1) {
System.out.println(new String(buf, 0, length));
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fileInputStream != null) {
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void readTest1() {
File file = new File("C:\\aaa\\1.txt");
FileInputStream fileInputStream = null;
try {
fileInputStream = new FileInputStream(file);
int content = -1;
while ((content = fileInputStream.read()) != -1) {
System.out.println((char)content);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fileInputStream != null) {
try {
fileInputStream.close();
} catch (IOException e) {
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
使用演示
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo2 {
public static void main(String[] args) {
writeTest2();
}
public static void writeTest2() {
File file = new File("C:/aaa/中国加油.txt");
FileOutputStream fileOutputStream = null;
try {
fileOutputStream = new FileOutputStream(file);
byte[] bytes = "武汉加油!中国加油!".getBytes();
byte[] arr = {65, 66, 67, 68, 69, 70, 71};
fileOutputStream.write(bytes);
fileOutputStream.write(arr, 2, 3);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fileOutputStream != null) {
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void wrietTest1() {
File file = new File("C:/aaa/武汉加油.txt");
FileOutputStream fileOutputStream = null;
try {
fileOutputStream = new FileOutputStream(file, true);
fileOutputStream.write('D');
fileOutputStream.write('D');
fileOutputStream.write('D');
fileOutputStream.write('D');
fileOutputStream.write('D');
fileOutputStream.write('D');
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fileOutputStream != null) {
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}