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包下的操作文件方式。

java io 学习笔记(一)的更多相关文章

  1. Java IO学习笔记:概念与原理

    Java IO学习笔记:概念与原理   一.概念   Java中对文件的操作是以流的方式进行的.流是Java内存中的一组有序数据序列.Java将数据从源(文件.内存.键盘.网络)读入到内存 中,形成了 ...

  2. Java IO学习笔记总结

    Java IO学习笔记总结 前言 前面的八篇文章详细的讲述了Java IO的操作方法,文章列表如下 基本的文件操作 字符流和字节流的操作 InputStreamReader和OutputStreamW ...

  3. Java IO学习笔记三

    Java IO学习笔记三 在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类. OutputStreamWriter:是Writer的子类,将输出的 ...

  4. Java IO学习笔记二

    Java IO学习笔记二 流的概念 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 程序中的输入输 ...

  5. Java IO学习笔记一

    Java IO学习笔记一 File File是文件和目录路径名的抽象表示形式,总的来说就是java创建删除文件目录的一个类库,但是作用不仅仅于此,详细见官方文档 构造函数 File(File pare ...

  6. Java IO学习笔记一:为什么带Buffer的比不带Buffer的快

    作者:Grey 原文地址:Java IO学习笔记一:为什么带Buffer的比不带Buffer的快 Java中为什么BufferedReader,BufferedWriter要比FileReader 和 ...

  7. Java IO学习笔记二:DirectByteBuffer与HeapByteBuffer

    作者:Grey 原文地址:Java IO学习笔记二:DirectByteBuffer与HeapByteBuffer ByteBuffer.allocate()与ByteBuffer.allocateD ...

  8. Java IO学习笔记三:MMAP与RandomAccessFile

    作者:Grey 原文地址:Java IO学习笔记三:MMAP与RandomAccessFile 关于RandomAccessFile 相较于前面提到的BufferedReader/Writer和Fil ...

  9. Java IO学习笔记四:Socket基础

    作者:Grey 原文地址:Java IO学习笔记四:Socket基础 准备两个Linux实例(安装好jdk1.8),我准备的两个实例的ip地址分别为: io1实例:192.168.205.138 io ...

  10. Java IO学习笔记六:NIO到多路复用

    作者:Grey 原文地址:Java IO学习笔记六:NIO到多路复用 虽然NIO性能上比BIO要好,参考:Java IO学习笔记五:BIO到NIO 但是NIO也有问题,NIO服务端的示例代码中往往会包 ...

随机推荐

  1. 【连载】redis库存操作,分布式锁的四种实现方式[二]--基于Redisson实现分布式锁

    一.redisson介绍 redisson实现了分布式和可扩展的java数据结构,支持的数据结构有:List, Set, Map, Queue, SortedSet, ConcureentMap, L ...

  2. 《spring 攻略》笔记1

    chapter1 spring简介 两种spring ioc容器实现类型: BeanFactory ApplicationContext 应用程序上下文 DI技巧: @Autowired(requir ...

  3. CLion中出现错误add_dependencies called with incorrect number of arguments解决

    出现这个错误以后我以为是IDE出现问题了,可是重新启动,打开其他的工程文件以后发现并没有这个错误,但是新建的文件却报错 然后就打开其他工程的Cmake_list.txt文件,发现最后一行是有工程文件夹 ...

  4. 题解 P1632 点的移动

    P1632 点的移动 题目描述 平面上有N个整数坐标点.如果将点(x0,y0)移动到(x1,y1),则需要的代价为|x0-x1|+|y0-y1|.求使得K(K=1,-,N)个点在同一位置上最少需要的代 ...

  5. pkg-config 切换opencv版本

    查看当前版本 pkg-config --modversion opencv 在~/.bashrc最后添加如下内容: CMAKE_INSTALL_PREFIX=/usr/local/opencv3 ex ...

  6. 6A - Daydreamin

    #include <iostream> #include <cstdio> using namespace std; typedef long long ll; ll dp[] ...

  7. 小程序tabBar显示问题

    我一直在纠结为什么小程序在有的页面显示,有的页面不显示 查了一下才知道,小程序tabBar只在tabBar中的list定义了页面的才会显示,其余页面不会显示 如下例:tabBar只在画红框的页面显示

  8. Android 简单适配器(SimpleAdapter)

    1.介绍 2.简单适配器的实现方法 3.XML文件 (1)主页面布局 <?xml version="1.0" encoding="utf-8"?> ...

  9. 洛谷 P2147 [SDOI2008]洞穴勘测 (线段树分治)

    题目链接 题解 早就想写线段树分治的题了. 对于每条边,它存在于一段时间 我们按时间来搞 我们可把一条边看做一条线段 我们可以模拟线段树操作,不断分治下去 把覆盖\(l-r\)这段时间的线段筛选出来, ...

  10. SPOJ - LOCKER 数论 贪心

    题意:求出\(n\)拆分成若干个数使其连乘最大的值 本题是之江学院网络赛的原题,计算规模大一点,看到EMAXX推荐就做了 忘了大一那会是怎么用均值不等式推出结果的(还给老师系列) 结论倒还记得:贪心分 ...