Java中通过 java.io.File 类来对⼀个⽂件(包括⽬录)进⾏抽象的描述。注意,有File对象, 并不代表真实存在该⽂件。
1.File类
1.1属性
1.2构造方法
一个File对象就表示一个硬盘上的文件,
在构造方法时就需要将这个文件路径写进去
主要选择第二种
1.3方法
1.3.1返回文件信息
报错一般是程序怕传入的文件不存在
声明一下异常就行了
1.3.2对文件的判断和创建
import java.io.File;
import java.io.IOException;
public class Test {
public static void main(String[] args) throws IOException {
File file=new File("d:\\test.txt");
//这个文件是不存在的
//1.boolean exists()判断File对象描述的⽂件是否真实存在
System.out.println(file.exists());
//2.boolean isDirectory()判断File对象代表的⽂件是否是⼀个目录(是否是个文件夹)
System.out.println(file.isDirectory());
File file1=new File("d:");
System.out.println(file1.isDirectory());
//3.boolean isFile()判断File对象代表的⽂件是否是⼀个普通文件
System.out.println(file.isFile());
//4.boolean createNewFile()根据File对象,⾃动创建⼀个空⽂件,成功创建后返回true
System.out.println(file.createNewFile());
//1.boolean exists()判断File对象描述的⽂件是否真实存在
System.out.println(file.exists());
//2.boolean isDirectory()判断File对象代表的⽂件是否是⼀个目录(是否是个文件夹)
System.out.println(file.isDirectory());
//3.boolean isFile()判断File对象代表的⽂件是否是⼀个普通文件
System.out.println(file.isFile());
//5. boolean delete()根据File对象,删除该⽂件。成功删除后返回true
System.out.println(file.delete());
}
}
创建新文件,一开始是没有的
运行以后
删除文件运行以后
1.3.3对文件的删除
1.3.4对目录信息的获取
1.3.4对目录的创建
1.创建单个文件夹
2.创建多层文件夹
1.3.5对文件进行改名
程序执行之前
程序执行之后
注意不同类型之间的文件也能进行修改,也会将文件的类型进行改变
1.3.6对文件访问的权限
2.文件内容的读写--数据流
2.1字符流
2.1.1Reader
Reader是一个抽象类,不能new实例,只能new子类
read主要有三个方法
注意文件操作完记得对文件进行close
有可能前面的程序发生异常,后面的close就会执行不到,所以可以这样写
也可以这样
try with resources
这个语法目的就是
()中定义的变量
会在代码快结束时,自动地调用close方法(无论是正常进行还是抛出了异常)
2.1.1.1无参read
无参read(),一次就读取一个字符
结果
2.1.1.2char【】参数的read
系统会尽量读满这个数组,如果文件中的数据超出了数组的大小,就会重复的的填满这个数组。
三个参数的read,一次的去若干个字符,会把参数执行的cbuf数组中,中的从off这个位置开始,到len这个长度的范围,尽量填满
2.1.2FileWriter
创建OutputStream 对象完成后,就可以使用下面的方法来写入流或者进行其他的流操作。
构造方法
FileWriter(File file)
FileWriter(File file, boolean append)
参数:
- file:要写入数据的 File 对象。
- append:如果 append 参数为 true,则将字节写入文件末尾处,相当于追加信息。如果 append 参数为 false, 则写入文件开始处。
2.2字节流
2.2.1InputStream 概述
2.2.1.1FileInputStream 概述
该流用于从文件读取数据,它的对象可以用关键字 new 来创建。
有多种构造方法可用来创建对象。
可以使用字符串类型的文件名来创建一个输入流对象来读取文件:
可以使用字符串类型的文件名来创建一个输入流对象来读取文件:
也可以使用一个文件对象来创建一个输入流对象来读取文件。我们首先得使用 File() 方法来创建一个文件对象:
InputStream f = new FileInputStream("C:/java/hello");
File f = new File("C:/java/hello");
InputStream in = new FileInputStream(f);
下面这些就是返回的是ascii码值
2.2.2OutputStream概述
2.2.2.1FileOutoutStream概述
该类用来创建一个文件并向文件中写数据。
如果该流在打开文件进行输出前,目标文件不存在,那么该流会创建该文件。
有两个构造方法可以用来创建 FileOutputStream 对象。
1.使用字符串类型的文件名来创建一个输出流对象:
OutputStream f = new FileOutputStream("C:/java/hello")
2.也可以使用一个文件对象来创建一个输出流来写文件。我们首先得使用File()方法来创建一个文件对象:
File f = new File("C:/java/hello");
OutputStream fOut = new FileOutputStream(f);’
2.3缓冲流
2.3.1字节缓冲流
BufferedInputStream、BufferedOutputStream(缓冲字节流)
public class IOTest {
public static void write(File file) throws IOException {
// 缓冲字节流,提高了效率
BufferedOutputStream bis = new BufferedOutputStream(new FileOutputStream(file, true));
// 要写入的字符串
String string = "综上所述,轮廓系数是一种有效的评估K-means聚类效果的度量指标。通过计算每个样本点的轮廓系数并取平均值,可以直观地了解聚类效果的好坏,并为优化聚类算法提供指导。";
// 写入文件
bis.write(string.getBytes());
// 关闭流
bis.close();
}
public static String read(File file) throws IOException {
BufferedInputStream fis = new BufferedInputStream(new FileInputStream(file));
// 一次性取多少个字节
byte[] bytes = new byte[1024];
// 用来接收读取的字节数组
StringBuilder sb = new StringBuilder();
// 读取到的字节数组长度,为-1时表示没有数据
int length = 0;
// 循环取数据
while ((length = fis.read(bytes)) != -1) {
// 将读取的内容转换成字符串
sb.append(new String(bytes, 0, length));
}
// 关闭流
fis.close();
return sb.toString();
}
}
2.3.2字符缓冲流
BufferedReader、BufferedWriter(字符缓冲流)
public class IOTest {
public static void write(File file) throws IOException {
// BufferedWriter fw = new BufferedWriter(new OutputStreamWriter(new
// FileOutputStream(file, true), "UTF-8"));
// FileWriter可以大幅度简化代码
BufferedWriter bw = new BufferedWriter(new FileWriter(file, true));
// 要写入的字符串
String string = "Java 在 UNIX 和 Windows 自动按约定分辨文件路径分隔符。如果你在 Windows 版本的 Java 中使用分隔符 (/) ,路径依然能够被正确解析。";
bw.write(string);
bw.close();
}
public static String read(File file) throws IOException {
BufferedReader br = new BufferedReader(new FileReader(file));
// 用来接收读取的字节数组
StringBuilder sb = new StringBuilder();
// 按行读数据
String line;
// 循环取数据
while ((line = br.readLine()) != null) {
// 将读取的内容转换成字符串
sb.append(line);
}
// 关闭流
br.close();
return sb.toString();
}
}