什么是IO流
I就是 In,输入的意思,O就是Out输出的意思
Java.io 包几乎包含了所有操作输入、输出需要的类。所有这些流类代表了输入源和输出目标。
Java.io 包中的流支持很多种格式,比如:基本类型、对象、本地化字符集等等。
一个流可以理解为一个数据的序列。输入流表示从一个源读取数据,输出流表示向一个目标写数据。
Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。
使用IO流的好处
可以方便地实现数据的输入/输出操作,在Java中把不同的输入/输出源抽象表述为"流"。
IO流分支
IO流分为字节流、字符流
字节流
InputStream、OutputStream
字符流
Reader、Writer
然而字节流下又有分支:
FileInputStream、FileOutputStream
字符流分支
FileReader、FileWriter
BufferedReader、BufferedWriter
字节流与字符流的区别
首先,字节流读取或写入文件是按照字节的方式写入、读取的,该情况下读取、写入英文没问题,但是写入或读取中文的时候会出现乱码问题,原因是因为一个中文字符占2个甚至3个字节,然而英文字符只占1个字节,这就造成了读取或输入的问题,我们十一字符流就不会出现这种状况,字符流读取一个字符的大小,有效的避免了乱码问题
采用缓冲区读取文件、写入文件会大大提升系统的性能
BufferedReader、BufferedWriter该类是采用了装饰器模式,统一封装文件输入流的格式,调用统一的方法
使用IO流实现文件的输入输出
基于IO流实现文件的拷贝,需拷贝子文件夹以及子文件夹的文件。
解题思路:利用递归实现文件夹拷贝,一层层往里进,看是否有文件,若有,执行前一遍复制的操作,这样就达到了拷贝文件夹以及子文件夹。
public class FileCopy {
public static void main(String[] args) {
//源文件
String path = "C:/Users/Desktop/0611";
//目标地址
String path2 = "C:/Users/Desktop/0611(复制版)";
//将目标路径放入File类中
File f2 = new File(path2);
//检测文件路径是否存在,若不存在,则创建文件夹,防止文件未找到异常导致程序崩溃
if (!f2.exists()) {
//创建文件夹
f2.mkdirs();
}
//调用方法,传入实参,开始拷贝文件夹
copyFile(path, path2);
}
/**
* 拷贝文件,利用递归拷贝子文件夹以及文件
* @param path1 源文件路径
* @param path2 目标文件路径
*/
public static void copyFile(String path1, String path2) {
File file = new File(path1);
File[] files = file.listFiles();
for (File file2 : files) {
if (file2.isDirectory()) {
String newPath = path2 + File.separator + file2.getName();
File f2 = new File(newPath);
System.out.println(f2.getAbsolutePath());
f2.mkdirs();
System.out.println("创建成功~");
copyFile(file2.getAbsolutePath(), newPath);
}
if (file2.isFile()) {
try {
InputStream is = new FileInputStream(file2.getAbsolutePath());
int num = is.available();
byte[] bs = new byte[num];
OutputStream os = new FileOutputStream(path2 + File.separator + file2.getName());
int realLen = is.read(bs, 0, bs.length);
os.write(bs, 0, realLen);
System.out.println("写入成功~");
if (is != null) {
is.close();
}
if (os != null) {
os.close();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
成功完成文件的拷贝
小结
如果我写的文章对您有帮助,那就为我点个赞吧,谢谢~