一、IO流
1.IO流的概述
IO流是用来处理设备之间的数据传输
Java对数据的操作是通过流的方式
Java用于操作流的对象都在IO包中 java.io
2、IO流的分类
- 按照数据的流向(站在内存的角度)
输入流——读入数据
输出流——写出数据 - 按照数据类型
字节流——可以读取任意类型的文件
字符流——只能读取文本文件
二、FileInputStream和FileOutputStream
字节输入输出流
字节流的抽象基类:InputStream,OutputStream
1、FileOutputStream
File file = new File("a.txt");
FileOutputStream out1 = new FileOutputStream(file);//创建一个向指定File对象表示的文件中写入数据的文件输出流
//输出流所关联的文件如果不存在,系统会自动帮你创建
FileOutputStream out2 = new FileOutputStream("b.txt");//创建一个向具有指定名称的文件中写入数据的文件输出流
//流用完之后必须释放资源
out1.close();
out2.close();
//写数据
FileOutputStream out1 = new FileOutputStream(file,true);//参数2:true代表追加写入,false表示不追加
FileOutputStream out2 = new FileOutputStream("b.txt",false);
out1.write(97);
out1.write(98);
out1.write(99);//一次写入一个字节
out1.write("\r\n".getBytes());
byte[] bytes = new byte[]{100,101,102,103,104};
out2.write(bytes);//一次写入一个字节数组
out2.write("\r\n".getBytes());//回车换行符
out2.write(bytes,2,3);//一次写入一个字节数组的一部分
out2.write("\r\n".getBytes());
String str="杨家有女初长成";
out2.write(str.getBytes());//将一个字符串转换成字符数组
out2.write("\r\n".getBytes());
out1.close();
out2.close();
2.FileInputStream
File file = new File("a.txt");
//输入流:所关联的文件如果不存在,就报错
FileInputStream in1 = new FileInputStream(file);
//通过打开一个到实际文件的连接来创建一个FileInputStream,该文件通过文件系统中的File对象的file文件指定
FileInputStream in2 = new FileInputStream("b.txt");
//通过打开一个到实际文件的连接来创建一个FileInputStream,该文件通过文件系统中的路径名name指定
//读数据
in.read();//一次读取一个字节,读取不到返回-1
//创建一个字节数组充当缓冲区
byte[] bytes = new byte[1024];
int len=in.read(bytes);//一次读取1024个字节,放到缓冲区里
int len2 = in.read(bytes, 0, 3);//读取数组的一部分,装入缓冲区
in.close();//流用完之后,要释放资源
3.使用文件输入输出流,进行文件的复制
FileInputStream in = new FileInputStream("MyTest3.java");
FileOutputStream out = new FileOutputStream("test.java");
//方式一:读取一个字节,写入一个字节
int len=0;
while((len=in.read())!=-1){
out.write(len);
out.flush();
}
in.close();
out.close();
FileInputStream in = new FileInputStream("MyTest3.java");
FileOutputStream out = new FileOutputStream("test.java");
//方式二:一次读取一个字节数组来复制文件
byte[] bytes = new byte[1024];//定义一个字节数组充当缓冲区
int len=0;
while((len=in.read(bytes))!=-1){
out.write(bytes,0,len);
out.flush();
}
in.close();
out.close();
4.流的异常处理
//流的异常处理
FileInputStream in=null;
FileOutputStream out=null;
try {
in = new FileInputStream("MyTest3.java");
out = new FileOutputStream("test.java");
//频繁的读写操作
byte[] bytes = new byte[1024];
int len=0;
while((len=in.read(bytes))!=-1){
out.write(bytes,0,len);
out.flush();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//释放资源
try {
if(in!=null){
in.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if(out!=null){
out.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
三、BufferedInputStream和BufferedOutputStream
高效的字节输入输出流
//高效的字节输入输出流
BufferedInputStream in = new BufferedInputStream(new FileInputStream("MyTest3.java"));
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("Test.java"));
byte[] bytes = new byte[1024];
int len=0;
while((len=in.read(bytes))!=-1){
out.write(bytes,0,len);
out.flush();
}
in.close();
out.close();
四、InputStreamReader和OutputStreamWriter
字符转换流,字符流一定要记得刷新
字符流的抽象基类:Reader,Writer
1.OutputStreamWriter
OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream("a.txt",true),"UTF-8");
//写入数据
out.write('你');//一次写一个字符
out.write("\r\n");
out.write("注意防暑降温");//一次写入一个字符串
out.write("\r\n");
out.write("注意防暑降温",2,4);//一次写入字符串的一部分
char[] chars = new char[]{'你','好','啊'};
out.write(chars);//一次写入一个字符数组
out.write(chars,0,2);//一次写入字符数组的一部分
out.close();
2.InputStreamReader
InputStreamReader in = new InputStreamReader(new FileInputStream("a.txt"));
//读取数据
int read = in.read();//一次读取一个字符,读取不到返回-1
char[] chars = new char[1024];//字符数组充当缓冲区
int read1 = in.read(chars);
int read2 = in.read(chars, 0, 3);
in.close();
3.采用字符流来复制文件
InputStreamReader in = new InputStreamReader(new FileInputStream("MyTest3.java"));
OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream("Test.java"));
//方法一:一次读取一个字符
int len=0;
while((len=in.read())!=-1){
out.write(len);
out.flush();//字符流要记得刷新
}
in.close();
out.close();
InputStreamReader in = new InputStreamReader(new FileInputStream("MyTest3.java"));
OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream("Test.java"));
//方法二:一次读取一个字符数组
char[] chars = new char[1024];
int len=0;
while((len=in.read(chars))!=-1){
out.write(chars,0,len);
out.flush();//字符流要记得刷新
}
in.close();
out.close();
五、FileReader和FileWriter
字符转换流的子类,也称便携流
唯一的缺点就是:它不能指定编码,也没有特有的方法都是从父类继承下来的
InputStreamReader----- FileReader
OutputStreamWriter------ FileWriter
FileReader reader = new FileReader("MyTest3.java");
FileWriter writer = new FileWriter("Test.java");
char[] chars = new char[1024];
int len=0;
while((len=reader.read(chars))!=-1){
writer.write(chars,0,len);
writer.flush();
}
reader.close();
writer.close();
六、案例演示
- 复制单层文件夹
public static void main(String[] args) throws IOException {
File srcFile = new File("E:\\文档");//封装源文件
File targetFile= new File("D:\\" + srcFile.getName());//封装目标文件
if(!targetFile.exists()){
targetFile.mkdirs();
}
copyFolder(srcFile,targetFile);
}
private static void copyFolder(File srcFile,File targetFile) throws IOException {
File[] files = srcFile.listFiles();
for (File f : files) {
if(f.isFile()){
copyFile(f,targetFile);
}
}
}
private static void copyFile(File f,File targetFile) throws IOException {
File file = new File(targetFile, f.getName());
FileInputStream in = new FileInputStream(f);
FileOutputStream out = new FileOutputStream(file);
byte[] bytes = new byte[1024 * 8];
int len=0;
while((len=in.read(bytes))!=-1){
out.write(bytes,0,len);
out.flush();
}
in.close();
out.close();
}
- 复制多层文件夹
public static void main(String[] args) throws IOException {
File srcFile= new File("E:\\文档");
File targetFile = new File("D:\\" + srcFile.getName());
if(!targetFile.exists()){
targetFile.mkdirs();
}
copyFolder(srcFile,targetFile);
}
private static void copyFolder(File srcFile,File targetFile) throws IOException {
File[] files = srcFile.listFiles();
for (File f : files) {
if(f.isFile()){
copyFile(f,targetFile);
}else{
File file = new File(targetFile, f.getName());
if(!file.exists()){
file.mkdirs();
}
copyFolder(f,file);
}
}
}
private static void copyFile(File f,File targetFile) throws IOException {
File file = new File(targetFile, f.getName());
FileInputStream in = new FileInputStream(f);
FileOutputStream out = new FileOutputStream(file);
byte[] bytes = new byte[1024 * 8];
int len=0;
while((len=in.read(bytes))!=-1){
out.write(bytes,0,len);
out.flush();
}
in.close();
out.close();
}