1.什么是IO流
(1)input输入
Output输出
这两个的首字母就是IO的组成
(2)比如你的电脑可以通过网络上传文件和下载文件
这个上传文件就是Output
这个下载翁建就是input
(3)这个输入和输出的标准是以CPU为参照物为基准的
其中通过控制台来将数据传入到CPU中也是Input输入的过程。
图解
2.什么是文件
(1)在我们的电脑上面定义的文件是一个抽像的概念。
在我们的电脑上面有两种资源我们将硬件资源和软件资源统称为文件
(2)在我们的接下来的讲解中,我们讲解的文件指的是硬件资源
(3)其中我们要注意的就是我们电脑上面的资源管理器其实也是一格资源,它的名字是目录资源,他是将电脑硬件上面的资源来进行记录的。目录资源其实是一格树状的结构、
3.路径
3.1相对路径
相对路径是的起点可以是任意的路径,可以是以现在工作的路径往下面进行遍历的路径
3.2绝对路径
相对路径就是以此电脑为出发点来进行二叉树的遍历的路径
3.3路径的表示
所以在日常的开发中我建议大家使用/
如果想用\的话可以用转义字符来进行转义
3.4用路径找到文件
4.文本文件和二进制文件
(1)文本文件存储的数据要求必须是合法的字符
(2)二进制文件存储的数据可以是任意数据
(3)判断一个文件是二进制文件还是不是二进制文件可以用文档来打开,然后这个文档如果显示的是乱码的话那么这个就是一格二进制文件如果反之就是文本文件。
(4)下图总的就是一格二进制的文本文件
5.针对文件进行操作
(1)在大部分的文件操作有很多种简称(CRUD)
(2)也就是对文件进行
文件的创建,删除文件,创建目录,重命名文件
(4)在java中提供了File包来对文件进行操作(java.io)包中存着所有的java关于输入和输出的操作。
(5)
5.1用file类实现对文件目录的操作
以下这些操作就是日常中比较常用的file对文件进行的操作
(1)上面的这些操作其实都是调用了系统本身的api,这个是由c++编写的JVM来进行调用的,注意不同的操作系统的api的差距是非常大的。
(2)但是要知道的一件事就是JVM也有linux 等等的版本,所以jvm是非常nb的。
(3)****其中要注意的就是基准目录是什么,基准目录可以理解为你当前这个文件工作的目录就是基准目录**************
图示
(3)其中在多线程的情况下我们可以搭配try ctatch和throw IOException来抛出这个线程的异常
5.2针对临时文件的删除
在我们运行一些文件的时候可能会产生临时的文件,例如我们的word在新建的时候会有两个文档分别是一个临时的,还有一个是主要的文件,临时文件是为了能够记录你电脑在极端情况下断电啥的,然后可以找回
通过这个就可以删除临时文件。
通过这个就可以更好的删除这些文件。
5.3总结加扩展
文件有几种操作分别是
读文件,写文件,打开文件关闭文件
上面的这些操作其实就是stream这个操作
举例
6.针对文件的操作可以将文件分为(字符流)(文件流)
6.1字符流(二进制文件)
(1)inputStream
(2)OutputStream
6.2文件流(文本文件)
(1)read
(2)writer
6.3总结
(1)在后面的学习中我们会使用构造方法打开文件读写文件
(2)通过read和write来读写文件,然后用close来关闭文件
(3)字节!=字符往往多个字节对应多个字符
在java中我们用这个就能够来对字符来进行转换从文字变到字符流
7.简单总结
(1)要注意的就是字节流以及字符流中的这些input Stream这些方法由于是构造方法所以是不能实例化的。
8.标注库中对于File使用
(1)我们创建一格File类如果能够读取这个文件的话那么就可以对这个文件进行操作CRUD
8.1读取操作
读取的操作有三种
8.1.1无参数类型read()
(1)第一种是无参数进行文件的读取,然后这个是一个字节一个字节进行读取,读取到的内容后面会进行返回。
(2)注意返回值应该是byte类型,因为byte的最大的返回值其实就是1字节,但是要注意的就是最后返回的其实是int类型
(3)其实最后的返回值是int类型,因为byte是只能表示正数,然后读取不到-1,但是int可以读取到,然后-1再字符集中表示的是结束的意思
8.1.带一个参数的版本read(byte)
(1)这个是写一个byte类型的数组然后我们会将数据存入到byte类型的数组中,
(2)这个读取多少取决于这个数组的长度是多少,read方法尽可能多的填满这个byte类型的数组
(3)最后返回值为int类型表示实际读取了多少的字节
代码示例
8.3对比
这两个方法对CPU资源的开销是一样的类似于你攒起来扔垃圾和用一次扔一样
(4)其中我们要注意的就是在实际的开发中我们还有可能用数组来存储读到的不同数据
8.2一些扩展知识
(1)我们平时见到的英文字母其实都是ascii表写出来的。(计算机中的字母和ascii一一对应)
(2)我们平时的图片是由字符串表示出来的。
(3)我们在操作文件的时候在不需要这个文件的时候需要关闭这个文件,也许在平时的过程中我们感知不到这个操作的重要性,但是在工作的过程中服务器是24小时运行的这时候字符表就会被占满,这时候就会发生内存的泄漏
(4)文件描述表,这个表可以进行配置其中每个系统的长度是不一样的。
(5)
9.运用inputSTream来实现文件流的读取
10.OutputStream的使用
10.1基础用法(三种)
(1)
其中注意的是在写的方法中如果我们没有选择追加写的方式来打开那么就会将整个文件给清除,所以我们在写的时候要注意这一点
(2)
11知识的扩展
11.1读read
(1)java中的char其实是2个字节但是我们的汉字是3个字节(UTF-8) ,但是在java中我们是使用UTF-8来进行编码的,在这个转码过程中会把3个字节的汉字转成unicade(2个字节)这时候就是两个字节的
(2)在java中内置了UTF-8编码以及ubicade这两种编码
(3)其中在java中的STring类是六个字节他是用byte来存储字符串的
(4)char是用unicade来进行编码的
11.2扩展注意事项
(1)在使用输入流的时候可以使用scanner来进行扫描辅助,但是在做题的时候我是不建议大家使用这个的
(2)在写算法的代码题的时候是有一套复杂的io(目的是筛选人才)
11.3示例1(查询文件)
(1)扫描指定的目录然后删除这个文件中的内容,然后询问用户是否要进行删除
(2)先给定一个目录和查询词然后在写程序的时候看哪个查询词,把匹配的结果给查询到
(3)在File中有一个类是listFile这个可以把这个文件中包含哪些目录给列举出来
(4)这个查找这个是一个递归的过程
11.3示例2(复制文件)
(1)输入一个路径表示这个是要复制这个文件的路径
(2)再输入一个路径表示的是这个复制了的文件以后要去的文件的路径
(3)判断输入的路径是否是合法的。
(4)判断要复制文件的父目录是否存在
在这里有两个判断方法
get Parent File(File)这个返回的是File
getParent(String)这个是返回的父目录的路径
在这里我们推荐使用File类中提供的方法
(5)如果这个父目录是不存在的那么我们就需要创建一个
(6)其中在创建文件的时候都要判断这个路径是否是合法的。(永远都不要相信用户)
11.4示例3(前两种示例的结合)
(1)将整个文件给读出来然后进行查找
(2)isDirectory()
方法只会检查路径所指向的对象是否是一个目录,而不会检查目录是否存在或其他操作系统权限等问题。如果路径指向的对象不存在,则该方法也会返回 false
。