今天学习了I/O,以前基础班学了一个字符流,现在从File学着走,学习了字节流,虽然自己以前看了视频,但也忘记了很多,今天一讲,也会加深一些印象,今天详细笔记如下:
I/O流
一、File类概述
File:文件和目录路径名的抽象表示形式
构造方法:
a:File(String pathname) :将一个字符串路径封装成File对象
b:File(String parent,String child):传入一个父级路径和子级路径
c:File(File parent,String child):传入一个File类型的父级路径和子级路径
主要方法:
a:判断功能
1.boolean exists():判断指定路径的文件或文件夹是否存在
2.boolean isAbsolute():判断当前路路径是否是绝对路径
3.boolean isDirectory():判断当前的目录是否存在
4.boolean isFile():判断当前路径是否是一个文件
5.boolean isHidden():判断当前路径是否是隐藏文件
b:获取功能
1.File getAbsoluteFile():获取文件的绝对路径,返回File对象
2.String getAbsolutePath():获取文件的绝对路径,返回路径的字符串
3.String getParent():获取当前路径的父级路径,以字符串形式返回该父级路径
4.File getParentFile():获取当前路径的父级路径,以字File对象形式返回该父级路径
5.String getName():获取文件或文件夹的名称
6.String getPath():获取File对象中封装的路径
7.long lastModified():以毫秒值返回最后修改时间(与Date使用可以得出最后修改日期)
8.long length():返回文件的字节数(注意,文件夹调用方法返回0,查看文件夹要遍历所有子文件,统计文件大小和)
修改功能:
9.boolean renameTo(File dest): 将当前File对象所指向的路径 修改为 指定File所指向的路径
c:其他功能
1.String[] list():以字符串数组的形式返回当前路径下所有的文件和文件夹的名称
2.File[] listFiles():以File对象的形式返回当前路径下所有的文件和文件夹的名称
3.static File[] listRoots():获取计算机中所有的盘符
二、I/O流分类
按流向分
输入流 读取数据
输出流 写入数据
按数据类型分
字节流
字节输入流 InputStream
字节输出流 OutputStream
字符流
字符输入流 FileReader
字符输出流 FileWriter
三、使用情况
a:字符流:适用于文本文件的读写操作(只能是在电脑上能用记事本打开,并且不乱码的情况下)
b:字节流:所有文件都行,但是文本文件读写的时候要注意编码格式,如果不对应会出现乱码
(utf-8,GBK等),视频,音频,图片只能用字节流。
四、综合练习
public static void main(String[] args) throws Exception {
File cdir = getDir(); //使用getDir方法获取复制源文件夹
File vdir = getDir(); //使用getDir方法获取复制目的地文件夹
copyDirectoryToDirectory(cdir, vdir); //调复制文件夹的方法
System.out.println("复制完成");
}
//键盘录入文件夹
public static File getDir(){
System.out.println("请输入一个文件夹路径:");
Scanner s = new Scanner(System.in);
while(true){
String line = s.nextLine();
File dir = new File(line);
if(!dir.isDirectory()){
System.out.println("您输入的文件夹路径有误,请重新输入!");
}else {
return dir;
}
}
}
/**
* 复制文件夹
* @param cdir 源文件夹
* @param vdir 目的地文件夹
* @throws IOException
*/
public static void copyDirectoryToDirectory(File cdir,File vdir) throws IOException{
File newDir = new File(vdir, cdir.getName()); //把源文件夹名字 复制到目的文件夹
if(!newDir.exists()){ //目的文件夹里面没有源文件夹 创建
newDir.mkdir();
}
File[] listFiles = cdir.listFiles(); //创建源文件夹文件数组
for(File list:listFiles){ //遍历源文件夹
if(!list.isDirectory()){ //判断是文件夹还是文件,文件就用字节流复制
//1.输入流
FileInputStream fis = new FileInputStream(list);
//2.输出流,封装的新文件夹下的文件
File list2 = new File(newDir, list.getName());
FileOutputStream fos = new FileOutputStream(list2);
// FileOutputStream fos = new FileOutputStream(newDir,list.getName()); //fos没有传文件,文件名字的方法,所以要先封装
//字节数组,存输入流读取的字节 1024的整数倍
byte[] bys = new byte[1024*64];
//字节数组读取了多少个
int len = 0;
//循环,当读到没有的时候结束
while((len = fis.read(bys)) != -1){
//写出读到的字节
fos.write(bys, 0, len);
}
//关流
fis.close();
fos.close();
}else{//文件夹就递归
copyDirectoryToDirectory(list, newDir);
}
}
}
|
|