目录
1、概述
I
表示
intput
,把硬盘文件中的数据读入到内存的过程,称之输入,负责读。
O
表示
output
,把内存中的数据写出到硬盘文件的过程,称之输出,负责写。
IO流分类
字节输入流:以内存为基准,
来自
磁盘文件
/
网络中的数据
以字节的形式读入到内存
中去的流称为字节输入流。
字节输出流:以内存为基准,把内存中的数据
以字节写出到磁盘文件或者网络中去
的流称为字节输出流。
字符输入流:以内存为基准,
来自
磁盘文件
/
网络中的数据
以字符的形式读入到内存
中去的流称为字符输入流。
字符输出流:以内存为基准,把内存中的数据
以字符写出到磁盘文件或者网络介质中
去的流称为字符输出流。
2、字节流
2.1、字节输入流 :FileInputStream
作用:以内存为基准,把磁盘文件中的数据以字节的形式读取到内存中去。
一次读取一个字节
缺点:性能较慢,读取中文字符输出无法避免乱码问题。
package com.itwpf.d03_stream;
import java.io.*;
public class FileinputStreamDemo1 {
public static void main(String[] args) throws IOException {
//1、创建一个文件输入流管道与源文件接通
InputStream fileInputStream = new FileInputStream(new File("day05_file\\src\\main\\java\\data.txt"));
//2.每次读取一个字节,读取到最后返回-1;
int a = fileInputStream.read();
System.out.println((char)a);
//3.使用循环改进
//定义一个变量记录每次读取的字节
int b;
while((b=fileInputStream.read())!=-1){
System.out.print((char)b);
}
}
}
一次读取一个字节数组
读取的性能得到了提升,读取中文字符输出无法避免乱码问题。
package com.itwpf.d03_stream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class FileinputStreamDemo2 {
public static void main(String[] args) throws IOException {
//1、创建一个文件输入流管道与源文件接通
InputStream fileInputStream = new FileInputStream(new File("day05_file\\src\\main\\java\\data.txt"));
byte bytes[] = new byte[1024];
int len ;//记录每次读取的字节数
while((len=fileInputStream.read(bytes))!=-1){
//读多少倒出多少
String s = new String(bytes,0,len, "UTF-8");
System.out.print(s);
}
}
}
读取文件的全部字节
直接把文件数据全部读取到一个字节数组可以避免乱码
如果文件过大,字节数组可能引起内存溢出。
package com.itwpf.d03_stream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class FileinputStreamDemo3 {
public static void main(String[] args) throws IOException {
File file = new File("day05_file\\src\\main\\java\\data.txt");
//1、创建一个文件输入流管道与源文件接通
InputStream fileInputStream = new FileInputStream(file);
byte[] bytes = fileInputStream.readAllBytes();
System.out.println(file.length() + "个字节");
System.out.println(new String(bytes, "UTF-8"));
}
}
2.2、字节输出流:FileOutputStream
l
作用:以内存为基准,把
内存中的数据以字节的形式写出到磁盘文件中去的流。
构造器 | 说明 |
public FileOutputStream(File file) | 创建字节输出流管道与源文件对象接通 |
public FileOutputStream(File file,boolean append) | 创建字节输出流管道与源文件对象接通, 可追加数据 |
public FileOutputStream(String filepath) | 创建字节输出流管道与源文件路径接通 |
public FileOutputStream(String filepath,boolean append) | 创建字节输出流管道与源文件路径接通, 可追加数据 |
package com.itwpf.d03_stream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class OutputStreamDemo4 {
public static void main(String[] args) throws IOException {
//1.创建一个文件字节输入流管道与目标文件接通
//OutputStream outputStream = new FileOutputStream("day05_file\\src\\main\\java\\data02.txt");
//每次都会先清空之前的数据,再将新数据写入
//如果要追加数据,则在后面加上true
OutputStream outputStream = new FileOutputStream("day05_file\\src\\main\\java\\data03.txt",true);
//2.写数据出去
outputStream.write('a');
outputStream.write(98);
outputStream.write('1');
//换行
outputStream.write("\r\n".getBytes());
//3.写数据必须刷新数据
outputStream.flush();
//写一个字节数组出去
byte[]bytes = new byte[]{'a',64,65,'b'};
byte[] bytes1 = "我来自中国111".getBytes();
outputStream.write(bytes);
outputStream.write(bytes1);
outputStream.flush();
//4.释放资源
//释放资源时,自动刷新数据
outputStream.close();
}
}
2.3、文件复制
package com.itwpf.d03_stream;
import java.io.*;
public class copyDemo {
public static void main(String[] args) {
/**
* 使用字节流完成文件的复制(支持一切文件的复制)
*/
InputStream inputStream = null;
OutputStream outputStream = null;
try {
//创建一个字节输入流管道与源文件连接
inputStream = new FileInputStream(new File("D:\\log4j\\00\\01.mp4"));
//创建一个字节输出流管道与目标文件连接
outputStream = new FileOutputStream(new File("D:\\log4j\\01\\03.mp4"));
//定义一个字节数组转移数据
byte[] bytes = new byte[1024];
int len;//记录每次读取的字节数
while((len=inputStream.read(bytes))!=-1){
outputStream.write(bytes,0,len);
outputStream.flush();
}
System.out.println("复制完成了");
} catch (IOException e) {
e.printStackTrace();
} finally {
//关闭流
try {
if(outputStream!=null) {
outputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if(inputStream!=null){
inputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
3、资源释放的方式
3.1、try-catch-finally
finally
:放在
try-catch
后面的,无论是正常执行还是异常执行代码,最后一定要执行,
除非
JVM
退出。
作用:一般用于进行最后的资源释放操作(专业级做法)
3.2、try-with-resource