【学习笔记】IO 流(三)
File 类
我们使用流的方式可以读取和写入内容,但是像删除、剪切文件、获取文件创建时间等等这样的操作,我们使用流就不能实现了,所以我们学习一下 File 类的使用
-
概念:代表物理盘符中的一个文件或文件夹
-
方法:
-
createNewFile() //创建一个文件
-
mkdir() //创建一个新目录
-
delete() //删除文件或空目录
-
exists() //判断File对象所代表的文件是否存在
-
getAbsolutePath() //获取文件的绝对路径
-
getName() //获得文件的名字
-
getParent() //获取文件/目录 所在的目录
-
isDirectory() //判断文件是否是目录
-
isFile() //判断是否是文件
-
length() //获得文件的长度
-
listFiles() //列出目录中的所有内容
-
renameTo() //修改文件名为
-
1.分隔符
package com.iosteam.fileClass;
import java.io.File;
public class Demo16 {
public static void main(String[] args) {
separator();
}
public static void separator(){
System.out.println("路径分隔符:"+ File.pathSeparator);
System.out.println("名称分隔符:" + File.separator);
}
}
2.文件操作
2.1创建文件
//1创建文件
File file = new File("f:\\test\\file.txt"); //创建File对象
if(!file.exists()){ //判断文件是否存在
boolean flag = file.createNewFile(); //创建文件
System.out.println("创建结果:" + flag);
}
如果文件存在了,再去创建那么就会返回false
文件存在的话,调用exists方法就会返回true,反之返回false
在创建File对象时,给的路径不是绝对路径的话,就会在运行的项目的目录下创建
2.2删除文件
第一种方法:直接删除,调用delete方法
//删除文件
file.delete();
如果文件不存在,则返回false
第二种方法:使用jvm退出时删除
//第二种
file.deleteOnExit();
2.3获取文件信息
//获取文件信息
System.out.println("获取文件的绝对路径:" + file.getAbsolutePath());
System.out.println("获取路径:" + file.getPath());
System.out.println("获取文件名称:" + file.getName());
System.out.println("获取父目录:" + file.getParent());
System.out.println("获取文件长度:" + file.length());
System.out.println("获取文件创建时间:" + new Date(file.lastModified()));
}
2.3判断文件
//判断
System.out.println("文件是否可写:" + file.canWrite());
System.out.println("是否是文件:" + file.isFile());
System.out.println("文件是否隐藏:" + file.isHidden() );
3文件夹操作
3.1创建文件夹
//1创建文件夹
File dir = new File("f:\\test\\aaa"); //创建单个目录
File dir1 = new File("f:\\test\\bbb\\ccc"); //创建多个目录
if (!dir.exists()){
System.out.println("创建单个目录:"+dir.mkdir());
}
if (!dir1.exists()){
System.out.println("创建多个目录:"+dir1.mkdirs());
}
创建文件夹时,有两个方法 mkdir() 和 mkdirs()
mkdir 只能创建单级目录
mkdirs() 单级目录和多级目录都能创建
3.2删除文件夹
第一种方法:直接删除
//第一种方法:直接删除
dir1.delete();
删除目录时只能删除最里面的目录,并且如果目录中有文件的话,则不能删除该目录
第二种方法:使用jvm退出时删除
//第二种方法:使用jvm退出时删除
dir1.deleteOnExit();
3.3获取文件夹信息
//获取文件夹信息
System.out.println("获取文件夹的绝对路径:" + dir1.getAbsolutePath());
System.out.println("获取文件夹路径:" + dir1.getPath());
System.out.println("获取文件夹名称:" + dir.getName());
System.out.println("获取父目录:" + dir.getParent());
System.out.println("获取文件创建时间:" + new Date(dir.lastModified()));
3.4判断
//判断
System.out.println("是否是文件夹:"+ dir1.isDirectory());
System.out.println("是否是隐藏文件夹:" + dir1.isHidden());
3.5遍历文件夹
获取某个文件夹中的内容
//遍历文件夹
File file = new File("f:\\test");
String[] str = file.list();
for (String strs:
str) {
System.out.println(strs);
}
FileFilter 接口
文件过滤器
-
public interface FileFilter
-
boolean accept(File pathname)
-
-
当调用File 类中的 listFiles() 方法时,支持传入FileFilter接口实现类,对获取文件进行过滤,只有满足条件的文件才可以出现在listFiles() 的返回值中
我们使用这个接口来过滤txt文件
//FileFilter 接口
System.out.println("---------FileFilter 接口---------");
File[] files = dir2.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
if (pathname.getName().endsWith("txt")){
return true;
}
return false;
}
});
for (File f:
files) {
System.out.println(f.getName());
}
案例一:递归遍历文件夹
在文件夹中创建两个子文件夹和两个文件,并且在两个子文件夹中分别创建两个文件
要求把所有文件夹和文件都打印出来
//递归遍历文件夹
public static void listDir(File dir){
File[] files = dir.listFiles(); //获取全部文件夹
System.out.println(dir.getAbsolutePath()); //打印父目录
if (files != null && files.length>0){ //如果这个文件夹不是空
for (File f: files) { //遍历
if (f.isDirectory()){ //判断是不是文件夹
listDir(f); //如果是文件夹,就递归
}else{
System.out.println(f.getAbsolutePath()); //如果是文件就打印
}
}
}
}
案例二:递归删除文件夹
删除上面打印的文件和文件夹
//递归删除文件夹
public static void deleteDir(File dir){
File[] files = dir.listFiles();
if (files != null && files.length>0){
for (File f: files) {
if (f.isDirectory()){
deleteDir(f);
}else{
System.out.println(f.getAbsolutePath()+"删除:" + f.delete());
}
}
}
System.out.println(dir.getAbsolutePath() + "删除:" + dir.delete());
}
Properties
-
Properties 是属性集合,继承了Hashtable,是线程安全的 集合
-
特点:
-
存储属性名和属性值
-
属性名和属性值都是字符串
-
没有泛型
-
与流有关
-
-
方法:
-
String getProperty(String key) //通过key来获取属性值
-
void list(PrintStream out) //将属性列表输出到指定的输出流
-
void load(InputStream inStream) //从输出流中获取属性列表
-
Object setProperty(String key,String value) //设值,调用Hashtable的put方法
-
package com.iosteam.file;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
public class Demo18 {
public static void main(String[] args) {
//创建Properties集合
Properties properties = new Properties();
//添加数据
properties.setProperty("username","zhangsan");
properties.setProperty("age","18");
System.out.println(properties);
//删除数据
// properties.remove("username");
// System.out.println(properties);
//遍历数据
//1.keySet
System.out.println("-----------keySet-----------");
Set<Object> keySet = properties.keySet();
for (Object o: keySet) {
System.out.println((String)o+"======="+properties.getProperty((String)o));
}
//2.entrySet
System.out.println("-----------entrySet-----------");
Set<Map.Entry<Object,Object>> entry = properties.entrySet();
for (Map.Entry<Object,Object> o:
entry) {
System.out.println(o);
}
//3.stringPropertyNames
System.out.println("-----------stringPropertyNames-----------");
Set<String> pronames = properties.stringPropertyNames();
for (String pro: pronames) {
System.out.println(pro + "======="+properties.getProperty(pro));
}
}
}
-
和流有关的操作
//4.和流有关的操作
//-----list-------
System.out.println("---------list----------");
PrintWriter pw = new PrintWriter("f://test//print");
properties.list(pw);
pw.close();
//-------store方法,向store.properties保存数据-------
FileOutputStream fos = new FileOutputStream("f:\\test\\store.properties");
properties.store(fos,"注释");
fos.close();
第一行为我们的”注释“,因为properties文件不允许输入中文
//--------load方法,从store.properties加载数据----------
System.out.println("--------store------");
Properties properties1 = new Properties();
FileInputStream fis = new FileInputStream("f:\\test\\store.properties");
properties1.load(fis);
fis.close();
System.out.println(properties1);