一、File类
1、file类介绍
1.它是文件和目录路径的抽象表示
2.文件和目录是可以通过File封装成对象的
3.对于File而言,其封装的并不是真正存在的文件,仅仅是一个路径名而已,它可以是存在的也可以不存在的,将来是要通过具体的操作把这个路径的内容转换成具体存在的。
2、File类的构造方法
File:通过将给定的路径名字符串转换为抽象路径名来创建新的File实例
1、绝对路径和相对路径
绝对路径: 是一个完整的路径,从盘符开始
相对路径: 是一个简单的路径,相对当前项目下的路径
2、File类创建功能
1、方法类
createNewFile( ): 当该名称的文件不存在时,创建一个新空文件名,有则不创建。
mkdir( ): 创建该路径名命名的目录
mkdirs( ): 创建此路径下命名的所有目录
3、File类删除功能
delete( ): 删除由此抽象路径名表示的文件或目录
4、File类判断和获取功能
1、判断功能
isDirectory(): 测试此抽象路径表示的File是否为目录
isFile(): 测试此抽象路径名表示的File文件是否为文件
exists(): 测试此抽象路径名表示的File是否存在
2、获取功能
getAbsolutePath(): 返回抽象路径名的绝对路径名字符串
getPath(): 将此抽象路径名转换为路径名字符串
getName(): 返回由此抽象路径名表示的文件或目录的名称
listFiles(): 返回此抽象路径名表示的目录中的文件和目录的File对象数组
public class Test {
public static void main(String[] args) throws IOException {
File file = new File("E:\\Java\\SE\\day17\\a.txt");
//createNewFile():当a.txt文件不存在时。创建一个新空文件,有则不创建
boolean b = file.createNewFile();
System.out.println("此file路径下有没有a.txt文件:"+b);
File file1 = new File("E:\\Java\\SE\\day17\\aa");
//创建该路径名的目录
file1.mkdir();
//创建此路径下命名的所有目录
file1.mkdirs();
//删除由此抽象路径名表示的文件或目录
boolean delete = file1.delete();
System.out.println("delete = " + delete);
//判断file路径是否为目录
boolean b1 = file.isDirectory();
System.out.println("b1 = " + b1);
//判断file路径名是否是文件
boolean file2 = file.isFile();
System.out.println("file2 = " + file2);
//判断file路径名是否存在
boolean exists = file.exists();
System.out.println("exists = " + exists);
//返回file路径名的绝对路径
String absolutePath = file.getAbsolutePath();
System.out.println("absolutePath = " + absolutePath);
//返回file路径名转换为路径名字符串
String path = file.getPath();
System.out.println("path = " + path);
//返回file路径名表示的文件或目录
String name = file.getName();
System.out.println("name = " + name);
//file3路径名下的所有文件和目录的名称
File file3 = new File("E:\\Java\\SE\\day17");
for (File files : file3.listFiles()) {
System.out.println(files.getName());
}
}
}
二、字节流
1、io流概述和分类
1、io流介绍:
1、io:输入/输出(input/output)
2、流是一种查询概念,是对数据传输的总称,也就是说数据在设备间的传输称为流,流的本质就是数据传输。
3、io流就是用来处理数据传输问题的常见应用,文件复制,文件上传,文件下载。
2、io流分类:
1、按照数据的流向
1.数据流:读数据 2.输出流:写数据
2、按照数据类型来分
1.字节流(以字节byte为单位,读写数据的流)也叫万能流
1.字节输入流 2.字节输出流
2.字符流(以字符char为单位,读写数据的流)
1.字符输入流 2.字符输出流
3.使用场景
1.如果操作的是纯文本文件,优先使用字符流
2.如果操作的是图片,视频,音频等二进制文件,优先使用字节流
3.如果不确定文件的类型,优先使用字节流,字节流是万能的流
3、字节流抽象基类
1.Inputstream:这个抽象类是表示字节输入流的所有类的超类
2.outputstream: 这个抽象类是表示字节输出流的所有类的超类
3.子类名特点:子类名称都是以其父类作为子类的后缀
4、字节流功能
1.new Fileoutputstream() : 创建文件输出流以指定的名称写入文件
2.new FileInputstream():创建文件输入流以指定的名称读取文件
2.write():将指定的字节写入此文件输出流,一次写一个字节数据
3.read():从输入流读取数据的下一个字节
5、代码演示
public class Test {
public static void main(String[] args) throws IOException {
//读取数据
FileInputStream input = new FileInputStream("D:\\音乐\\TGL-王者荣耀团 - 国士无双 韩信.mp3");
//写人数据
FileOutputStream output = new FileOutputStream("D:\\音乐\\国士无双 韩信.mp3");
//一次读取五个字节
byte[] bytes = new byte[5];
int len;
while ((len=input.read(bytes)) != -1){
//写人数据
output.write(bytes,0,len);
}
}
}
6、字节流写数据的两个小问题
1、字节流写数据如何实现换行
1.windows:\r\n 2.linux:\n 3.mac:\r
2、字节流写数据如何实现追加写入
1.创建文件输入流,以指定的名称写入文件,如果第二个参数为true,则字节将写入文件的末尾而不是开头
FileOutputStream output = new FileOutputStream("D:\\音乐\\国士无双 韩信.mp3",true);
三、字节缓冲流
1、字节缓存介绍
1.Bufferoutputstream:该类实现缓冲输出流,通过设置这样的输出流,应用程序可以向底层输出流写入字节,而不必为写入的每个字节导致底层系统的调用
2.BufferInputstream:将创建一个内部缓冲区数组,当从流中读取或跳过字节时,内部缓冲区将根据需要从所包含的输入流中重新填充一次很多字节
2、构造方法
slush():刷新此输出流并强制任何缓冲的输出字节被写出
Bufferoutputstream:创建字节缓冲输出流对象
BufferInputstream:创建字节缓冲输入流对象
3、代码演示
public class Test3 {
public static void main(String[] args) throws IOException {
//字节流读
BufferedInputStream input = new BufferedInputStream(new FileInputStream("E:\\Java\\SE\\day18\\c.txt"));
//字节流写
BufferedOutputStream output = new BufferedOutputStream(new FileOutputStream("E:\\Java\\SE\\day18\\a.txt"));
byte[] b = new byte[5];
int len;
while ((len=input.read(b))!= -1){
output.write(b,0,len);
}
input.close();
output.close();
}
}
四、字符流
1、为什么会出现字符流?
1.字符流的介绍
1.由于字节流操作中文不是特别的方便,所以Java就提供了字符流
字符流=字节流+编码表
2.中文的字节在存储方式
1.用字节流复制文本文件时,文本文件也会有中文,但是没有问题,原因是最终底层操作会自动进行字节拼接成中文,如何识别是中文的。汉字在存储的时候,无论选择哪种编码存储,第一个字节都是负数。
3.字符串中的编码解码问题
1、相关方法
getBytes() 使用平台的默认字符集将该string编码为一系列字节
public class Test {
public static void main(String[] args) throws IOException {
BufferedOutputStream output = new BufferedOutputStream(new FileOutputStream("E:\\Java\\SE\\day17\\a.txt"));
String s = "女孩你好";
byte[] bytes = s.getBytes("UTF-8");
output.write(bytes);
output.close();
}
}
2、构造方法
FileWriter() 根据给定的file对象构造一个Filewriter对象
FileReader() 在给定从中读取数据的file的情况下创建一个新FileReader
public class Test {
public static void main(String[] args) throws IOException {
FileReader reader = new FileReader("E:\\Java\\SE\\day17\\a.txt");
FileWriter Writer = new FileWriter("E:\\Java\\SE\\day17\\b.txt",true);
int len;
while ((len= reader.read()) != -1){
Writer.write(len);
}
reader.close();
Writer.close();
}
}
五、字符缓冲流
1、字符缓冲流介绍
1.Bufferedwriter:将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入,可以指定缓冲区大小,或者可以接收默认大小,默认值足够大,可以用于大多数用途。
2.BuffereReader:从字符输入流读取文本,缓冲字符,数组和行的高效读取,可以指定缓冲区大小。
2、字符缓冲流特有功能
1、方法介绍
Bufferedwriter:
newLine() 写入行分隔符,行分隔字符串由系统属性定义
BuffereReader:
readLine():读一行文字,结果包含行的内容的字符串,不包含任何终止字符如果已经到达则为null
六、properties集合
1、properties介绍
1.是一个map集合类
2.properties可以保存到流中或从流中加载
3.属性列表中的每个键极其对应的值都是一个字符串
2、properties作为map集合的特有方法
setProperty() 设置集合的键和值,都是string类型,底层调用hashtable方法put.
3、properties和io流相结合的方法
load() 从输入字符读取属性列表(键和元素对)
store() 将此属性列表(键和元素对)写入此properties表中,以适合使用load()方法时格式写入输出字符流
public class Test5 {
public static void main(String[] args) throws IOException {
Properties proper = new Properties();
FileReader reader = new FileReader("E:\\Java\\SE\\day18\\a.txt");
//FileWriter writer = new FileWriter("E:\\Java\\SE\\day18\\b.txt");
proper.load(reader);
System.out.println(proper);
Set<String> strings = proper.stringPropertyNames();
for (String string : strings) {
System.out.println(string);
}
for (String string : strings) {
String value = proper.getProperty(string);
System.out.println("键"+string + "值"+value);
}
reader.close();
//writer.close();
}
}