关于File和RandomAccessFile的总结

来源:互联网 发布:淘宝客佣金生效时间 编辑:程序博客网 时间:2024/06/08 00:30

个人学习总结:

关于File类

File file = new File(…);

这里的file 表示的是一个文件或者一个目录,创建时里面是一个抽象的路径,尽量使用相对路径来创建这样一个file对象。

因为操作系统不同”/”(其它)和”\”(windows)也不同,所以可以使用File类里的一个常量: File.separator

 

       关于这个file对象的几个重要的api

       1. exists  判断该目录或者文件是否存在;

 

       2. isFile和isDirectory判断该file对象是一个文件还是一个目录;

         注意:如果该file对象不存在 那这两个方法都是false。有点废话,不存在当然是false了

 

       3.createNewFile:创建新文件

注意:该方法必须保证,这个文件之前的目录是存在的,如果文件的之前的目录不存在,那是创建不了的。另外该file文件是不存在的,如果已经存在了也创建不了,没有覆盖一说。所以想要使用这个方法,必须注意两点:a.文件之前的目录存在;b.该文件不存在。

mkDir:创建目录 该方法必须保证父目录存在,如果父目录不存在或者该目录已经存在则不创建,没有覆盖一说。

mkDirs: 创建目录以及不存在的父目录 该方法是对前一个方法的升级 如果父目录不存在该方法也能创建出父目录,如果父目录存在则在相应的目录下创建出不存在的子目录,没有覆盖一说。

以上三个方法 如果创建成功 则都会返回一个true 否则返回false,但是mkDirs如果创建失败,也有可能创建了一些必要的目录,这里要注意一下。

      

       4.length:long  返回该file对象所占用的空间 (字节数)

      

       5.delete:该方法用来删除该file对象,删除成功返回ture 否则false

       注意:删除的如果是一个目录,则该目录必须是一个空目录,里面不可以有子项,所以要想删除       有子项的目录,记得上课的时候老师说 要用递归的办法,具体百度。

 

6.listFiles:File[]该方法返回该file对象的所有子项(子目录和文件)的抽象路径数组,所以这个file合理的就是一个目录了,如果不是一个目录或者这个目录是空的或者发生了IO错误,则返回null。经典使用方法,获得该目下所有子项路径File[] subs = file.listFile(“.”);

和这个方法配套的一个接口就是FileFilter接口:抽象路径过滤器,使用方法一般是用匿名内部类:

File subs =file.listFile(new FileFilter(){

       @Override

       public boolean accept(File pathname){

       return pathname.getName().一些方法()

}

});

一些方法有:startsWith(“.”) 以.开头

                      endsWith(“.txt”) 以.txt结尾 等

 

以上就是File这个类的用处,主要记得区分文件和目录,两个都使用该类创建对象,但是两者的api略有不同,所以要分清是目录还是文件,但是这个File类只是用于文件目录的管理,对文件的读写需要别的类来操作。

关于RandomAccessFile

RandomAccessFile raf = new RandomAccessFile(Filefile,String mode);

RandomAccessFile raf = new RandomAccessFile(Stringfilename,String mode);

这里的文件可以是一个file对象 也可以是一个file的抽象路径。

另外如果该file不存在,则通过该对象的建立会自动生成一个file,相当于createNewFile了下。所以了,如果是不存在的文件,创建的file的前的目录必须存在,否则报找不到文件的错误。不再赘述,详情看file的createNewFile。

 

这个类是基于指针的方式对文件进行读写的 模式mode一般用”rw”读写、”r”读。

1.关于该类的单个字节的读写方法:

如果写入的是一个int型则 将该int的值的低8位写入(刚好一个字节) 所以建议int最大值就是255,否则数字就不准确了 因为一个int是四个字节即32个位 00000000 00000000 00000000 00000000,如果超过255的话就跳到第9位,比如256是00000000 00000000 00000001 00000000 实际写入的其实是0,而257则是00000000 00000000 00000001 00000001 实际写入的是1

另外之前说了 该对象是基于指针的形式,不管你是write()一次 还是read() 一次指针都往后移动一次 从第0个开始,如果read()到末尾 则会返回一个-1(当然这里读写都不是字节数组)。

 

2.所以 读写还可以是字节数组的形式。

关于字节数组的读写,首先你要创建一个字节数组

byte[] buf = “HelloWorld”.getBytes() 通过该方法可以将一个字符串转成一个字节数组

然后通过raf.write(buf); 即可将整个字节数组写入到文件 当然此时的指针指向第10个位置(从0开始)。

字节数组形式读文件,这里理解方式要注意:

关于字节数组形式的读文件 使用read(byte[] buf) 方法后返回的并非一个byte[],而是一个int,这个int是此次读文件操作 读到的字节个数。

这个点理解起来是比较搞的:但是我们只能接受,知道如何使用读方法,按步骤来:

既然要读数组 首先需要一个数组容器 所以我们先创建一个byte[] buf = new byte[?]; 关键在于这个容器的长度到底设置多少? 我自己是这样想的设置成 (int)file.length() 这样文件多大就读多少,当然肯定有个限制了,这里姑且就这样了。
但是为了说明问题,其实这里的buf容器 决定了你读一次所获得的长度以及指针指向的位置。

如果byte的长度少于文件的长度 那么指针就会指向第0+byte.length个位置,如果此次读取的byte长度超过了文件的末尾,则指针只会停留在最后一个位置(EOF)即 第0+file.length()处。

重点是读到的内容放在哪里了呢?内容放在了你定义的那个byte[]容器里了。文件里的数据以单个byte存放在在byte[] buf容器里。

 

3.seek和skipBytes方法 这两个方法是控制raf指针的 seek(n) n从0~file.length 通过该方法可以将raf的指针指向任何位置。

skipBytes(n) 顾名思义就是跳过多少个字节 通过该方法可以将指针往后跳。但是最远只能到file.length()

 

4.getFilePointer:获得此时的指针位置

 

5.raf.close()方法 总之这个是关闭raf和文件的关联 释放资源,如果创建了raf对象 记得在最后使用该方法。

 

通过以上对RandomAccessFile的介绍可以知道,这个类就是关联上一个文件,可以对文件进行基于指针的读写操作。当然,关于读写它还有很多别的api,比如readline()方法 返回该行的String

但是需要进行一次编码转换:

String s = raf.readLine();

String ns = new String(s.getBytes(8859-1),”GBK”); 因为raf.readLine()读取过来是按照ISO8859-1编码读取,后面的GBK则是文本文件的编码格式,所以GBK是可以改变的,根据你的文件的编码格式。

如此在控制台显示的字符串才能正确看见。

读完最后一行后 再读将返回null,所以可以通过是否为null来判断是否读完(使用while循环)。

2 0
原创粉丝点击