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. angular component元素

  2. Sqlserver风格规范

    常见的字段类型选择 1.字符类型建议采用varchar/nvarchar数据类型 2.金额货币建议采用money数据类型 3.科学计数建议采用numeric数据类型 4.自增长标识建议采用bigint ...

  3. MongoDB插入时间不正确的问题

    关于mongodb插入时间不正确的问题 今天在给mongodb插入日期格式的数据时发现,日期时间相差8个小时,原来存储在mongodb中的时间是标准时间UTC +0:00,而中国的时区是+8.00 . ...

  4. HashMap数据结构的C++实现

    Hash表在计算机的应用编程中是一种很常用的数据结构,很多算法的实现都离不开它.虽然C++11标准模板库中的有hashmap类型的实现,但在工程实践中,若项目本身使用的是较低版本的C++,或是出于性能 ...

  5. 关于命名空间 namespace的总结

    namespace 有作用的类型  类.函数.常量关键字namespace必须在所有代码之前 除用于编码的declare语句 namespace Myproject; const A = 1; cla ...

  6. (转)使用vs调试的时候,如何知道程序阻塞在哪里?

    遇到一个问题,加了两个断点当运行到断点A后,我释放掉了,理想状态应该是在断点B停住,但并没有,程序感觉就像是阻塞了一样请问,这种状况如何知道程序当前是在哪里阻塞着? 回复: 可以让调试器停住,然后在调 ...

  7. spring boot项目分享

    Spring boot项目分享 以下项目是我自己做的一些练习项目,有兴趣的小伙伴可以下载下来看下 1.员工管理系统 下载地址:我的github 后续会继续补充

  8. HDU6342-2018ACM暑假多校联合训练4-1011-Problem K. Expression in Memories

    Problem K. Expression in Memories Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262 ...

  9. SHELL编程之条件判断

    一.if 语句结构 (1)单分支语句结构 if  条件测试操作 then  命令序列 fi #!/bin/bash MOUNT_DIR="/media/cdrom/" #-d $M ...

  10. JDBC_PreparedStatement用法_占位符_参数处理

    import java.sql.Connection; import java.sql.Date;import java.sql.DriverManager;import java.sql.Prepa ...