IO流分两种:字节流和字符流,字节流可以处理所有数据,包括图片音频视频传统文本等,字符流是专门用来处理文字的流,自然能够使用字符流的地方一定可以使用字节流,反过来不一定。
又可分为处理流和节点流:节点流是基础,处理流是在节点流的基础上进行操作。
最近学习了File类、InputStream类、OutputStream类、Reader类、Writer类、FileInputStream类、FileOutputStream类、FileReader类、FileWriter类、以及对应的处理流缓冲流,包括BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter,只有其他的ArrayByteInputStream等等几个流只是稍微了解了一下。
总结来说,IO流处理分四步骤:
一、指定源
二、选择流
三、进行流操作
四、记得关闭流
手动写了一个文件夹拷贝的程序,可以拷贝文件夹包括里面所有的资料到另外一个自己指定的文件夹。由于当时写的时候还没学到缓冲流,就直接没加缓冲流,加缓冲流其实是有必要的,毕竟提升性能,操作也就是在节点流的外面套一层缓冲流,其余操作大同小异。
package UseIOCopyDirectoryAndFile;
/**
* 实现文件夹的拷贝功能
* 会拷贝文件夹里面所有的东西到另外一个文件夹
* 也可以直接拷贝文件
*/
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class Demo01 {
public static void main(String[] args) {
File src = new File("C:/Users/Administrator/Desktop/文件备份");//指定源路径
File dist = new File("C:/Users/Administrator/Desktop/copyHomework");//指定目标路径
Demo01 d1 = new Demo01();
d1.copyMethod(src, dist);
}
public void copyMethod(File src,File dist) {
if(src!=null&&src.isFile()) {
copyFile(src,dist);
}else if(src!=null&&src.isDirectory()) {
dist.mkdir();//创建文件夹
for(File file:src.listFiles()) {
File copyFile = new File(dist.getAbsolutePath()+"\\"+file.getName()); //获取新的目标文件
// System.out.println(dist.getAbsolutePath()+"\\"+file.getName());
// System.out.println(file.getAbsolutePath());
copyMethod(file,copyFile);//递归调用
}
}else {
System.out.println("源文件不存在!");
}
}
public void copyFile(File src,File dist) {
InputStream is = null;
OutputStream os = null;
try {
is = new FileInputStream(src);
os = new FileOutputStream(dist);
byte[] flush = new byte[1024];//每次拷贝一个Kb的数据
int len = 0;
while((len=is.read(flush))!=-1) {//这里len返回的是实际读取到的字节长度,为-1表示读取到文件末尾,注意和无参数的read()区分返回值
os.write(flush,0,len);
}
os.flush();//刷新缓冲区
}catch(FileNotFoundException e) {
e.printStackTrace();
}catch(IOException e) {
e.printStackTrace();
}finally {
//先打开的流后关闭,后打开的流先关闭,而且要分别关闭,防止相互影响
try {
if(os!=null) os.close();
}catch(IOException e) {
e.printStackTrace();
}
try {
if(is!=null) is.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}
}
之前学IO流学了几次,感觉很难,这次感觉学的比较简单,可能是之前积累的东西有了反应。另外再补充一句,之前老觉得编程才是主要的东西,操作系统甚至数据库都没有好好学习,就看重JAVA、C++,简直愚蠢,希望自己早点把东西补回来。