工作快3年了,总是为了工作而工作,很多东西用的很熟练,但仅仅是知其然却不知其所以然,再简单体面的框架,工具,都离不开底层技术的支持,所以,带着那颗初心,重新温习一下java基础部分,今天带来的是IO流的解读。
废话不多说,先上图~
这是java io 比较基本的一些处理流,除此之外我们还会提到一些比较深入的基于io的处理类,比如console类,SteamTokenzier,Externalizable接口,Serializable接口等等一些高级用法极其原理。
虽然我们这次的主角是IO流,但是流的本质其实是对文件(File)的处理,因此,我们循序渐进一步一步从文件过渡到流去。
在java中File类是对文件和目录路径名的抽象表示,可以通过其方法改变文件的属性,但是不可以更改文件中的具体内容。下面是java中对File类操作的一些常用方法:
①、创建方法
1.boolean createNewFile() 不存在返回true 存在返回false
2.boolean mkdir() 创建目录,如果上一级目录不存在,则会创建失败
3.boolean mkdirs() 创建多级目录,如果上一级目录不存在也会自动创建
②、删除方法
1.boolean delete() 删除文件或目录,如果表示目录,则目录下必须为空才能删除
2.boolean deleteOnExit() 文件使用完成后删除
③、判断方法
1.boolean canExecute()判断文件是否可执行
2.boolean canRead()判断文件是否可读
3.boolean canWrite() 判断文件是否可写
4.boolean exists() 判断文件或目录是否存在
5.boolean isDirectory() 判断此路径是否为一个目录
6.boolean isFile() 判断是否为一个文件
7.boolean isHidden() 判断是否为隐藏文件
8.boolean isAbsolute()判断是否是绝对路径 文件不存在也能判断
④、获取方法
1.String getName() 获取此路径表示的文件或目录名称
2.String getPath() 将此路径名转换为路径名字符串
3.String getAbsolutePath() 返回此抽象路径名的绝对形式
4.String getParent()//如果没有父目录返回null
5.long lastModified()//获取最后一次修改的时间
6.long length() 返回由此抽象路径名表示的文件的长度。
7.boolean renameTo(File f) 重命名由此抽象路径名表示的文件。
8.File[] liseRoots()//获取机器盘符
9.String[] list() 返回一个字符串数组,命名由此抽象路径名表示的目录中的文件和目录。
10.String[] list(FilenameFilter filter) 返回一个字符串数组,命名由此抽象路径名表示的目录中满足指定过滤器的文件和目录。
对File的操作有了一定了解之后,我们来聊一聊流的分类,根据侧重点不同,有几种不同的分类方式
1. 根据流向分为输入流和输出流:
输入流和输出流是相对于程序而言的。
输出:把程序(内存)中的内容输出到磁盘、光盘等存储设备中;
输入:读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中。
输入输出流结合起来大致是这样的:
2.根据传输数据单位分为字节流和字符流(代码中能体现,不同的流有不同的实现类)
java中提供的字节流有OutputStream(输出流),InPutStream(输入流);字符流有Writer(输出流),Reader(输入流)。这四种也是 Java IO流中的四大基流。这四大基流都是抽象类,其他流都是继承于这四大基流的。 详情可参考本文的第一张图。
3.根据功能分为节点流和包装流(处理流)
节点流:可以从或向一个特定的地方(节点)读写数据。如FileReader.
处理流:是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如BufferedReader.处理流的构造方法总是要带一个其他的流对象做参数。一个流对象经过其他流的多次包装,称为流的链接。
对几种流的概念有了初步认识之后,来聊一聊流的执行流程
首先, 创建源或目标对象 ;输入:把文件中的数据流向到程序中,此时文件是 源,程序是目标,输出:把程序中的数据流向到文件中,此时文件是目标,程序是源;
接下来,创建 IO 流对象,输入:创建输入流对象,输出:创建输出流对象;
第三步, 具体的 IO 操作 ;
最后,关闭资源,输入:输入流的 close() 方法,输出:输出流的 close() 方法
注意:程序中打开的文件 IO 资源不属于内存里的资源,垃圾回收机制无法回收该资源。如果不关闭该资源,那么磁盘的文件将一直被程序引用着,不能删除也不能更改。所以应该手动调用 close() 方法关闭流资源
只知道流的使用流程是远远不够的,如何才能用java提供的相关工具类来灵活的使用IO流呢?下面,我们会是一个漫长的温习之旅,对java中提供的流的相关工具类来做个详解。
1.字节输入输出流
在流的分类中,提到了OutputStream和InputStream两个字节流(接口),这次,分别说说他们对应的一种实现类(FileOutputStream和FileInputStream)。
OutputStream(字节输出流)的一些常用方法:
java中用FileOutputStream类来描述对OutputStream接口的实现:
InputStream(字节输入流)的一些常用方法:
java中用FileInputStream类来描述对InputStream接口的实现:
最后用一个实用的小例子来巩固一下对字节流的使用(文件的复制):
终于攻破了java给我提供的字节流实现类,趁热打铁,接下来在看看字符流的实现类。
2.字符输入输出流
字符输出流:FileWriter的一些常用方法
java中用 FileWriter 类来描述对Writer接口的实现:
字符输入流:FileReader的一些常用方法
java中用 FileReader 类来描述对Reader接口的实现:
最后用一个实用的小例子来巩固一下对字符流的使用(文件的复制):
对于底层的IO字节字符流有了一定的认识后,可以休息一会了!!!。。。。。。。。。。。。。。。。。。。。。
下节要说的是更高级的流,包装流(流的分类中有提到),感谢阅读~