目录
一、什么是File类
1.1 概念
在 java 中,File 类是 java.io 包中唯一代表磁盘文件本身的对象,也就是说,如果希望在程序中操作文件和目录,则都可以通过 File 类来完成。File 类定义了一些方法来操作文件,如新建、删除、重命名文件和目录等。File 类不能访问文件内容本身,如果需要访问文件内容本身,则需要使用输入/输出流。
File类常见属性:
修饰符及类型 | 属性 | 说明 |
static String
| pathSeparactor |
依赖于系统的路径分隔符,
String
类型的表示
|
static char
| pathSeparactor |
依赖于系统的路径分隔符,
char
类型的表示
|
File 类提供了如下三种形式构造方法:
- File(String path):如果 path 是实际存在的路径,则该 File 对象表示的是目录;如果 path 是文件名,则该 File 对象表示的是文件。
- File(String path, String name):path 是路径名,name 是文件名。
- File(File dir, String name):dir 是路径对象,name 是文件名。
1.2 File类常用方法
对应使用的如下:
(1)使用文件的获取功能
public static void main(String[] args) throws IOException {
// new一个File对象,对File对象进行操作
File file = new File("d:/cat.jpg");
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)对于创建文件,删除文件、判断文件是否存在
public static void main(String[] args) throws IOException {
// 在相对路径中,./通常可以省略
File file = new File("./hello_world.txt");
System.out.println(file.exists());
System.out.println(file.isDirectory());
System.out.println(file.isFile());
System.out.println("===============");
// 创建文件
file.createNewFile();
System.out.println(file.exists());
System.out.println(file.isDirectory());
System.out.println(file.isFile());
// 删除文件操作
file.delete();
System.out.print("删除文件之后:");
System.out.println(file.exists());
}
运行结果:
(3)文件的重命名操作
public static void main(String[] args) {
File src = new File("./test222");
File dest = new File("./test-dirs");
// 将目录重命名
src.renameTo(dest);
}
运行结果:
(4)文件目录展示操作
// 文件目录展示操作
public static void main(String[] args) {
File file = new File("test-dir");
// 创建一级目录
// file.mkdir();
// 创建多级目录
// file.mkdirs();
String[] result1 = file.list();
System.out.println(Arrays.toString(result1));
File[] result2 = file.listFiles();
System.out.println(Arrays.toString(result2));
}
运行结果:
二、 InputStream类和OutputStream类
2.1 概念
InputStream和OutputStream类是一个抽象类,继承了Colseable接口。属于字节流的标准是输入输出操作。
public interface Closeable extends AutoCloseable
并且由于Closeable接口拓展了AutoCloseable接口,使得InputStream及其子类都可以用于带资源的 try with resources 带有资源的try操作,会在try代码块结束,自动执行close操作。
2.2 read方法
public abstract int read() throws IOException;
-
抽象方法、不提供实现、子类必须实现这个方法
从输入流读取数据的下一个字节,返回一个0-255范围内的int类型的数值。
如果到达了流的结尾会返回值-1
read()方法会一直阻塞,直到输入流可用、到达流的结尾或者引发异常
为什么返回的是int类型?
字节输入流可以操作任意类型的文件(比如图片、音频),这些文件底层都是二进制。如果每次读取都返回byte,就可能导致文件读取到一半就不读取了(例如:11111111是byte类型的-1)。使用int类型接收,会自动补足凑齐4个字节,byte类型的-1就会变成int类型的255,这样才可以保证数据的完整性。
如果返回char,因为char的取值范围是从0-65535。这个范围内所有字符都有可能会在数据中出现,那么就需要一个不可能出现在数据中的值来表示尾末流。
举例读取文本文件中的内容,并输出二进制数,代码如下:
public static void main(String[] args) throws IOException {
// 文件的打开操作
// InputStream inputStream = null;
// try {
// inputStream = new FileInputStream("d:/test.txt");
// }finally {
// // 关闭操作
// inputStream.close();
// }
// try with resources 带有资源的try操作,会在try代码块结束,自动执行close操作
try (InputStream inputStream = new FileInputStream("d:/test.txt")){
// 读文件操作
//无参数的read,相当于一次读一个字节 返回值类型为int
while (true){
int b = inputStream.read();
if (b == -1){
// 读到末尾,结束
break;
}
// 按照16进制打印
// System.out.println(b);
System.out.printf("%x\n",b);
}
}
}
运行结果:
2.3 Write方法
public static void main(String[] args) {
try(OutputStream outputStream = new FileOutputStream("d:/test.txt")) {
outputStream.write(97);
outputStream.write(98);
outputStream.write(99);
} catch (IOException e) {
e.printStackTrace();
}
}
运行结果:
将文本中原有的内容修改成添加的内容。
read 和 write 还可以一次读写多个字节,使用byte[] 来表示 。
read会尽可能把byte[]给填满,如果读到末尾,返回-1;
write会把byte[]的所有数据都写入文件。