IO模型与NIO基础一

File类

      File类主要是JAVA为文件这块的操作(如删除、新建等)而设计的相关类File类的包名是java.io,其实现了Serializable, Comparable两大接口以便于其对象可序列化和比较

创建一个文件/文件夹
删除文件/文件夹
获取文件/文件夹
判断文件/文件夹是否存在
对文件夹进行遍历
获取文件的大小

      File类是一个与系统无关的类,任何的操作系统都可以使用这个类中的方法
重点:记住这第三个单词
file——文件
directory——文件夹/目录
path——路径

绝对路径————是一个完整的路径
以盘符( 比如C:)开始的路径
c:\a.txt
c:\demo\b.txt

相对路径————是一个简化的路径
相对指的是相对于当前项目的根目录
如果使用当前项目的根目录,路径可以简化书写
D:\java\Java语言高级\File类\File类\File类的概述.avi–>简化为——File类的概述.avi(可以省略项目的根目录)

注意
路径是不区分大小写
路径中的文件名称分隔符widows使用反斜杠,反斜杠是转义字符,`两个反斜杠代表一个普通反斜杠。

File类的静态属性

static String pathSeparator——与系统有关的路径分隔符,为了方便,它被表示为一个字符串。
static char pathSeparatorChar——与系统有关的路径分隔符。
windows下是分号,Linux下是冒号
static String Separator——与系统有关的默认名称分隔符,它被表示为一个字符串。
static char SeparatorChar——与系统有关的默认名称分隔符。
windows下是 \,Linux下是 /
public class filetest {
   
   
    public static void main(String[] args) {
   
   
        System.out.println(File.pathSeparator);  //系统路径分隔符,win是分号,liunx是冒号
         System.out.println(File.separator);
    }
}

在这里插入图片描述

File类的构造方法

File(String pathname)——通过将给定路径名字符串转换为抽象路径名来创建一个新的File实例。
参数

String pathname————字符串的路径名称
路径可以是以文件结尾,也可以是以文件夹结尾(win中文件有扩展名就是文件平)。
路径可以是相对路径(以项目根目录),也可以是绝对路径。
路径可以是存在的,也可以是不存在的。
创建File对象,只是把字符串路径封装为File对象,不考虑路径的真假情况。
public class filetest {
   
   
    public static void main(String[] args) throws IOException {
   
   
         File file = new File("xiong.txt");
         file.createNewFile();   //只是文件名的话,文件创建放在项目的根目录下。
         
        File file2 = new File("xiong");
        file2.createNewFile();
        file2.mkdir();
    }
}

在这里插入图片描述
File(String parent, String child)——根据parent路径名字符串和child路径名字符串来创建一个新的File实例。

参数————————把路径分成了两部分
String parent————父路径,该路径中的文件夹是已存的,不存在会报错
String child—————子路径
好处
父路径和子路径可以单独书写,使用起来非常灵活;父路径和子路径都可以变化。
public class filetest {
   
   
    public static void main(String[] args) throws IOException {
   
   
   

        File file = new File("C:\\abc\\","ccc.txt");
        file.createNewFile();
        System.out.println(file.getAbsolutePath());

    }
}

在这里插入图片描述

File(File parent, String child)——根据parent路径名字符串和child路径名字符串来创建一个新的File实例。

好处
父路径和子路径可以单独书写,使用起来非常灵活;父路径和子路径都可以变化。
父路径是File类型,可以使用File的方法对路径进行一些操作,在使用路径创建对象。

       File fileparent = new File("c:\\abc");
        fileparent.mkdir();
        File file = new File(fileparent,"ccc.txt");
        file.createNewFile();
        System.out.println(file.getAbsolutePath());
        

File类中访问文件名相关的常用方法
public String getName()————返回此File标识的文件或目录的名称。
public String getPath()————将此File转换为路径名字符串。
public String getAbsolutePath()————返回此File的绝对路径名字符串,返回的是绝对路径。
public String getParent()————返回File对象所对应的目录(最后一级子目录)的父目录名称。
public boolean renameTo(File newName)————重命名此File对象所对应的文件或目录,成返回true
File类检查文件的相关常用方法
public boolean exists()————此File表示的文件或目录是否实际存在 。
public boolean isDirectory()————此File表示的是否为目录 。
public boolean isFile()————此File表示的是否为文件 。
public canWrite()————此File是否可写
public canRead()————此File是否可读
public isAbsolute()————此判断创建File对象时是不是用的是绝对路径
获取文件常规信息的常用方法
public long lastModified()————返回文件的最后修改时间。
public long length()————返回文件内容的长度。

File类创建删除文件的常用方法
public boolean creatNewFile()——当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。
creatNewFile声明抛出了IOException,我们调用这个方法,就必须处理这个异常,要么throws,要么try catch
public boolean delete()——删除由此File表示的文件或目录。
此方法,可以删除构造方法路径中给出的文件/文件夹。注意delete方法直接在硬盘删除文件/文件夹,不走回收站,删除要谨慎。
public boolean mkdir()——创建由此File表示的目录。
创建单级空文件夹
public boolean mkdirs()——创建由此File表示的目录,包括任何必需但不存在的父目录。
既可以创建单级空文件夹,也可以创建多级文件夹

File类遍历(文件夹)目录功能
public String[ ] list( )——返回一个String数组,表示该File目录中的所有子文件或子目录。
public File[ ] listFiles( )——返回一个File数组,表示该File目录中的所有子文件或子目录。
注意
list方法和listFiles方法遍历的是构造方法中给出的目录。
如果构造方法中给出的目录的路径不存在,会抛出空指针异常。
如果构造方法中给出的路径不是一个目录,也会抛出空指针异常。

public class filefind {
   
   
    public static void main(String[] args) {
   
   
        File file=new File("C:\\Users\\Administrator\\Desktop\\STSWORKSPACE\\EduSystem");
        String[] fileNames = file.list();
        File[] files = file.listFiles();
        for(String filename:fileNames){
   
   
            System.out.println(filename);
        }
       for(File subfile:files){
   
   
            System.out.println(subfile);
        }

    }
}
----------------------------------------------------------------------

.classpath
.mymetadata
.project
.settings
src
WebRoot
C:\Users\Administrator\Desktop\STSWORKSPACE\EduSystem\.classpath
C:\Users\Administrator\Desktop\STSWORKSPACE\EduSystem\.mymetadata
C:\Users\Administrator\Desktop\STSWORKSPACE\EduSystem\.project
C:\Users\Administrator\Desktop\STSWORKSPACE\EduSystem\.settings
C:\Users\Administrator\Desktop\STSWORKSPACE\EduSystem\src
C:\Users\Administrator\Desktop\STSWORKSPACE\EduSystem\WebRoot

文件过滤器的原理和使用
          在File类中有两个listFiles重载的方法,方法的参数传递的就是过滤器。
          File[ ] listFiles(FilesFilter filter)
java.io.FilesFilter 接口————用于抽象路径名(File对象)的过滤器。我常通过内部类的方式执行accept方法。
FilesFilter 接口里包含了一个抽象方法:boolean accept(File pathname)
参数
File pathname———使用listFiles方法遍历目录,得到的每一个文件对象。

例:找到一个目录下所有扩展名为.java的文件,并打印其绝对路径

public class filefind {
   
   
    public static void main(String[] args) {
   
   
        File file=new File("C:\\Users\\Administrator\\Desktop\\STSWORKSPACE\\EduSystem");
        //文件过滤器,筛选想要的文件
       getJavaFiles(file);

    }
    //获得所有.java文件
    public static void getJavaFiles(File file){
   
   
        if(!file.isDirectory()){
   
   
            return;
        }
        //是文件夹,进一步扫描
        File[] files = file.listFiles(new FileFilter() {
   
   
            @Override
            public boolean accept(File subFile) {
   
   
                if(subFile.isDirectory()) return true;
                else
                    return subFile.getName().toLowerCase().endsWith(".java");
            }
        });
       for(File rsFile:files){
   
   
            if(rsFile.isDirectory()){
   
   
                getJavaFiles(rsFile);              //递归,如果找到的子文件还是文件夹的话,再找
            }else{
   
   
                System.out.println(rsFile);       //输入文件的绝对路径
            }
        }
    }
}

          File[ ] listFiles(FilenameFilter filter)
java.io.FilenameFilter 接口————实现此接口的类实例可用于过滤文件名。
FilenameFilter接口里包含了一个抽象方法:boolean accept(File dir,String name)
参数
File dir ——————构造方法中传递的被遍历的目录
String name————使用lisFiles方法遍历目录,获取的每一个文件/文件夹的名称。

RandomAccessFile

      Java还提供了专门处理文件内容的类,即RandomAccessFile(随机访问文件)类。该类是Java语言中功能最为丰富的文件访问类,它提供了众多的文件访问方法。
      RandomAccessFile类支持“随机访问”方式,这里“随机”是指可以跳转到文件的任意位置处读写数据。
      RandomAccessFile对象类有个位置指示器,指向当前读写处的位置,
当前读写n个字节后,文件指示器将指向这n个字节后面的下一个字节处。
刚打开文件时,文件指示器指向文件的开头处,可以移动文件指示器到新的位置,随后的读写操作将从新的位置开始。

RandomAccessFile类在随机读取时有很大的优势,但该类仅限于操作文件,不能访问其他的I/O设备,如网络、内存映像等。
RandomAccessFile类的构造方法如下所示:
RandomAccessFile(File file , String mode)
      //创建随机存储文件流,文件属性由参数File对象指定

RandomAccessFile(String name , String mode)
      //创建随机存储文件流,文件名由参数name指定

   这两个构造方法均涉及到一个String类型的参数mode,它决定随机存储文件流的操作模式,其中mode值及对应的含义:

“r”:以只读的方式打开,调用该对象的任何write(写)方法都会导致IOException异常
“rw”:以读、写方式打开,支持文件的读取或写入。若文件不存在,则创建之。
“rws”:以读、写方式打开,与“rw”不同的是,还要对文件内容或元数据的每次更新都同步更新到底层的存储设备中去。
“rwd”:以读、写方式打开,与“rw”不同的是,还要对文件内容的每次更新都同步更新到底层的存储设备中去。

      任何文件系统中的数据分为数据和元数据。数据是指普通文件中的实际数据,即文件的实际内容;
      而元数据指用来描述一个文件的特征的系统数据,诸如访问权限、文件拥有者以及文件数据块的分布信息(inode…)等等。
例:

public class RandomAccessFileTest{
   
   
	public static void main(String[] args) {
   
   
		RandomAccessFile rf=null;
		RandomAccessFile rfr=null;   //读用的
		try {
   
   
			Employee employee1 = new Employee("shaowen", 42);   //创建对象时,名字不能用汉字,用了汉字,只要要一个就变了,三个对象不能保证为36个字节了。
			Employee employee2= new Employee("zhangsan", 20);
			Employee employee3=new Employee("wangmazi", 15);
			 rf= new RandomAccessFile("c:\\employee.txt", "rw");
			rf.write(employee1.name.getBytes());                           //有很多写方法,这里选了write(字节数组)
			rf.writeInt(employee1.age);
			
			rf.write(employee2.name.getBytes());                           //有很多写方法,这里选了write(字节数组)
			rf.writeInt(employee2.age);
			
			rf.write(employee3.name.getBytes());                           //有很多写方法,这里选了write(字节数组)
			rf.writeInt(employee3.age);
			rfr = new RandomAccessFile("c:\\employee.txt", "r");
			
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

熊少文

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值