IO字节输入流体系结构图
FileInputStream示例
public static void test1() throws Exception {
// 输入流: 将硬盘中的数据输入到内存中
FileInputStream fileInputStream = new FileInputStream("拉拉.txt");
int i = 0;
// 每读取一个字节,read()方法中相当于有一个指针向下移动
while ((i = fileInputStream.read()) != -1) {
System.out.println((char) i);
}
// 释放资源
fileInputStream.close();
}
需要读取文件和对文件进行写操作前,需要处理FileNotFoundException异常;对文件进行读取和写操作时,需要处理IOException异常。可以使用try…catch…finally进行处理异常,在finally代码块中进行流资源关闭操作。
FileOutputStream代码示例
FileOutputStream fileOutputStream = null;
try {
fileOutputStream = new FileOutputStream("拉拉.txt", true);
String s = "hello world";
fileOutputStream.write(s.getBytes());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fileOutputStream != null) {
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
fileOutputStream = null;
}
1、获取到文件
2、将需要的文字进行写入
3、处理异常,并关闭流资源
写入文件的write()方法有三种重载的方法,如下:
// 将b.length字节从byte数组中写入文件
void write(byte[] b)
// 从指定byte数组中从偏移量为off开始写入len个字节写入文件
void write(byte[] b, int off, int len)
// 写入指定字节到文件中
void write(int b)
相应的字节输入流的read()方法也有相对应的重写方法,如下:
// 从输入流中读取一个数据字节到内存中
int read()
// 从输入流中一次最多读取b.length个字节到byte[]数组中
int read(byte[] b)
// 从输入流中间最多len个字节的数据读入byte[]数组中
int read(byte[], int off, int len)
利用字节输入输出流进行图片文件的复制
public static void test3(){
FileInputStream fileInputStream = null;
FileOutputStream fileOutputStream = null;
try {
// 初始化FileInputStream和FileOutputStream对象
fileInputStream = new FileInputStream("F:\\1.jpeg");
fileOutputStream = new FileOutputStream("E:\\2.jpeg");
// 定义一个byte[]数组,用作字节输入流缓冲区
byte[] bytes = new byte[1024 * 2];
int i = 0;
// 输入流读取bytes个字节
while ((i = fileInputStream.read(bytes)) != -1){
// 输出流每次写入i个字节
fileOutputStream.write(bytes, 0, i);
fileOutputStream.flush();
}
} catch (FileNotFoundException e){
e.printStackTrace();
} catch (IOException e){
e.printStackTrace();
} finally {
if (fileInputStream != null){
try {
fileInputStream.close();
} catch (IOException e){
e.printStackTrace();
}
}
if (fileOutputStream != null){
try {
fileOutputStream.close();
} catch (IOException e){
e.printStackTrace();
}
}
// 手动将流资源关闭,加快jvm的gc对资源的回收
fileInputStream = null;
fileOutputStream = null;
}
}
字节流的优缺点
1、只要文件路径没错、最后流资源完全关闭,一般不会出错
2、对任何文件都能进行操作(计算机底层存储文件是以二进制存储的,而流操作操作的是文件的字节)
3、相较于字符流操作,读取和写入的效率不高