文件
狭义的文件: 硬盘上的文件和目录(文件夹)
广义的文件: 泛指计算机中的很多 软硬件资源
- OS 中, 把很多硬件设备和软件资源抽象成了文件, 按照文件的方式来统一管理
- 网络编程中, OS 把网卡当成了一个文件来操作
路径
绝对路径: 以盘符**(c: d: e:)**开头的路径
相对路径: 以 当前所在目录 为基准, 或者以 . 或者 … 开头的路径 (当前所在目录 => 工作目录)
文件类型
文本文件: 存的是被字符集编码过的文本
二进制文件: 保存的是按照标准格式保存的非被字符集编码过的文件(存的是二进制数据, 不一定是字符串, 可以存任何类型数据 [图片, 音频 …])
如何区分 文本文件 和 二进制文件
用记事本打开文件
如果乱码, 就是二进制文件
如果不乱码, 就是文本文件
Java 对于文件的操作
- 针对文件系统的操作 (文件的创建, 删除, 重命名 …)
- 针对文件内容的操作 (文件的读和写)
针对文件系统的操作 (文件的创建, 使用, 重命名 …)
Java 标准库提供了 File 类方便我们对文件的操作
常见构造方法有两个
File(String pathname): 参数是文件对应的目录
下图为例: File file = new File("e:/test/b.txt");
或者 File file = new File("e:\\test\\b.txt");
(注意转义字符)
File(String parent, String child): parent 表示当前文件所在目录, child 表示自身的文件名
下图为例:
File file = new File("e:/test", "b.txt");
常用 API 分析
根据 FIle 对象创建删除文件和文件夹
public static void main(String[] args) throws IOException { File context = new File("./test/aaa/bbb"); // 创建目录(只能创建一级, 如果中间目录不存在, 则创建失败) context.mkdir(); // 创建目录(如果中间目录不存在, 会创建中间目录) context.mkdirs(); File file = new File("./test/aaa/bbb/a.txt"); // 如果文件不存在就把它创建出来, 如果已存在则不进行任何操作 // 如果创建成功返回 true, 创建失败返回 false file.createNewFile(); //根据 File对象删除文件, 成功删除返回 true file.delete(); }
获取文件的信息
public static void main(String[] args) { File file = new File("./test/aaa/bbb/a.txt"); // 判断 File 对象描述的文件是否存在 System.out.println("file.exists(): " + file.exists()); // 获取 File 对象的文件名称(不含路径) System.out.println("file.getName(): " + file.getName()); // 获取 File 对象的父目录文件路径 System.out.println("file.getParent(): " + file.getParent()); // 获取 File 对象的文件路径 System.out.println("file.getPath(): " + file.getPath()); // 获取 File 对象的绝对路径 System.out.println("file.getAbsolutePath(): " + file.getAbsolutePath()); // 判断 File 对象是否是一个文件 System.out.println("file.isFile(): " + file.isFile()); // 判断 File 对象是否是一个目录 System.out.println("file.isDirectory(): " + file.isDirectory()); }
运行结果
获取目录下的文件名/文件
public static void main(String[] args) { File file = new File("e:/test"); // 获取 File 对象代表的目录下的所有文件名 String[] fileName = file.list(); // 获取 File 对象代表的目录下的所有文件, 以 File 对象表示 File[] files = file.listFiles(); for(String s : fileName) { System.out.println(s); } for (File f : files){ System.out.println(f.toString()); } }
运行结果
文件改名/剪切/粘贴
public static void main(String[] args) { File file = new File("./test/aaa/bbb/a.txt"); File file1 = new File("./test/aaa/bbb/b.txt"); // 删除 file 对象对应的文件, 并将其放到 file2 中去 (并且重命名) file.renameTo(file1); }
运行结果
针对文件内容的操作 (文件的读和写)
针对文件内容, 使用 “流对象” 进行操作.
attention: 文件的读写, 是针对文件来说的, 从文件读内容到内存, 从内存写内容到文件, 或者再简单一点, 从文件读, 写到文件里(~~这个玩意好长一段时间我傻傻分不清~~ )
Java 标准库的流对象, 分为两个大类
- 字节流 (操作二进制数据)
- InputStream FileInputStream
- OutputStream FileOutputStream
- 字符流 (操作文本数据)
- Reader FileReader
attention: 读文件的操作不会对文件内容产生影响, 但是写文件操作, 默认情况下, 流对象在打开文件的同时, 就会清空文件内容, 如果想要实现 "追加写", 可在打开文件时修改参数
上述类对象的核心操作如下:
- 打开文件 (构造对象)
- 关闭文件 (close)
- 读文件(read) => 针对 InputStream / Reader
- 写文件(write) => 针对 OutputStream / Writer
InputStream
read:
用来读取字节
read():
无参版本, 一次读一个字节, 返回值为读到的字节, 当读不到内容时(EOF) , 返回值为-1
.
read(byte[] b):
尽可能多的将数据读取到 b 数组里, 返回值为读取到字节的数量, 当读取完毕后再读取, 返回值为 -1
.
read(byte[] b, int off, int len):
读取 len
长度的字节到 b
数组里, 从off
下标开始填充.
read()
public static void main(String[] args) throws IOException { File file = new File("./test/aaa/bbb/b.txt"); InputStream inputStream = new FileInputStream(file); // 单个字符, 进行读操作 while(true) { int b = inputStream.read(); if(b == -1) break; System.out.print(b + " "); } inputStream.close(); }
read(byte[] b)
&read(byte[] b, int off, int len)
public static void main(String[] args) throws IOException { File file = new File("./test/aaa/bbb/b.txt"); InputStream inputStream = new FileInputStream(file); while(true) { byte[] buffer = new byte[1024]; // 读取的数据填充到 buffer 数组中 // 从下标 0 开始填充, 尽可能填充满 buffer.length 的容量 int len = inputStream.read(buffer, 0, buffer.length); if(len == -1) break; System.out.println(new String(buffer)); } inputStream.close(); }
Scanner
Scanner 搭配流对象进行使用 (InputStream 也是流对象)
public static void main(String[] args) throws IOException { try (InputStream inputStream = new FileInputStream("./test/aaa/bbb/b.txt")) { Scanner scanner = new Scanner(inputStream); System.out.println(scanner.next()); } }
OutputStream
各参数版本同上, 不再赘述
write()
public static void main(String[] args) throws IOException { try (OutputStream outputStream = new FileOutputStream("./test/aaa/bbb/b.txt")) { outputStream.write(97); outputStream.write(98); outputStream.write(99); } }
write(byte[] b)
&write(byte[] b,int off, int len)
public static void main(String[] args) throws IOException { try (OutputStream outputStream = new FileOutputStream("./test/aaa/bbb/b.txt")) { byte[] buffer = "hello 朱睿杰".getBytes(StandardCharsets.UTF_8); outputStream.write(buffer,0 ,buffer.length); } }
Reader
read()
public static void main(String[] args) throws IOException { try (Reader reader = new FileReader("./test/aaa/bbb/b.txt")) { while(true) { int ch = reader.read(); if(ch == -1) break; System.out.print((char)ch); } } }
read(char[] cbuf)
&read(char[] cbuf, int off, int len)
public static void main(String[] args) throws IOException { try (Reader reader = new FileReader("./test/aaa/bbb/b.txt")) { char[] buffer = new char[1024]; while(true) { int ch = reader.read(buffer, 0 , buffer.length); if(ch == -1) break; System.out.print(buffer); } } }
Writer
public static void main(String[] args) throws IOException { try (Writer writer = new FileWriter("./test/aaa/bbb/b.txt")) { String str = "abcdefg"; char[] cbuf = "朱睿杰".toCharArray(); writer.write(97); writer.write("\n"); writer.write(str); writer.write("\n"); writer.write(str, 0, 3); //读取str, 往文件里写, 从下标 0开始, 到下标 3结束 writer.write("\n"); writer.write(cbuf); writer.write("\n"); writer.write(cbuf,0, 2); writer.write("\n"); } }