IO和文件操作
一:IO
I:Input 输入
O:output 输出
IO:以CPU为基准,靠近CPU是输入操作,远离CPU是输出操作.
也是比较符合常识的.
二:文件
2.1 文件
文件本身是广义的概念.
其实在操作系统中把很多的资源(软件资源/硬件资源)都抽象成文件.
而此处谈到的文件,是指"狭义"的文件,也就是保存在硬盘上的这些文件.
文件夹是否是文件?
文件夹也是一种文件,称为"目录文件"或"目录",也是保存在硬盘上的.
在硬盘上,存在很多文件和目录,目录又存在一定的"嵌套关系",整体的这一套结构,是一个"N叉树".
2.2:路径
文件非常多,目录也非常多,目录之间还能嵌套,就需要在上述体系中,能够有,一种方式,标识某个具体的文件在哪里(通过这个机制就能具体定位到,找到某个文件头上)
路径:从根节点出发,一层一层往下走,最终到达目标文件之后,中间这些目录,集合在一起,就构成了"路径".
以盘符开头的路径,称为"绝对路径",
绝对路径,起点,是"此电脑"
相对路径,起点可以是任意路径
//在相对路径中, **.** 表示当前所在的位置
//**..**表示返回上一级目录
2.3:文件的分类
文件,存储在硬盘上,
分类方式有很多种,在这里主要讨论的是一种和编写代码密切相关的:文本文件 VS 二进制文件
如果该文件在硬盘上存储的是文本数据,那么文件就是文本文件,如果该文件在硬盘上存储的是二进制数据,那么该文件就是二进制文件.
本质上,无论是文本数据,还是二进制数据,本质上都是010101这样的二进制数据,但文本数据中的二进制数据可以通过"GBK/UTF-8"
这样的编码表, 能够查出具体的有意义内容,不会出现乱码的现象.
一个简单粗暴,但是有效的方法,区分二进制文件和文本文件:
以记事本的打开方式,打开看看,如果没乱码,就是文本文件,如果乱码了,就是二进制文件.
记事本能把文件内容,按照文件的方式来理解(如果能理解,查表(GBK/UTF-8)成功了,不能理解就是二进制文件).
像:docx,pptx,mp3,mp4,pdf都属于二进制文件
像:md,html,java,c都属于文本文件.
文本文件是给人看的,二进制文件是给程序看的.
三:使用Java操作文件.
3.1:针对文件系统进行操作
创建文件,删除文件,创建目录,重命名文件…
Java标准库提供了File类表示一个文件,进一步的通过File提供的方法,就可以进行文件系统操作了.File类.
public class Demo1 {
public static void main(String[] args) throws IOException {
File f = new File("d:/test.txt");
/**
* 将File对象关联到test.tex文件了(构造的时候确定)
* 构造File对象的时候,写的路径不一定是真实存在的(都能关联成功)
* 如果该路径下不存在该文件,可以后续调用创建方法创建文件
*/
System.out.println(f.getParent());//返回File对象的父目录文件路径
System.out.println(f.getName());//返回File对象的纯文件名称
System.out.println(f.getPath());//返回File对象的文件路径(和构造File对象的时候一样)
System.out.println(f.getAbsolutePath());//返回File对象的绝对路径
System.out.println(f.getCanonicalPath());//返回File对象修饰过的绝对路径
}
}
public class Demo1 {
public static void main(String[] args) throws IOException {
File f = new File("./test.txt");
/**
* 写成相对路径的时候,基准目录是什么,和运行程序的方式直接相关
* 如果是通过idea,直接点击三角号运行程序,基准目录就是项目所在的目录
*
*/
System.out.println(f.getParent());//返回File对象的父目录文件路径
System.out.println(f.getName());//返回File对象的纯文件名称
System.out.println(f.getPath());//返回File对象的文件路径(和构造File对象的时候一样)
System.out.println(f.getAbsolutePath());//返回File对象的绝对路径
System.out.println(f.getCanonicalPath());//返回File对象修饰过的绝对路径
}
}
3.3.1:创建文件
public class Demo3 {
public static void main(String[] args) throws IOException {
File file=new File("./test.txt");
file.createNewFile();//创建文件
System.out.println(file.exists());//判断文件是否存在
System.out.println(file.isFile());//判断File对象代表的文件是否是一个普通文件
System.out.println(file.isDirectory());//判断File对象代表的文件是否是一个目录
}
}
创建文件/目录的时候,如果路径是相对路径,那么当前idea所在文件夹就是要创建的文件/目录的父目录.
throws IOException :异常信息告诉我们,这里创建文件可能会失败.
创建文件什么时候会失败呢??
(1)给出的路径非法
(2)该路径权限不足.
如果文件已经存在,并不会抛异常.
3.3.2:创建目录
public class Demo4 {
public static void main(String[] args) {
File dir=new File("./testDir1/aaa/bbb/ccc");
//dir.mkdir();//mkdir只能创建一级目录
dir.mkdirs();//mkdirs可以创建多级目录
System.out.println(dir.exists());
System.out.println(dir.isFile());
System.out.println(dir.isDirectory());
}
}
3.3.3:进行文件重命名
import java.io.File;
import java.io.IOException;
public class Demo5 {
public static void main(String[] args) throws IOException {
File f1 = new File("./test3.txt");
f1.createNewFile();
File f2 = new File("test2.txt");//
f1.renameTo(f2);//进行文件改名:./test3.txt 改成 test2.txt
}
}
3.3.3:修改文件路径
public class Demo5 {
public static void main(String[] args) throws IOException, InterruptedException {
File f1 = new File("./test3.txt");
f1.createNewFile();
File dir=new File("./testDir");
dir.mkdir();
File f2=new File("./testDir/test3.text");
f1.renameTo(f2);//修改文件路径,将./test3.txt改成./testDir/test3.text
}
}
3.3.4:f.deleteOnExit();
有些程序,运行过程中会产生"临时文件",就需要在进程结束之后,自动删除掉,这样的情况,就可以使用deleteOnExit()的方式来实现.
比如:编辑word文档的时候,隐藏文件,就会实时记录当前你的编辑内容是什么,假设电脑突然掉电了,即使你没来得及保存,东西还能找回来,
3.2:针对文件内容进行操作
写文件,读文件,打开文件,关闭文件.
操作系统,针对文件操作的时候,引入了流的概念.
Java中通过"流"这样的一组类,进行上述的文件内容操作.
3.3.1:什么是流
举个栗子:
我现在想接100ml的水,可以一次接100ml,也可以接两次,每次接50ml,也可以接10 次,每次接10ml,也可以接100次,每次1ml…
对应到针对文件内容操作:
比如,要读取100字节的文件数据.
可以一次读100个字节,也可以分两次,每次读50字节,还可以分10次,每次读10字节,还可以分100次,每次读1字节…
读文件的方式非常灵活,和接水非常类似,因此就称为"文件流"
流分成两组:
字节流:以字节为单位,读写数据的.
读写二进制文件,使用字节流
InputStream,OutputStream;
字符流:以字符为单位,读写数据的.
读写文本文件,使用字符流.
Reader,writer