> 文章列表 > 【Java】文件类 File 中的文件操作与文件读写

【Java】文件类 File 中的文件操作与文件读写

【Java】文件类 File 中的文件操作与文件读写

文件操作

File 类

属性

修饰符及类型 属性 说明
static String pathSeparator 路径分隔符,String 类型表示
static char pathSeparator 路径分隔符,char 类型表示

构造方法

方法签名 说明
File(File parent, String child) 根据父目录 File 对象 + 孩子路径,创建 File 对象
File(String pathname) 根据文件的绝对路径或相对路径创建 File 对象
File(String parent, String child) 根据父目录路径 + 孩子路径,创建 File 对象

方法

修饰符及返回类型 方法签名 说明
String getParent() 返回 File 对象的父目录路径
String getName() 返回 File 对象的待后缀文件名称
String getPath() 返回 File 对象的文件路径
String getAbsolutePath() 返回 File 对象的绝对路径
String getCanonicalPath() 返回 File 对象修饰过的绝对路径
boolean exists() 判断 File 对象描述的文件是否存在
boolean isDirectory() 判断 File 对象代表的文件是否是一个目录
boolean isFile() 判断 File 对象代表的文件是否是一个文件
boolean createNewFile() 根据 File 对象的描述,创建对应文件,创建成功返回 true
boolean delete()

根据 File 对象的描述,删除对应文件,删除成功返回 true

void deleteOnExit() 根据 File 对象的描述,将对应文件标注为待删除,在 JVM 运行结束时执行删除
String[] list() 返回 File 对象代表的目录下所有文件的文件名
File[] listFiles() 返回根据 File 对象代表的目录下所有文件所构造的所有对应的 File 对象
boolean mkdir() 创建 File 对象代表的目录,无法进行多层目录创建
boolean mkdirs() 创建 File 对象代表的目录,可以进行多层目录创建
boolean renameTo(File dest) 进行文件改名,也可以修改路径
boolean canRead() 判断用户是否有可读权限
boolean canWrite() 判断用户是否有可写权限

get 方法的使用

public class Test {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());}
}

运行结果

文件创建删除

public class Test {public static void main(String[] args) throws IOException {File file = new File("test.txt");System.out.println("是否存在 " + file.exists());System.out.println("是否为文件夹 " + file.isDirectory());System.out.println("是否为文件 " + file.isFile());System.out.println();System.out.println("使用 createNewFile() 创建文件");System.out.println(file.createNewFile());System.out.println();System.out.println("是否存在 " + file.exists());System.out.println("是否为文件夹 " + file.isDirectory());System.out.println("是否为文件 " + file.isFile());System.out.println();System.out.println("使用 delete() 删除文件");System.out.println(file.delete());System.out.println();System.out.println("是否存在 " + file.exists());System.out.println("是否为文件夹 " + file.isDirectory());System.out.println("是否为文件 " + file.isFile());}
}

运行结果

文件读写

InputStream

方法

修饰符及返回类型 方法签名 说明
int read() 读取一个字节的数据,当内容读完后再读将返回 -1
int read(byte[] b) 最多读取 b.length 字节的数据到 b 中,返回读到的字节数,返回 -1 表示文件读完
int read(byte[] b, int off, int len) 读取 len 个字节,最多读取 b.length - off 个字节,数据从 b[off] 开始储存,返回 -1 表示文件读完
void close() 关闭字节流输入

InputStream 是一个抽象类,需要使用实现类来调用具体方法,我们这里需要文件相关的Input Stream 实现类 —— FileInputStream 类

FileInputStream

构造方法

方法签名 说明
FileInputStream(File file) 利用 File 对象构造文件输入流 FileInputStream 对象
FileInputStream(String name) 利用文件路径构造文件输入流 FileInputStream 对象

使用 read() 一个一个字节读取

public class Test {public static void main(String[] args) throws IOException {// test.txt 与 src 在同一层中// test.txt 内容为 test// 使用 try-with-resources 语句打开 FileInputStream 资源// try 语句执行完毕后 自动释放 FileInputStream 资源try (InputStream inputStream = new FileInputStream("test.txt")) {// 使用 read() 一个一个字节的读取直到文件读取结束while (true) {int b = inputStream.read();if (b == -1) {// 当 read() 返回 -1// 文件读取完毕,break 退出循环break;}// 将每次读取到的字节值以字符形式输出System.out.printf("%c", b);}}}
}

运行结果

  

使用 read(byte[] b) 一次读取所有字节

public class Test {public static void main(String[] args) throws IOException {// test.txt 与 src 在同一层中// test.txt 内容为 test// 使用 try-with-resources 语句打开 FileInputStream 资源// try 语句执行完毕后 自动释放 FileInputStream 资源try (InputStream inputStream = new FileInputStream("test.txt")) {byte[] bytes = new byte[4];while (true) {int len = inputStream.read(bytes);if (len == -1) {// 当 read() 返回 -1// 文件读完break;}for (int i = 0; i < len; i++) {System.out.printf("%c", bytes[i]);}}}System.out.println();}
}

运行结果

注意:由于中文字符的编码原因,一个字节并不能对应一个字符,使用这种方法读取中文需要将 bytes 数组使用 String 类的构造方法 String(byte bytes[], int offset, int length, String charsetName)  将 bytes[] 转换为字符串 (UTF-8  的一个字符大小为 3 个字节)

for (int i = 0; i < len; i+=3) {String s = new String(bytes, i, 3, "UTF-8");System.out.print(s);
}

运行结果

Scanner

构造方法

构造方法 说明
Scanner(InputStream inputStream, String charset) 使用 charset 字符集进行 inputStream 的扫描读取

代码实现

public class Test {public static void main(String[] args) throws IOException {try (InputStream inputStream = new FileInputStream("test.txt")) {try (Scanner scanner = new Scanner(inputStream, "UTF-8")) {while (scanner.hasNext()) {String s = scanner.next();System.out.print(s);}}}}
}

运行结果

OutputStream

方法

修饰符及返回值类型 方法签名 说明
void write(int b) 写入要给的字节数据
void write(byte[] b) 将字节数据中的数据全部写入
int write(byte[] b, int off, int len) 写入字节数组中从 off 开始的 len 个字节数据
void close() 关闭字节流
void flush() 刷新缓冲区

缓冲区:对程序来讲 I/O 速度是比较慢的。因此为了减少 I/O 次数,写数据的时候会先将数据写入到一个指定的缓冲区中。缓冲区满了或是满足了某些特定条件的时候,将缓冲区的数据一次性写入到目标中,大大减少 I/O 次数。但可能就会出现写入数据时,数据写入到缓冲区中了,但不满足条件,没有写入真正的目的地,数据被遗留在了缓冲区中。所以我们有时需要使用 flush() 刷新缓冲区,强行将缓冲区的数据写到目的地中

OutputStream 同样是一个抽象类,所以我们应该使用 FileOutputStream 类

OutputStreamWriter

一个一个字节写入

public class Test {public static void main(String[] args) throws IOException {try (OutputStream outputStream = new FileOutputStream("test.txt")) {outputStream.write('H');outputStream.write('e');outputStream.write('l');outputStream.write('l');outputStream.write('o');outputStream.flush();}}
}

运行结果

字节数组写入

public class Test {public static void main(String[] args) throws IOException {try (OutputStream os = new FileOutputStream("test.txt")) {byte[] b = new byte[]{(byte) 'G', (byte) 'o', (byte) 'o', (byte) 'd'};os.write(b);os.flush();}}
}

运行结果

使用字符串写入

public class Test {public static void main(String[] args) throws IOException {try (OutputStream outputStream = new FileOutputStream("test.txt")) {String s = "Hello 世界";byte[] b = s.getBytes(StandardCharsets.UTF_8);outputStream.write(b);outputStream.flush();}}
}

运行结果

PintWriter

PintWriter 类的对象,提供了几种我们比较熟悉的输出方法,包括 print/println/printf

public class Test {public static void main(String[] args) throws IOException {try (OutputStream outputStream = new FileOutputStream("test.txt")) {OutputStreamWriter osWriter = new OutputStreamWriter(outputStream, StandardCharsets.UTF_8);PrintWriter writer = new PrintWriter(osWriter);writer.print("Hello ");writer.println("你好");writer.printf("%s: %d\\n", "一百", 100);writer.flush();}}
}

运行结果