IO流:主要解决数据的输入输出问题
我们之前存储数据都是在内存层面做的存储,JVM关掉以后,或者电脑关了以后,数据就都没有了
如果我们把内存中的数据存到硬盘上(实体化):比如把数据写到.txt文件里
把内存中的数据实体化:输出,比如把数据写到.txt文件里
把实体化层面的数据再读到内存当中:比如把.txt文件中的数据读到内存中,接着就可以在程序中操作了,这叫输入
针对操作的数据的特点不一样,使用不同的流
文件用File类的对象充当(File类的对象还可以表示文件目录,即文件夹)
File类的使用
- File类的一个对象,代表一个文件或者一个文件目录(俗称文件夹)
- File类声明在java.io包下
- 相对路径:相较于某个路径下指明的路径
- 绝对路径:包含盘符在内的文件或者文件目录的路径
- 路径分隔符:Windows中为\,Unix中为/
常用方法:
package test0;
import java.io.File;
import java.util.Date;
public class Test{
public void test1(){
//第一种方法 new File(String filepath);
//hello.txt,这种叫相对路径
File file1=new File("hello.txt");//直接在形参位置指明文件或者文件目录的路径,相对路径是相对于当前module的路径
//注意,右键点击module,再点击show in explore,可以得到module所在的位置,记得还要进入到test0里面
//绝对路径的写法
File file2=new File("C:\\Users\\11930\\IdeaProjects\\project01\\src\\test0\\he.txt");//因为在Java中\有转义的意思,防止歧义,变成\\
//此时还不需要对应硬盘中的文件,仅仅是内存层面的对象。所以下面的操作不会报错,不会抛异常
System.out.println(file1);//结果为:hello.txt
System.out.println(file2);//结果为C:\Users\11930\IdeaProjects\project01\src\test0\he.txt
//第二种方式:通过指明上一层目录 new File(String parentPath,String childPath);
File file3=new File("C:\\Users\\11930\\IdeaProjects","project01");//此时想创建或指定的是project01这个目录
System.out.println(file3);//结果为C:\Users\11930\IdeaProjects\project01
//第三种方式 new File(File parent,String child),参数1对应的一定是文件目录,是在参数1下面指定文件或文件目录
File file4=new File(file3,"hi.txt");
//这些东西都只是内存层面的对象而已,没说在硬盘上真实存在
}
public static void main(String[] args){
Test t=new Test();
//t.test1();
t.test();
}
//测试常用方法
public void test(){
File file1=new File("h1.txt");//如果没有module,相对路径就是针对当前的project而言的
File file2=new File("C:\\Users\\11930\\IdeaProjects\\project01\\src\\test0\\he.txt");
System.out.println(file2.getName());//he.txt
System.out.println(file1.getName());//h1.txt
System.out.println(file1.length());//0,因为此时文件根本不存在
System.out.println(file1.getAbsolutePath());//C:\Users\11930\IdeaProjects\project01\h1.txt
System.out.println(file1.getPath());//h1.txt
System.out.println(file1.getParent());//null,这里写的是相对路径,返回null
System.out.println(file2.getParent());//C:\Users\11930\IdeaProjects\project01\src\test0,虽然此时文件不存在
System.out.println(file1.lastModified());//0,因为此时文件根本不存在
/*
一定要选中project或者module的图标去new File
如果我们新建了一个文件,在里面写了hello,那么.length的结果为5,lastModified得到的为毫秒数,可以通过Date来看具体的时间
*/
File file3=new File("hello.txt");
System.out.println(file3.length());//5
System.out.println(new Date(file3.lastModified()));//Sat Aug 03 13:25:14 CST 2019
//如下两个方法适用于文件目录,且该目录要存在
// public String[] list() :获取指定目录下的所有文件或者文件目录的名称数组
// public File[] listFiles() :获取指定目录下的所有文件或者文件目录的File数组
File file4=new File("C:\\Users\\11930\\IdeaProjects\\project01");
String[] list=file4.list();//如果file4的文件目录不存在,那么执行这个操作会抛异常
for(String s:list){
System.out.println(s);
}
File[] files=file4.listFiles();
for(File s:files){
System.out.println(s);//会调用toString方法输出路径,以绝对路径的方式输出
}
//public boolean renameTo(File dest): file1.renameTo(file2);
//要想成功,需要file1在硬盘中存在,且file2不能存在
File file5=new File("hello.txt");
File file6=new File("F:\\io\\hi.txt");
boolean rename=file5.renameTo(file6);//如果操作成功,file5的那个文件就移动到file6的地方叫file6的名字,原来的地方就没有了(硬盘上也不存在了)
System.out.println(rename);
//如果想放回去呢?
file6.renameTo(file5);
}
}
File类的判断功能(这些方法既可以对文件用,也可以对文件目录用)
- public boolean isDirectory():判断是否是文件目录
- public boolean isFile() :判断是否是文件
- public boolean exists() :判断当前对象是否在硬盘中存在
- public boolean canRead() :判断是否可读
- public boolean canWrite() :判断是否可写
- public boolean isHidden() :判断是否隐藏
注意:
正常情况下文件存在或者文件目录存在就可读可写
如果文件或者文件目录不存在,那么上面的结果都是false
File类的创建功能
当有了File类的对象后,发现硬盘当中没有对应的文件或文件目录,可以用相应的方法把它在硬盘中造出来
- public boolean createNewFile() :创建文件。若文件存在,则不创建,返回false
- public boolean mkdir() :创建文件目录。如果此文件目录存在,就不创建了,返回false。 如果此文件目录的上层目录不存在,也不创建,返回false。
- public boolean mkdirs() :创建文件目录。如果上层文件目录不存在,一并创建,如果已经存在,返回false
注意: 如果创建文件或者文件目录没有写盘符路径,那么,默认在项目路径下。
不加后缀名表示创建的是文件目录,而不是文件。如果在内存中有,硬盘中没有,很多属性都是默认值
删除硬盘中的文件或者文件目录
package test0;
import java.io.File;
import java.io.IOException;
public class Test{
public static void main(String[] args) throws IOException {
//文件的创建与删除
File f=new File("h1.txt");
if(!f.exists()){
f.createNewFile();
System.out.println("创建成功");
}else{
//文件存在的情况下
f.delete();
System.out.println("删除成功");
}
System.out.println("----------------------------");
//文件目录的创建与删除
File f1=new File("F:\\io\\io1\\io2");
boolean mkdirs=f1.mkdirs();
if(mkdirs){
System.out.println("创建成功");
}else{
f1.delete();
System.out.println("删除成功");
}
}
}
注意: File类中涉及到关于文件或文件目录的创建,删除,重命名,修改时间,大小等方法,并未涉及到写入或者读取文件内容的操作,这些读写操作要使用IO流完成
File对象常会作为参数传递给流的构造器中,指明读取或写入的终点。
如果是要去读写内容,File对象主要指的是文件