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包下的操作文件方式。
java io 学习笔记(一)的更多相关文章
- Java IO学习笔记:概念与原理
Java IO学习笔记:概念与原理 一.概念 Java中对文件的操作是以流的方式进行的.流是Java内存中的一组有序数据序列.Java将数据从源(文件.内存.键盘.网络)读入到内存 中,形成了 ...
- Java IO学习笔记总结
Java IO学习笔记总结 前言 前面的八篇文章详细的讲述了Java IO的操作方法,文章列表如下 基本的文件操作 字符流和字节流的操作 InputStreamReader和OutputStreamW ...
- Java IO学习笔记三
Java IO学习笔记三 在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类. OutputStreamWriter:是Writer的子类,将输出的 ...
- Java IO学习笔记二
Java IO学习笔记二 流的概念 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 程序中的输入输 ...
- Java IO学习笔记一
Java IO学习笔记一 File File是文件和目录路径名的抽象表示形式,总的来说就是java创建删除文件目录的一个类库,但是作用不仅仅于此,详细见官方文档 构造函数 File(File pare ...
- Java IO学习笔记一:为什么带Buffer的比不带Buffer的快
作者:Grey 原文地址:Java IO学习笔记一:为什么带Buffer的比不带Buffer的快 Java中为什么BufferedReader,BufferedWriter要比FileReader 和 ...
- Java IO学习笔记二:DirectByteBuffer与HeapByteBuffer
作者:Grey 原文地址:Java IO学习笔记二:DirectByteBuffer与HeapByteBuffer ByteBuffer.allocate()与ByteBuffer.allocateD ...
- Java IO学习笔记三:MMAP与RandomAccessFile
作者:Grey 原文地址:Java IO学习笔记三:MMAP与RandomAccessFile 关于RandomAccessFile 相较于前面提到的BufferedReader/Writer和Fil ...
- Java IO学习笔记四:Socket基础
作者:Grey 原文地址:Java IO学习笔记四:Socket基础 准备两个Linux实例(安装好jdk1.8),我准备的两个实例的ip地址分别为: io1实例:192.168.205.138 io ...
- Java IO学习笔记六:NIO到多路复用
作者:Grey 原文地址:Java IO学习笔记六:NIO到多路复用 虽然NIO性能上比BIO要好,参考:Java IO学习笔记五:BIO到NIO 但是NIO也有问题,NIO服务端的示例代码中往往会包 ...
随机推荐
- sqlTransaction 简单的应用
sqlTansaction表示要在 SQL Server 数据库中处理的 Transact-SQL 事务 static void Main(strng[] args) { //往数据库里面插入数据 s ...
- JavaScript 如何工作:渲染引擎和性能优化技巧
翻译自:How JavaScript works: the rendering engine and tips to optimize its performance 这是探索 JavaScript ...
- day01.2-python基础
一. python基本数据类型及操作 1. 数字.在python中,数字的初始化方式为直接赋值.如:a = 11 a). 加法运算 b ...
- loj #6226. 「网络流 24 题」骑士共存问题
#6226. 「网络流 24 题」骑士共存问题 题目描述 在一个 n×n\text{n} \times \text{n}n×n 个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘上 ...
- 编写可维护的Javascript纪要
第一部分: 编程风格 在大型项目开发中,因为项目可读性规范性的需要(就像<编写可维护性的Javascript>一书作者Nicholas Zakas大神所说,他们团队所有成员写出的代码就像是 ...
- JS中Math函数的常用方法
Math 是数学函数,但又属于对象数据类型 typeof Math => ‘object’ console.dir(Math) 查看Math的所有函数方法. 1,Math.abs() 获取绝对值 ...
- Qt 学习之路 2(45):模型
Home / Qt 学习之路 2 / Qt 学习之路 2(45):模型 Qt 学习之路 2(45):模型 豆子 2013年2月26日 Qt 学习之路 2 23条评论 在前面两章的基础之上,我们 ...
- 【转】idea中maven模块编程灰色
可能是设置中模块的pom.xml文件被忽略了 去掉对勾 转自:https://blog.csdn.net/ethan__xu/article/details/80794060
- 003 Android常见错误汇总
1.installation failed with message invalid file 解决办法: <1>.点击工具栏上的Build中的Clean Project <2> ...
- JAVA数据结构--ArrayList动态数组
在计算机科学中,动态数组,可扩展数组,可调整数组,动态表,可变数组或数组列表是一种随机存取可变大小列表数据结构,允许添加或删除元素.它提供许多现代主流编程语言的标准库.动态数组克服了静态数组的限制,静 ...