目录
前言
在上一篇文章介绍了文件的基本概念,这篇文章将介绍如何使用Java对文件进行操作。
1. 概述
文件操作可以分为两个大类。
文件系统操作:创建文件,删除文件,移动文件,获取文件属性……。
文件内容操作:读文件,写文件。
Java中通过java.io.File来对一个文件进行抽象的描述。
File类:
构造一个文件抽象实例:
public static void main(String[] args) {
File file = new File("D:/test/test.txt");
}
如果使用相对路径来创建,基准路径默认为当前代码文件所在的文件夹。
2. File类的使用
File类有许多方法,但是都很好理解,下面给出部分官方文档:
这些大部分都十分好理解,不再一一列举,官方文档网址:
File文档
挑选部分方法在Java代码进行演示:
2.1 获取路径
public static void main(String[] args) throws IOException {
File file = new File("./test.txt");
System.out.println(file.getParent()); // 获取父目录
System.out.println(file.getName()); // 获取文件名
System.out.println(file.getPath()); // 获取相对路径
System.out.println(file.getAbsolutePath()); // 获取绝对路径
System.out.println(file.getCanonicalPath()); // 获取规范路径 规范路径指的是去除冗余的路径信息,如"."和".."等
}
运行结果:
2.2 检查文件
public static void main(String[] args) {
File file = new File("D:/test/test.txt");
System.out.println(file.exists()); // 检查文件是否存在
System.out.println(file.isDirectory()); // 检查是否为目录
System.out.println(file.isFile()); // 检查是否为文件
}
文件存在,不是目录,是文件,输出的结果正确:
2.3 文件的创建删除
public static void main(String[] args) throws IOException {
File file = new File("./test1.txt");
// file.createNewFile(); //文件不存在,创建文件
// file.delete(); //删除文件
//模拟创建和删除文件
file.createNewFile();
System.out.println("创建文件成功");
file.deleteOnExit();
System.out.println("使用deleteOnExit方法删除文件"); //程序结束时删除文件
Scanner scanner = new Scanner(System.in);
System.out.println("输入任意内容以退出程序");
scanner.next();
}
当我们程序还在运行时,虽然已经执行到了deleteOnExit()方法,但是文件还是存在,输入任意键后,程序结束,同时也可以看到此时文件已经被删除。
2.4 查看目录
public static void main(String[] args) {
File file = new File("./");
System.out.println(Arrays.toString(file.list())); // 列出文件夹下的所有文件和目录(字符符串数组)
System.out.println(Arrays.toString(file.listFiles())); // 列出文件夹下的所有文件和目录(File数组)
}
在实际应用中,listFiles这个方法使用的更多。
2.5 创建目录
public static void main(String[] args) {
File file = new File("./test");
file.mkdir(); // 创建单个目录
File file1 = new File("./test/1/2/3");
file1.mkdirs(); // 创建多级目录
}
如果使用mkdir()创建多级目录,代码运行后虽然不会报错,但是运行完成后并没有创建成功。
2.6 重命名
public static void main(String[] args) throws IOException {
File file = new File("./test.txt");
if (!file.exists()) {
file.createNewFile();
}
File file2 = new File("./test2.txt");
file.renameTo(file2);
}
这里的renameTo方法不止能改文件的名字,同时也能改目录的名字。
此外,这个方法也能起到移动文件的作用。
public static void main(String[] args) throws IOException {
File file = new File("./test/111.txt");
//将文件移动到指定目录
File file2 = new File("./111.txt");
file.renameTo(file2);
}
3. 读写文件操作
读文件:硬盘的数据读到内存
写文件:把内存的数据写到硬盘
我们通过“流对象”来对文件进行读写操作。
流对象可以分为两个大类:
字节流:读写数据以字节为基本单位,一次最少读写一个字节。对应的类有:InputStream,OutPutStream。读写二进制文件的时候通常使用字节流。
字符流:读写数据的时候以字符为基本的那位,一次最少读写一个字符。对应的类有:Reader,Writer。读写文本文件的时候通常使用字符流。
3.1 InputStream
这个类用于读取文件,下面看示例代码:
public static void main(String[] args) throws IOException {
//创建一个输入流对象,读取文件内容,这里相当于打开了一个文件
InputStream inputStream = new FileInputStream("./test2.txt");
//read返回的是下一个字节的整数值,范围从0到255,如果到达文件末尾,则返回-1
while(true){
int c = inputStream.read(); //一次读取一个字节
if (c == -1){
break; //如果到达文件末尾,则退出循环
}
System.out.printf("0x%x\n ", c); //打印字节的十六进制表示
}
}
运行结果是打印了这个文件每一个字节的十六进制表示:
还可以通过这种方法进行读取:
byte[] bytes = new byte[1024];
int n = inputStream.read(bytes); //一次读取多个字节
这里的返回值是实际读到的有效字节数。
在read方法的内部,往这个bytes数组中进行填充,也就是说,read会把文件中的字节存放在bytes数组中,尽可能的填满。
将上面单字节读取改进为多字节读取:
public static void main(String[] args) throws IOException {
//创建一个输入流对象,读取文件内容,这里相当于打开了一个文件
InputStream inputStream = new FileInputStream("./test2.txt");
//read返回的是下一个字节的整数值,范围从0到255,如果到达文件末尾,则返回-1
while(true){
byte[] bytes = new byte[1024];
int n = inputStream.read(bytes); //一次读取多个字节
if (n == -1){
break; //如果到达文件末尾,则退出循环
}
for (int i = 0; i < n; i++) {
System.out.printf("0x%x\n",bytes[i]);
}
}
}
read还有三个参数的版本:
后两个参数表示,从off下标开始,最多填充len个,增加了灵活性,可以只使用数组的一部分,但这种在实际应用中用的不多。
在最后,我们需要使用close来关闭文件,防止内存泄漏(内存申请后没有被释放,可用内存越来越少):
inputStream.close();
3.2 OutputStream
这个则是用于在文件中写,对应InputStream的read方法,OutputStream有write方法,同样也有三个版本:
第一个是写一个字节,第三个是写一个字节数组,第二个是写字节数组的一个部分。
public static void main(String[] args) {
try(OutputStream outputStream = new FileOutputStream("./test2.txt")) {
outputStream.write(97);
outputStream.write(98);
outputStream.write(99);
outputStream.write(100);
} catch (IOException e) {
e.printStackTrace();
}
}
在文件中写入abcd
注意,每次以这种方式打开文件,会把文件的所有内容清空。在最后加上一个“true”,就不会清空文件的内容:
总结
本篇文章简单介绍了文件的一些基本概念以及在java中对文件的一些常用操作,希望能够加深你们对文件的理解。