File类
分隔符:
a.路径名称分隔符:
windows:
linux: /
b.路径分隔符:一个路径和其他路径之间的分隔符
;
1.概述:文件和目录(文件夹)路径名的抽象表示
2.File的静态成员
static String pathSeparator
:与系统有关的路径分隔符,为了方便,它被表示为一个字符串。
static String separator
:与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。
String path1 = "E:\\Idea\\io";
System.out.println(path1);
System.out.println("==================");
//要求代码写完,一次编写,到处运行
String path2 = "E:"+File.separator+"Idea"+File.separator+"io";
System.out.println(path2);
String pathSeparator = File.pathSeparator;
System.out.println("pathSeparator = " + pathSeparator); // 输出 ;
//static String separator:与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。
String separator = File.separator;
System.out.println("separator = " + separator); // 输出 \
3.File的构造方法
File(String parent, String child)
根据所填写的路径创建File对象
parent:父路径
child:子路径
File(File parent, String child)
根据所填写的路径创建File对象
parent:父路径,是一个File对象
child:子路径
File(String pathname)
根据所填写的路径创建File对象
pathname:直接指定路径
File file1 = new File("E:\\Idea\\io", "1.jpg");
System.out.println("file1 = " + file1);
4.File的获取方法
String getAbsolutePath()
-> 获取File的绝对路径->带盘符的路径
String getPath()
->获取的是封装路径->new File对象的时候写的啥路径,获取的就是啥路径
String getName()
-> 获取的是文件或者文件夹名称
long length()
-> 获取的是文件的长度 -> 文件的字节数
5.File的创建方法
boolean createNewFile()
-> 创建文件
如果要创建的文件之前有,创建失败,返回false
如果要创建的文件之前没有,创建成功,返回true
boolean mkdirs()
-> 创建文件夹(目录)既可以创建多级文件夹,还可以创建单级文件夹
如果要创建的文件夹之前有,创建失败,返回false
如果要创建的文件夹之前没有,创建成功,返回true
6.File类的删除方法
boolean delete()
->删除文件或者文件夹
注意:
1.如果删除文件,不走回收站
2.如果删除文件夹,必须是空文件夹,而且也不走回收站
7.File类的判断方法
boolean isDirectory()
-> 判断是否为文件夹
boolean isFile()
-> 判断是否为文件
boolean exists()
-> 判断文件或者文件夹是否存在
8.File的遍历方法
String[] list()
-> 遍历指定的文件夹,返回的是String数组
File[] listFiles()
-> 遍历指定的文件夹,返回的是File数组 ->这个推荐使用
9.相对路径和绝对路径
细节:listFiles方法底层还是list方法
调用list方法,遍历文件夹,返回一个Stirng数组,遍历数组,将数组中的内容一个一个封装到File对象中,然后再将File对象放到File数组中
1.绝对路径:从盘符开始写的路径
E:\idea\io\1.txt
2.相对路径:不从盘符名开始写的路径
3.针对idea中写相对路径:
a.口诀:哪个路径是参照路径,哪个路径就可以省略不写,剩下的就是在idea中的相对路径写法
在idea中参照路径其实就是当前project的绝对路径
b.比如:在module21下创建了一个1.txt
先找1.txt的绝对路径:E:\Idea\idea2022\workspace\javase\module21\1.txt
再找参照路径:E:\Idea\idea2022\workspace\javase
参照路径可以省略:module21\1.txt
4.总结:
在idea中写的相对路径,其实就是从模块名开始写
5.注意:
如果直接写一个文件名1.txt,它所在的位置默认是在当前project下
字节流
1.IO流介绍以及输入输出以及流向的介绍
1.单词:
Output:输出
Input:输入
write:写数据
read:读数据
2.IO流:
将一个设备上的数据传输到另外一个设备上,称之为IO流技术
3.为啥要学IO流呢?
之前学了一个集合以及数组,可以保存数据,但是这两个都是临时存储(代码运行完毕,集合和数组会从内存中消失,从而数据就不存在了),所以集合和数组达不到永久保存的目的,我们希望咱们的数据永久保存起来,所以我们就可以将数据保存到硬盘上,此时我们就可以随时想拿到硬盘上的数据就随时拿
而且我们将来传输数据,必然要用到输入,输出动作
2.IO流分类
字节流:万能流,一切皆字节
字节输出流: OutputStream 抽象类
字节输入流: InputStream 抽象类
字符流:专门操作文本文档
字符输出流:Writer 抽象类
字符输入流:Reader 抽象类
4.OutputStream中子类[FileOutputStream]的介绍以及方法的简单介绍
1.概述:字节输出流,OutputStream 是一个抽象类
子类: FileOutputStream
2.作用:往硬盘上写数据
3.构造:
FileOutputStream(File file)
FileOutputStream(String name)
4.特点:
a.指定的文件如果没有,输出流会自动创建
b.每执行一次,默认都会创建一个新的文件,覆盖老文件
5.方法:
void write(int b)
一次写一个字节
void write(byte[] b)
一次写一个字节数组
void write(byte[] b, int off, int len)
一次写一个字节数组一部分
b:写的数组
off:从数组的哪个索引开始写
len:写多少个
void close()
-> 关闭资源
1.字节流的续写追加:
FileOutputStream(String name, boolean append) append:true
-> 会实现续写追加,文件不覆盖了
2.换行:
a.windows: \r\n -> 占2个字节 \n
b.linux: \n
c.mac os : \r
FileOutputStream fos = new FileOutputStream("module21\\1.txt",true);
fos.write("床前明月光\r\n".getBytes());
fos.write("疑是地上霜\n".getBytes());
fos.write("举头望明月\n".getBytes());
fos.write("低头思故乡\n".getBytes());
fos.close();
5.InputStream子类[FileInputStream]的介绍以及方法的使用
1.概述:字节输入流 InputStream ,是一个抽象类
子类:FileInputStream
2.作用:读数据,将数据从硬盘上读到内存中来
3.构造:
1 FileInputStream(File file)
2 FileInputStream(String path)
4.方法:
int read()
一次读一个字节,返回的是读取的字节
int read(byte[] b)
一次读取一个字节数组,返回的是读取的字节个数
int read(byte[] b, int off, int len)
一次读取一个字节数组一部分,返回的是读取的字节个数
void close()
关闭资源
6.一次读取一个字节
private static void method01()throws Exception {
FileInputStream fis = new FileInputStream("module21\\1.txt");
//定义一个变量,接收读取到的字节
int len;
while((len = fis.read())!=-1){
System.out.println((char)len);
}
fis.close();
}
问题1:一个流对象,读完之后,就不要再读了;除非重新new一个新的对象
问题2:流关闭之后,流对象不能继续使用了
7.一次读取一个字节数组以及过程
private static void method02()throws Exception {
FileInputStream fis = new FileInputStream("module21\\1.txt");
/*
创建一个数组:byte[]
1.创建的数组相当于一个临时存储区域,我们要读取的内容会临时保存到数组中
然后我们再从数组中将数据获取
2.数组长度定为多少,每次读取多少个,一般情况下数组长度定为1024或者1024的倍数
如果剩下的字节不够数组长度了,那么就最后有多少读多少
*/
byte[] bytes = new byte[2];
int len;
while((len = fis.read(bytes))!=-1){
//System.out.println(new String(bytes,0,len));
System.out.println(new String(bytes));
}
fis.close();
}
字符流
1.字节流读取中文的问题
1.注意:
字节流是万能流,更侧重于文件复制,但是尽量不要边读边看
2.原因:
UTF-8:一个汉字占3个字节
GBK:一个中文占2个字节
如果按照字节读取,每次读取的字节没有构成一个汉字的字节数,就直接输出,汉字是显示不了的
3.解决:
将文本文档中的内容,按照字符去操作
2.FileReader的介绍以及使用
**1.概述:**字符输入流 -> Reader -> 是一个抽象类
子类:FileReader
**2.作用:**将文本文档中的内容读取到内存中来
3.构造:
1 FileReader(File file)
2 FileReader(String path)
4.方法:
int read()
-> 一次读取一个字符,返回的是读取字符对应的int值
int read(char[] cbuf)
-> 一次读取一个字符数组,返回的是读取个数
int read(char[] cbuf, int off, int len)
-> 一次读取一个字符数组一部分,返回的是读取个数
cbuf:读取的数组
off:从数组的哪个索引开始读
len:读多少个
void close()
-> 关闭资源
private static void method02()throws Exception {
FileReader fr = new FileReader("module21\\1.txt");
char[] chars = new char[2];
int len;
while((len = fr.read(chars))!=-1){
System.out.println(new String(chars,0,len));
}
fr.close();
}
3.FileWriter的介绍以及使用
1.概述:字符输出流 -> Writer -> 抽象类
子类:FileWriter
**2.作用:**将数据写到文件中
3.构造:
1 FileWriter(File file)
2 FileWriter(String fileName)
3 FileWriter(String fileName, boolean append)
-> 追加,续写
4.方法:
void write(int c)
-> 一次写一个字符
void write(char[] cbuf)
一次写一个字符数组
void write(char[] cbuf, int off, int len)
一次写一个字符数组一部分
void write(String str)
直接写一个字符串
void flush()
:将缓冲区中的数据刷到文件中
void close()
关流
public class Demo01FileWriter {
public static void main(String[] args)throws Exception {
FileWriter fw = new FileWriter("module21\\2.txt");
fw.write("千山鸟飞绝\r\n");
fw.write("万径人踪灭\r\n");
fw.write("孤舟蓑笠翁\r\n");
fw.write("独钓寒江雪\r\n");
//fw.flush();
fw.close();
}
}
5.注意:FileWriterr底层自带一个缓冲区,我们写的数据会先保存到缓冲区中,所以我们需要将缓冲区中的数据刷到文件中
flush():将缓冲区中的数据刷到文件中,后续流对象还能继续使用
close():先刷新后关闭,后续流对象不能使用了
5.JDK7之后io异常处理方式
1.格式:
try(IO对象){
可能出现异常的代码
}catch(异常类型 对象名){
处理异常
}
2.注意:
以上格式处理IO异常,会自动关流
public class Demo02Exception {
public static void main(String[] args) {
try(FileWriter fw = new FileWriter("module21\\4.txt");){
fw.write("你好");
}catch (Exception e){
e.printStackTrace();
}
}
}
=========================================================================
笔记来源尚硅谷