当前位置 博文首页 > 最爱吃鱼罐头:万字长文超硬核详细学习系列——深入浅出IO基础流
茫茫人海千千万万,感谢这一秒你看到这里。希望我的文章对你的有所帮助!
愿你在未来的日子,保持热爱,奔赴山海!
Java对数据的操作是通过流的方式,IO流用来处理设备之间的数据传输,上传文件和下载文件,Java用于操作流的对象都在IO包中。 而流是一组有序,有起点和有终点的数据序列,其本质就是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。
作用:为数据源和目的地建立一个输送通道。
IO流操作中大部分都是对文件的操作,所以Java就提供了File类供我们来操作文件。
java.io.File
类是文件和目录路径名的抽象表示。File类是对文件系统中文件以及文件夹进行封装的对象,可以通过对象的思想来操作文件和文件夹,主要可以用于文件和目录的创建、查找和删除等操作。
注意: File表示的是文件和目录信息,而不表示文件的内容。
public File(String pathname) {} //文件的绝对路径
public File(String parent, String child) {}//指定父文件绝对路径、子文件绝对路径
public File(File parent, String child) {}//指定父文件、子文件相对路径
public File(URI uri) {} //文件的URI地址
//下面这两个是File类中私有的构造函数,外面不能调用
private File(String pathname, int prefixLength) {}
private File(String child, File parent) {}public File(String pathname) {}
可以看到,File类的构造函数有6个:4个公共构造函数,2个私有构造函数。
而常用的构造方法有:
public File(String pathname)
:通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。public File(String parent, String child)
:从父路径名字符串和子路径名字符串创建新的 File实例。public File(File parent, String child)
:从父抽象路径名和子路径名字符串创建新的 File实例。看下代码演示:
//public File(String pathname)// 文件路径名
String pathName = "E:\\aaa.txt";
File file = new File(pathName);
//public File(String parent, String child) 通过父路径和子路径字符串
String parent = "E:\\aaa";
String child = "bbb.txt";
File file2 = new File(parent, child);
// public File(File parent, String child) 通过父级File对象和子路径字符串
File parentDir = new File("E:\\aaa");
String child2 = "bbb.txt";
File file3 = new File(parentDir, child2);
注意:不知道大家有没有注意到我写文件路径名是这样的"E:\\aaa"
,可是我们文件路径不是"E:\aaa"
这样吗?
因为在字符串中\是转义字符,如果你只是一个\,会认为你这个是转义字符,所以需要两个。
贴士:
- 一个File对象代表硬盘中实际存在的一个文件或者目录。
- 无论该路径下是否存在文件或者目录,都不影响File对象的创建。
以下的需要文件是基于这个a.txt
:
public String getAbsolutePath()
: 返回此File的绝对路径名字符串。public String getPath()
: 将此File转换为路径名字符串。public String getName()
: 返回由此File表示的文件或目录的名称。public long length()
: 返回由此File表示的文件的长度。public long lastModified()
: 获取最后一次的修改时间,毫秒值代码演示下:
public class FileTest {
public static void main(String[] args) {
File file = new File("E:\\demo\\a.txt");
//public String getAbsolutePath():获取绝对路径
System.out.println("getAbsolutePath:" + file.getAbsolutePath());//getAbsolutePath:E:\demo\a.txt
//public String getPath():获取相对路径
System.out.println("getPath:" + file.getPath());//getPath:E:\demo\a.txt
//public String getName():获取名称
System.out.println("getName:" + file.getName());//getName:a.txt
//public long length():获取长度。字节数
System.out.println("length:" + file.length());//length:20
//public long lastModified():获取最后一次的修改时间,毫秒值
System.out.println("lastModified:" + file.lastModified());//lastModified:1606645407343
//转换下格式毫秒值。
Date time = new Date(file.lastModified());
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String s = sdf.format(time);
System.out.println(s);//2020-11-29 18:23:27
}
}
想必这个应该不用多讲吧,看了就会用吧,直接调用就行了。
public boolean isDirectory()
: 判断是否是目录public boolean isFile()
: 判断是否是文件public boolean exists()
: 判断是否存在public boolean canRead()
: 判断是否可读public boolean canWrite()
: 判断是否可写public boolean isHidden()
:判断是否隐藏像往常一样,继续来一波演示,走起:
public class FileTest2 {
public static void main(String[] args) {
File file = new File("E:\\demo\\a.txt");
//public boolean isDirectory():判断是否是目录
System.out.println("isDirectory: " + file.isDirectory());//isDirectory: false
//public boolean isFile():判断是否是文件
System.out.println("isFile: " + file.isFile());//isFile: true
//public boolean exists():判断是否存在
System.out.println("exists: " + file.exists());//exists: true
//public boolean canRead():判断是否可读
System.out.println("canRead: " + file.canRead());//canRead: true
//public boolean canWrite():判断是否可写
System.out.println("canWrite: " + file.canWrite());//canWrite: true
//public boolean isHidden():判断是否隐藏
System.out.println("isHidden: " + file.isHidden());//isHidden: false
}
}
不多说,看代码!看了就懂了!
public boolean createNewFile()
: 创建文件 如果存在这样的文件,就不创建了public boolean mkdir()
:创建文件夹 如果存在这样的文件夹,就不创建了public boolean mkdirs()
: 创建文件夹,如果父文件夹不存在,会帮你创建出来先看下创建前的文件信息:
然后像往常一样,继续来一波演示,走起:
public class FileTest3 {
public static void main(String[] args) throws IOException {
//public boolean mkdir():创建文件夹 如果存在这样的文件夹,就不创建了
// 在e盘文件夹demo下创建一个文件夹hello
File file = new File("E:\\demo\\hello"); //根据上面的文件信息看到这个hello文件夹是没有的
System.out.println("mkdir: " + file.mkdir());
System.out.println("再来判断下文件夹是否存在: " + file.exists());
//public boolean createNewFile():创建文件 如果存在这样的文件,就不创建了
//在e盘目录demo下的文件夹hello创建一个文件hello.txt
File file2 = new File(file,"\\hello.txt");//在上面已经创建了hello文件夹
System.out.println("createNewFile: " + file2.createNewFile());
System.out.println("再来判断下文件是否存在: " + file2.exists());
//public boolean mkdirs():创建文件夹,如果父文件夹不存在,会帮你创建出来
File file3 = new File("E:\\demo\\world\\world");//能不能两级文件夹直接创建出来呢
System.out.println("mkdirs: " + file3.mkdirs());
System.out.println("再来判断下文件夹是否存在: " + file3.exists());
}
}
第一次执行结果可以看到:
mkdir: true
再来判断下文件夹是否存在: true
createNewFile: true
再来判断下文件是否存在: true
mkdirs: true
再来判断下文件夹是否存在: true
而现在是不是文件或者文件夹都创建出来了,我们再运行一次会怎样呢?
mkdir: false
再来判断下文件夹是否存在: true
createNewFile: false
再来判断下文件是否存在: true
mkdirs: false
再来判断下文件是否存在: true
方法调用上都为false,代表了如果有文件或者有文件夹了就都不再创建了。
提一个小问题,在创建的方法中哪个有可能会抛出异常的呢? 看下代码,觉得那个可能会出错呢
File file4 = new File("E:\\world\\world2");
System.out.println("mkdir: " + file4.mkdir());
File file5 = new File("E:\\world\\world2");
System.out.