IO流 字符流 字节流 缓冲流 文件的复制
IO流
IO概述
IO流就是一个管道,是用来在设备之间传输数据
input:相对于内存/程序 往进走输入流
output:相对于内存/程序 往硬盘写入
分类
根据数据进出方式
1、输出流:
- FileWriter 字符输出流
- BufferedWriter 字符缓冲输出流
2、输入流:
- FileReader
- BufferedReader
根据读写数据的方式
- 字符流:文本文件 字符存储。读写过程可以按照一个或多个字符进行读写
字节流:图片、视频、音频 可以读取任何格式的文件。读写过程中可以一个或多个字节的读写
OutputStream
- FileOutSteram
- BufferedOutputSteram
- InputStream
- FileInputStream
- BufferedInputStream
在计算机底层存储任何文件是,都是按照字节的形式进行存储的。
利用字符流实现文件拷贝
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
/**
* 利用字符流实现文件的拷贝
* @author YandeHu
*
*/
public class DemoFileCopy {
public static void main(String[] args) throws Exception {
//创建输入输出对象
FileReader fr=new FileReader("E:\\01\\01\\a.txt");
FileWriter fw=new FileWriter("E:\\01\\01\\b.txt");
BufferedReader br=new BufferedReader(fr);
BufferedWriter bw= new BufferedWriter(fw);
//定义字符串类型的变量
String line=null;
while((line=br.readLine())!=null){
System.out.println(line);
bw.write(line);
bw.newLine();
bw.flush();
}
//关闭流
bw.close();
br.close();
System.out.println("拷贝完成");
}
}
字节流
- InputStream
- 构造方法
- read方法
- OutputStram
- 构造方法
- writer方法
文件字节输入\输出流的使用
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
public class DemoCoqyStream {
public static void main(String[] args) throws Exception {
//创建字节输入、输出流
copyFile01();
copyFile02();
}
/**
* 封装方法
* @throws Exception
*/
public static void copyFile01() throws Exception{
FileInputStream fi=new FileInputStream("E:\\01\\01\\1.jpg");
FileOutputStream fo=new FileOutputStream("E:\\01\\01\\2.jpg");
//读文件
int len=-1;
while((len=fi.read())!=-1){
fo.write(len);
}
System.out.println("复制成功");
fi.close();
fo.close();
}
/**
* 封装方法 一次复制一个数组的
* @throws Exception
*/
public static void copyFile02() throws Exception{
FileInputStream fi=new FileInputStream("E:\\01\\01\\1.jpg");
FileOutputStream fo=new FileOutputStream("E:\\01\\01\\3.jpg");
//读取文件
byte [] b=new byte[1024];
int len=-1; //0 代表没有数据
while((len=fi.read(b))!=-1){
fo.write(b,0,len);
}
fi.close();
fo.close();
System.out.println(len+"复制成功");
}
}
缓冲字节流输入\输出的使用
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
/**
* 利用缓冲字节流
* @author YandeHu
*
*/
public class DemoStreamBuffer {
public static void main(String[] args) throws Exception {
BufferedInputStream bis=new BufferedInputStream(new FileInputStream("b.txt"));
BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("c.txt"));
//硬盘写
bos.write("hello".getBytes());
System.out.println("写入成功");
//读
byte []b=new byte[10];
int len=-1;
while((len=bis.read(b))!=-1){
System.out.print(new String(b,0,len));
}
//bos.close();
bis.close();
}
}
利用字符输出流实现对文件内容的复制
过程是:先将要拷贝的文件读入到内存中,在将内容写入到另一个文件
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
/**
* 利用字符流实现文件的拷贝
* @author YandeHu
*
*/
public class DemoFileCopy {
public static void main(String[] args) throws Exception {
//创建输入输出对象
FileReader fr=new FileReader("E:\\01\\01\\a.txt");
FileWriter fw=new FileWriter("E:\\01\\01\\b.txt");
BufferedReader br=new BufferedReader(fr);
BufferedWriter bw= new BufferedWriter(fw);
//定义字符串类型的变量
String line=null;
while((line=br.readLine())!=null){
System.out.println(line);
bw.write(line);
bw.newLine();
bw.flush();
}
//关闭流
bw.close();
br.close();
System.out.println("拷贝完成");
}
}
利用缓冲字节输入\输出流实现单击文件目录内容的拷贝
步骤:方法的功能是 将指定文件的内容拷贝到目标目录,main函数的里的功能是遍历指定文件目录,如果文件的目录存在则复制文件到目标文件。
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
/**
* 复制单级文件夹
* @author YandeHu
*1、创建缓冲输入输出对象
*2、读数据(一个字节数组,存储每次读到的一个数组的数据 ,定义一个整型 记录读取字节个数)
*3、循环
*
*/
public class DemoText {
public static void main(String[] args) throws Exception {
File file=new File("E:\\01\\01\\3.jpg");
String destPath="E:\\01\\02";
File dir=new File("E:\\01");
File[] listFiles = dir.listFiles();
if(listFiles==null){
return;
}else{
//遍历文件列表
for (File f : listFiles) {
if(f.exists()){
copy(file, destPath);
}
}
System.out.println("拷贝成功");
}
}
public static void copy(File file,String destPath) throws Exception{
//创建缓冲流
BufferedInputStream bis=new BufferedInputStream(new FileInputStream(file));
BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(destPath+"\\"+file.getName()));
byte []bArray=new byte[1024];
int len=-1;
while((len=bis.read(bArray))!=-1){
bos.write(bArray,0,len);//将数组的内容写入到文件中
}
bis.close();
bos.close();
}
}