Java学习第十九天知识点(IO流)
File: 文件类
1.File的创建 - 构造方法
1) 参数传入文件路径
new File("")
2) 参数传入父路径 和 子路径
new File(“a”,“a.txt”)
注意:new 出来的File对象只是存在于JVM内存中的一个对象,和本地磁盘有没有这个文件,没有任何关系!!
2.路径:
1).绝对路径
window:从盘符出发 C:\xx\xx(斜杠的话\\或者/或者//都可以)
Linux: 从根目录开始(Users) /
例如: D:\Idea-workspace\api_2107\api_day10\a.txt
2).相对路径: 不固定的,会有一个参照对象
例如: D:\Idea-workspace\api_2107\api_day10\a.txt
相对路径: a.txt
参照路径(参考值): D:\Idea-workspace\api_2107\api_day10
我们会把参考值称之为 - 当前目录
[.]: 表示当前目录
[..]: 表示上一级目录, 现在的参考值的上一层
3.使用绝对路径的优势
优势: 位置永远不会出错(针对个人电脑)
缺点: 如果存放在别人电脑上的,绝对路径有可能会出错
所以通常来说哦,我们可以通过相对路径来获取到绝对路径,来保证稳定性。
4.通过相对路径获取到的绝对路径
1).getResource() - 【基于包下】
xx.class.getResource("相对路径").getPath()
xx.class -> 获取类的字节码文件对象
String path= FileAPIDemo.class.getResource("IOliu/a.txt").getPath();//getFile也可以
2).getClassLorder() - 【基于src】
xx.class.getClassLorder().getResource("相对路径").getPath()
String path= FileAPIDemo.class.getClassLoader().getResource("a.txt").getPath();//getFile也可以
3)两个方法的区别:
得到的参考值不一样
4)理解:
①.类路径(classPath): src编译后的目录,也叫做编译根目录
②.以上两种方式得到的绝对路径,都是在编译后的根目录中,和src没有直接关系
③.在以后的开发中,我们一般是将文件存储在src下,因为src中的内容会自动编译到类路径中
5.常用API:
File getAbsoluteFile() - 获取绝对路径
boolean exists() - 判断该文件是否存在
boolean isDirectory() - 判断是否是目录
boolean isFile() - 判断是否是文件
boolean createNewFile() - 创建文件
boolean mkdir() - 创建单层目录
boolean mkdirs() -创建多层目录
String getName() - 获取文件的名字
String getPath() - 获取文件路径名
boolean renameTo(File dest) - 从一个文件移动到另一个文件
String[] list() -列出file所有文件的名字
File[] listFiles() -列出file所有文件的对象
boolean delete()
File[] listFiles(FileFilter filter)
String getParentFile()
对于API的相关测试:
/*
1.创建两个文件对象,分别使用相对路径和绝对路径创建。
2.检查D盘下是否存在文件a.txt,如果不存在则创建该文件。
3.在D盘下创建一个名为bbb的文件夹。
4.在D盘下创建一个名为ccc的文件夹,要求如下:
1.ccc文件夹中要求包含bbb子文件夹
2.bbb子文件夹要求包含aaa文件夹
5.获取D盘aaa文件夹中b.txt文件的文件名,文件大小,
文件的绝对路径和父路径等信息,并将信息输出在控制台。
6.1.判断File对象是否是文件,是文件则输出:xxx是一个文件,否则输出:xxx不是一个文件。
6.2.判断File对象是否是文件夹,是文件夹则输出:xxx是一个文件夹,否则输出:xxx不是一个文件夹。(xxx是文件名或文件夹名)
7.删除文件 例如: a.txt
8.删除目录[空目录] 例如: dir
9.删除目录[非空目录] 例如: test/a/a.txt*/
public class ques01 {
public static void main(String[] args) throws IOException {
File file = new File("a.txt");
File file1 = new File("E:\\Java\\MyJavaProject\\MyProject\\week5\\day04\\b.txt");
// \\或者/或者//都可以
File file2 = new File("D:\\a.txt");
boolean newFile2=file2.createNewFile();
System.out.println(newFile2);
File file3 = new File("D:/b");
file3.mkdir();
File file4 = new File("D:\\ccc\\bbb\\aaa");
file4.mkdirs();
File file5 = new File("D:\\ccc\\bbb\\aaa\\b.txt");
System.out.println(file5.getName());
System.out.println(file5.length());
System.out.println(file5.getAbsoluteFile());
if (file.isFile()){
System.out.println(file.getName()+"是一个文件");
}else if (!file.isFile()){
System.out.println(file.getName()+"不是一个文件");
}
if (file.isDirectory()){
System.out.println(file.getName()+"是一个文件夹");
}else if (!file.isDirectory()){
System.out.println(file.getName()+"不是一个文件夹");
}
//boolean test=file2.delete();
System.out.println(file2.delete());
File file6 = new File("aaa");
boolean test=file6.mkdir();
System.out.println(test);
file6.delete();
File file7 = new File("ccc/bbb/aaa");
boolean test1=file7.mkdirs();
System.out.println(test);
// deleteFile(file7);
File file8 = new File("ccc");
deleteDG(file8);
}
public static File deleteFile(File file){
if (file.getParentFile()!=null){
file.delete();
return deleteFile(file.getParentFile());
}
file.delete();
return null;
}
public static File delete(File file){
File[] files = file.listFiles();
for (File f:files) {
if (f.isDirectory()){
}
else if (f.isFile()){
f.delete();
}
}
return null;
}
public static void deleteDG(File file){
File[] files = file.listFiles();
if (files!=null){
//文件夹为空返回0 文件没有内容可能为null,所以要不等于null
for (File f:files) {
deleteDG(f);
}
}
file.delete();
}
}
IO流:
I -> Input 输入流(读文件)
数据从文件中流向内存
O -> Output 输出流(写文件)
数据从内存中流向文件
流:流向,把数据从一个地方带到另一个地方
字节输入流InputStream
字节输出流OutputStream
public class StreamDemo01 {
@Test
public void test01() throws IOException {
/*
FileOutputStream:
如果文件不存在,则会自动创建新的文件
如果文件存在,则不会在创建
*/
FileOutputStream fos = new FileOutputStream(new File("b.txt"));
//向文件中写内容
//对应的就是 - ASCII码表
fos.write(0);// 0 = 空字符串
fos.write(48);// ASCII码表中的字符0
fos.write(65);
fos.write(97);
// 32位
//-1原码: 10000000 00000000 00000000 00000001
//-1反码: 11111111 11111111 11111111 11111110
//-1补码: 11111111 11111111 11111111 11111111
// 写入 1个字节 = 8位
// 写入低8位(所谓低8位就是最后面的8位) -> 11111111
fos.write(-1);
fos.write(256); //低8位 00000000
//需要注意的是无法输入中文字符,但是可以打开文件直接输入中文(并以此获得字节码)
}
@Test
public void test02() throws IOException {
//FileNotFoundException -> 文件找不到异常
//如果写文件时找不到,会创建一个空的文件出来,如果读取找不到就会抛出异常
FileInputStream fis =
new FileInputStream(new File("b.txt"));
int read = fis.read();
System.out.println(read);
int read1 = fis.read();
System.out.println(read1);
int read2= fis.read();
System.out.println(read2);
int read3= fis.read();
System.out.println(read3);//读完 97
//读: 将写进的8位存放在 32位中,放入低8位,剩下24位全补0所以会为正
int read4= fis.read();
System.out.println(read4);//255
int read5= fis.read();
System.out.println(read5);//0
// 读完返回-1
int read6= fis.read();
System.out.println(read6);//-1
}
}