java io 学习笔记(一)

java的IO操作都在java.io包下面,这个包下面有12个接口和而是多各类,类从读写的角度可以分为两种,一种是用于读,一种是用于写;从字符流字节流的角度,也可以分为两种,一种和字符有关,一种和字节有关。这样,所有的类就分为了四种。java的分类方式是先按字节字符分,在分读和写,继承的关系图如下:

 

    所谓读写,就是把从一个源把数据读入内存,或者把内存里的数据写入到一个目的地。所以要进行读写,首先就必须要有一个读的源或者写的目的。这个源或者目的地可以是本地的文件、连接,也可以是个网络接口,还可以是内存里的对象比如Byte[],String,管道或者其他流。

按照正常的学习路径,一般人都会先从本地文件的读写学起,要读取本地的文件,那么首先就是要怎么样找到这个文件,这涉及到文件系统,文件系统就是文件夹、子文件夹、文件组成的一棵树。所以,我们先不学怎么读写文件,先学习怎么操作这棵树。

    操作这棵数最重要的是一个叫File的类,这个类虽然叫“File”,但其实它更像是一个文件路径的代表或者说句柄,提供对文件的各种操作,不仅提供文件的操作,还提供对文件夹的操作。这个类可以创建或删除文件/文件夹,也可以查文件/文件夹的各项属性,还可以检测文件/文件夹是否存在。

    那既然是涉及到文件树,那就比如涉及到怎么表达一个路径了,我们知道,windows是以类似这样的方式表达一个路径的:c:\\directory\\subdirectory\\file.txt, linux/unix则是: /directory/subdirectory/file.txt。java采用的是平台无关的设计,所以统一用linux/unix的方式,所以windows下,就变成了:/c:/directory/subdirectory/file.txt。也就是说不用反斜杠。当然,如果一定要写成c:\\directory\\subdirectory\\file.txt,也是可以的,但是只能用在windows下面。

   下面来一一介绍File使用的一些需要注意的地方:

   1、 在介绍之前,先明白一个概念,这个概念后多次用到:“当且仅当”的意思是完全按照预先的目标实现了操作的意思,比如“当且仅当删除成功”的意思是“原本文件确实存在,并且我真的成功把它删除了”,如果文件本来就不存在,那不能说明你成功把它删除了,因为他本来就不存在,功劳不在你身上。在javadoc里面用的是“if and only if”。

  2、File的path可以是绝对路径,也可以是相对路径。当使用相对路径的时候,是相对于当前工作路径的。另外在windows下,如果不指定驱动盘号,则绝对路径是以当前盘下的根目录为根目录的,比如在F盘,那么“/directory”则对应于"f:\directory"。

 

1、创建文件夹

File提供了两个函数来创建夹:mkdir和mkdirs。他们的区别是前者必须要保证上一级文件夹存在,后者则会自动创建各级问价夹。这两个函数的返回值都是boolean,当且仅当返回true,如果涉及到权限问题,这抛出SecurityException异常。

2、创建文件

文件用createNewFile,如果文件原本不存在,就创建一个新的空文件并返回true,如果问价已经存在了,则不做任何动作并返回false。

还有两个函数createTmpFile(String prefix,String suffix)、createTmpFile(String prefix,String suffix,File directory)很有趣,他们是创建具有指定前缀后后缀的零时文件,临时文件的前缀和后缀之间的字母,会自动编号防止重复,这点在需要生产临时文件的时候很有用。二者的区别是前者把临时文件创建在系统默认临时文件目录,后者用directory指定的目录。

3、删除

删除很简单,就只有delete一个函数,但是需要注意的是,删除文件夹的时候,文件夹本身必须是空的,否则抛出IOEexetion异常。当且当且仅当文件(夹)被成功删除返回true,否者返回false。

4、查询和检测

查询包括查时间、类型、是否存在是什么等等,如果类型是文件夹,那么还可以查文件夹里面有啥、容量大小。查询需要有查询权限,否则报SecurityException异常。

5、路径操作

其实路径操作有点像查询,但是和查询不同,查询设计到文件(夹)是否存在的问题,如果文件不存在,那就不可能被查询。但是路径操作可以不要求文件存在,前面提到,File更像是一个文件的代表或者说句柄,所以,File可以实现仅仅对path本身操作,就和操作字符串一样,而不用关心在文件系统中是否真的存在这样一个文件(夹)。所以,如果问价夹不存在,也可以使用getParent、getParentName和getAbsoluteFile、getAbsolutePath这样的文件路径操作。

6、属性操作

属性操作包括了改变可读性、可写性和可执行性,如果你熟悉Linux的话,它和chmod实现的操作差不多

7、转化

把这个File这个路径代表转化为String、url。

 

可以看到File类比较乱,把文件操作和路径操作搞在同一个类,而且对于很多操作失败(比如删除一个空文件,创建一个已经存在的文件)都只是简单地返回一个false,而不是返回异常,所以是很不方便的一个类。这个类是从jdk1.0开始就有的,从jdk1.7(即java 7)开始,java使用Path接口 和Files类来分离路径操作和文件操作,并且放在了java.nio.file包下面。下一篇将学习java.nio.file包下的操作文件方式。

posted on 2017-12-20 11:16  J.M.Liu  阅读(353)  评论(0编辑  收藏  举报