流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流。流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。IO流的分类:根据处理数据类型的不同分为:字符流和字节流;根据数据流向不同分为:输入流和输出流。
IO流基类
InputStream
输入流基类
read
OutputStream
输出流基类
write
1.1流向分类:
输入输出
1.2文件操作处理单元分类:
字节流和字符流
1.3
FileInputStream
文件操作输入字节流
FileOutputStream
文件操作输出字节流
1.4
FileReader
文件操作输入字符流
FileWriter
文件操作输出字符流
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.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();
}
}
}
}
}