目录
Java针对文件的操作,分为两类:
- 文件系统的操作(File类):创建文件,删除文件,判定文件是否存在,判定文件类型,文件重命名,等等......
- 文件内容的操作(流对象):读文件/写文件
一、File 类的用法
1、概念
Java 中通过 java.io.File 类来对一个文件(包括目录)进行抽象的描述。主要用于文件和目录的创建、查找和删除等操作。但是要注意,有 File 对象,并不代表真实存在该文件。
2、File 类常用方法
File属性
File构造方法
方法
File构造的方法能够传入一个路径,来指定一个文件,这个路径可以是绝对路径,也可以是相对路径,对象构造好之后, 我们就可以用下面的方法来进行一些具体功能的实现。
1)看文件路径的方法
传入路径为绝对路径,的代码及运行结果:
public static void main(String[] args) throws IOException {
File f = new File("d:/text.txt");
System.out.println(f.getParent());
System.out.println(f.getName());
System.out.println(f.getPath());
System.out.println(f.getAbsolutePath());
System.out.println(f.getCanonicalPath());
}
传入路径为相对路径,的代码及运行结果:
public static void main(String[] args) throws IOException {
File f = new File("./text.txt");
System.out.println(f.getParent());
System.out.println(f.getName());
System.out.println(f.getPath());
System.out.println(f.getAbsolutePath());//把相对路径拼接到基准目录上,就得到了绝对路径
System.out.println(f.getCanonicalPath());//针对绝对路径进行简化后得到的路径
}
2)创建文件,判定文件是否存在,判定文件类型的方法
代码及运行结果:
public static void main(String[] args) throws IOException {
File f2 = new File("d:/text.txt");
System.out.println(f2.exists());
System.out.println(f2.isDirectory());
System.out.println(f2.isFile());
// 创建文件
boolean ret = f2.createNewFile();
System.out.println("ret = " + ret);
System.out.println(f2.exists());
System.out.println(f2.isDirectory());
System.out.println(f2.isFile());
}
D盘中一开始没有 text.txt 文件,所以 false false false 代表,文件不存在,不是目录,不是普通文件;
当 text.txt 文件创建成功,即 ret = true后,true false true 代表,文件存在,不是目录,是普通文件。
3)删除文件的方法
delete(),代码及运行结果:
public static void main(String[] args) throws InterruptedException {
File f3 = new File("d:/text.txt");
boolean ret = f3.delete();
System.out.println("ret = " + ret);
}
,说明文件删除成功。
deleteOnExit(),代码及运行结果:
public static void main(String[] args) throws InterruptedException {
File f3 = new File("d:/text.txt");
f3.deleteOnExit();
Thread.sleep(5000);
System.out.println("进程结束!");
}
,此方法是程序执行完毕,即进程结束后,再删除文件。
此情况,跟 offce 软件在编辑一个文件时,会自动产生一个隐藏文件,在关闭文件时,隐藏文件会自动删除的情况类似。
4)查看目录下所有文件的方法
代码及运行结果:
public static void main(String[] args) {
File f4 = new File("d:/");
String[] files = f4.list();
System.out.println(Arrays.toString(files));
}
代码获取到的结果,和D盘中直接看到的结果是一样的:
,
5)创建目录的方法
mldir(),此方法只能创建单个层次目录,代码及运行结果:
public static void main(String[] args) {
File f5 = new File("d:/java111");
boolean ret = f5.mkdir();
System.out.println("ret = " + ret);
}
程序运行前后对比:
mldirs(),此方法能创建多个层次目录,代码及运行结果:
public static void main(String[] args) {
File f = new File("d:/java111/aaa/bbb/ccc");
boolean ret = f.mkdirs();
System.out.println("ret = " + ret);
}
6)文件重命名的方法
代码及运行结果:
public static void main(String[] args) {
// src 就是 "源",dest 就是 "目标"
File srcFile = new File("d:/text.txt");
File destFile = new File("d:/text2.txt");
boolean ret = srcFile.renameTo(destFile);
System.out.println("ret = " + ret);
}
程序运行前后对比:
二、InputStream,OutputStream的用法
1、概念
在Java标准库中,提供的读写文件的流对象,不是一两个类,而是有很多很多类,实际上这些类都可以归结到两个大的类别中。
- 字节流:以字节为单位,对应着 二进制 文件,有 InputStream 类和 OutputStream 类
- 字符流:以字符为单位,对应着 文本文件,有 Reader 类和 Writer 类
所以 InputStream,OutputStream的用法,其实就是字节流的输入(读)、输出(写)方法。
2、InputStream 类的方法
InputStream方法
InputStream 只是一个抽象类,要使用还需要具体的实现类。我们现在只关心从文件中读取,所以使用 FileInputStream。
FileInputStream构造方法
1)读取文本文件中的内容,并输出二进制数,代码如下:
public static void main(String[] args) {
try(InputStream inputStream = new FileInputStream("d:/text.txt")){
byte[] buffer = new byte[1024];
int n = inputStream.read(buffer);
System.out.println("n = " + n);
for (int i = 0; i < n; i++) {
System.out.printf("%x\n",buffer[i]);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
运行结果: 记事本内容:
(运行结果是记事本内容的ASCII码值)
2)当别人给你提供的是字节流对象,但你知道实际的数据内容是文本数据,还可以使用 Scanner 方法,把上述字节流转成字符流。代码如下:
public static void main(String[] args) {
try (InputStream inputStream = new FileInputStream("d:/text.txt")){
//此时 scanner 就是从文件读取了!!
Scanner scanner = new Scanner(inputStream);
//就可以使用 scanner 读取后续的数据.
String s = scanner.next();
System.out.println(s);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
运行结果: 记事本内容:
3、OutputStream 类的方法
OutputStream 方法
OutputStream 同样只是一个抽象类,要使用还需要具体的实现类。我们现在还是只关心写入文件中,所以使用 FileOutputStream。
FileOutStream构造方法
1)向文本文件中写入内容,代码如下:
public static void main(String[] args) {
try (OutputStream outputStream = new FileOutputStream("d:/text.txt")){
String s = "你好世界";
outputStream.write(s.getBytes());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
程序运行前后对比:
OutputStream 打开一个文件,默认会清空文件的原有内容。写入的数据,就会成为文件中新的数据。
2)如果想向文本文件中写入内容,并保留之前内容,只需在构造方法中,传入第二个参数 true ,代码如下:
public static void main(String[] args) {
try (OutputStream outputStream = new FileOutputStream("d:/text.txt",true)){
String s = "你好世界";
outputStream.write(s.getBytes());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
程序运行前后对比:
3)同上,OutputStream 可以使用 PrintWriter 方法,把上述字节流转成字符流。代码如下:
public static void main(String[] args) {
try (OutputStream outputStream = new FileOutputStream("d:/text.txt")){
// 这就相当于把一个字节流转成字符流了。
PrintWriter writer = new PrintWriter(outputStream);
writer.println("你好世界");
writer.flush();//此处需要手动使用 flash 方法确保数据被写入硬盘
} catch (IOException e) {
e.printStackTrace();
}
}
PrintWriter这样的类,在进行写入的时候,不一定要直接写入硬盘,而是先把数据写入到一个 内存构成的“缓存区” 中。
此处就要手动使用 flash 方法确保数据被写入硬盘。否则就会出现,明明已经写入字符串,但文件里还是空着的。
运行结果: 用了 flash 方法 没有用 flash 方法