❤️ Author: 老九
☕️ 个人博客:老九的CSDN博客
个人名言:不可控之事 乐观面对
系列专栏:

文章目录

  • 文件
    • 概念
    • 文件的分类
    • 常见的文件类型
    • 文件系统的目录结构
    • 路径
  • Java中的文件操作
    • 文件系统相关操作
      • 绝对路径
      • 相对路径
    • 文件是否存在
      • 绝对路径
      • 相对路径
    • 文件的创建和删除
      • 创建文件
      • 删除文件
    • 创建目录
      • 创建一级目录
      • 创建多级目录
    • 输出文件
      • 通过list列出文件
      • 通过File对象来输出
      • 重命名文件
  • 文件内容的读写
    • 流对象
    • 按照字节来读写
      • 一次读取一个字节
      • 一次读取若干个字节
      • 写文件
    • 按照字符来读写
      • 读文件
      • 写文件
    • buffer

文件

概念

普通的文件是保存在硬盘上的
网卡:操作系统把这样的硬件设备也抽象成一个文件,用来简化开发。显示器、键盘都被操作系统视为文件

文件的分类

1.文本文件:我们看到的里面存储的是字符。但文本文件本质上存的是字节。
2.二进制文件:存储的是字节。
判断一个文件是不是二进制编码,用记事本打开就好。打开是乱码,就是二进制文件,不是乱码就是文本文件。

是乱码,就说明这个文件在存储的时候是以二进制存储的。

常见的文件类型

  1. .txt,.c,.java 都是文本文件
  2. .doc,.ppt,.exe,.zip,.class 等都属于二进制文件

文件系统的目录结构

树形结构

路径

1.绝对路径:以盘符开头。例如:D:\BaiduNetdiskDownload\壁纸\1月日历.png。
2.相对路径:以点或点点 开头的,其中一个点是当前路径,两个点是当前路径的父路径(上级路径)

Java中的文件操作

Java当中的文件操作,主要有两类:
1.文件系统相关的操作:就是通过“文件资源管理器”能够完成一些功能。列出目录中有哪些文件,创建文件,创建目录,删除文件,重命名文件等等,Java 当中提供了一个 File 类,通过这个类来完成上述操作,File 类就描述了文件/目录。
2.文件内容相关的操作。

文件系统相关操作

1.Java 当中提供了一个 File 类,通过这个类来完成上述操作,File 类就描述了文件/目录。
2.基于这个对象就可以实现上面的这些功能。File 的构造方法,能够传入一个路径,来指定一个文件,这个路径可以是绝对路径也可以是相对路径。
3.构造好对象,就可以通过方法来实现一些功能。

绝对路径

在使用绝对路径的时候,在 File 的构造方法中写出来就行了,建议用 反斜杠,如果是用斜杠的话,就得再用一个斜杠来转义。所以建议用 反斜杠。代码如下:

public static void main(String[] args) throws IOException {//通过绝对路径来定位。File f1 = new File("d/Test1.txt");//获取到文件的父目录System.out.println(f1.getParent());//获取到文件名System.out.println(f1.getName());//获取到文件路径System.out.println(f1.getPath());//获取到绝对路径System.out.println(f1.getAbsolutePath());//获取到绝对路径System.out.println(f1.getCanonicalPath());}

相对路径

1.说到相对路径,一样得先明确一个“基准路径”,代码中基准路径是啥:光看代码看不出来。
2.如果是通过 IDEA 的方式来运行程序,此时的基准路径就是当前项目所在的路径。此时的 基准路径 就是项目所在路径。
3.后续还会把一个 Java 代码打成 war 包,放到 Tomcat 上面去运行。这种情况下,基准路径 就是 Tomcat 的 bin 目录

public static void main(String[] args) throws IOException {File f2 = new File("./Test1.txt");//获取到文件的父目录System.out.println(f2.getParent());//获取到文件名System.out.println(f2.getName());//获取到文件路径System.out.println(f2.getPath());//获取到绝对路径System.out.println(f2.getAbsolutePath());//获取到绝对路径System.out.println(f2.getCanonicalPath());}

文件是否存在

绝对路径

通过绝对路径来看,文件是否存在,是否是一个目录,是否是一个普通文件:

public static void main(String[] args) {File f = new File("d:/Test1.txt");//判断文件是否存在System.out.println(f.exists());//判断文件是否是一个目录System.out.println(f.isDirectory());//判断文件是否是一个普通文件System.out.println(f.isFile());}

相对路径

通过相对路径来看,文件是否存在,是否是一个目录,是否是一个普通文件:

public static void main(String[] args) {//换成相对路径就全是 false 了File f = new File("./Test1.txt");//判断文件是否存在System.out.println(f.exists());//判断文件是否是一个目录System.out.println(f.isDirectory());//判断文件是否是一个普通文件System.out.println(f.isFile());}

文件的创建和删除

创建文件

通过 createNewFile 来创建文件,代码如下:

public static void main(String[] args) throws IOException {//文件的创建和删除File f = new File("./Test1.txt");System.out.println(f.exists());System.out.println("创建文件");f.createNewFile();System.out.println("创建文件结束");System.out.println(f.exists());}

删除文件

通过 delete 方法直接删除,代码如下:

public static void main2(String[] args) {File f = new File("./Test1.txt");//删除文件,直接删除f.delete();}

创建目录

创建一级目录

通过 mkdir 来创建目录。代码如下:

public static void main(String[] args) {File f = new File("./aaa");//创建目录f.mkdir();//说明已经创建好目录了。System.out.println(f.isDirectory());}

创建多级目录

通过 mkdirs 来创建多级目录。代码如下:

public static void main(String[] args) {//创建多级目录File f = new File("./aaa/bbb/ccc/ddd");f.mkdirs();System.out.println(f.isDirectory());}

输出文件

通过list列出文件

public static void main1(String[] args) {File f = new File("./");//把 ./ 目录下所有的目录全部列出来System.out.println(Arrays.toString(f.list()));}

通过File对象来输出

public static void main(String[] args) {File f = new File("./");//通过 File 对象来输出。System.out.println(Arrays.toString(f.listFiles()));}

重命名文件

通过 renameTo 来重命名文件。代码如下:

public static void main(String[] args) {File f = new File("./aaa");File f2 = new File("./zzz");//把 aaa 的名字改成 zzzf.renameTo(f2);}

文件内容的读写

针对文件内容的读写,Java 标准库提供了一组类。按照文件的内容,分成了两个系列:
1.字节流对象,针对二进制文件,是以字节为单位进行读写的。
a. 读:InputStream
b. 写:OutputStream
2.字符流对象,针对文本文件,是以字符为单位进行读写的。
a. Reader
b. Writer

上面这些抽象类,既可以针对普通文件进行读写,也可以针对特殊文件(网卡,socket)进行读写。
上面所说的类都是抽象类,实际使用的都是这些类的子类:
FileInputStream
FileOutputStream
FileReader
FileWriter
上面这一组都是针对普通文件进行读写的。

流对象

流只是一个形象的比喻。通过流对象来读取 100 个字节,可以一次读十个字节,十次读完。也可以一次读 20 字节,五次读完。

按照字节来读写

一次读取一个字节

使用的时候,需要在构造方法中指定打开文件的路径。可以是绝对路径,也可以是相对路径。通过 try catch 来处理 FileNotFoundException 异常。代码如下:

public static void main(String[] args) {//方法中需要指定打开文件的路径。InputStream inputStream = null;try {//1、创建对象,同时也是在打开文件inputStream = new FileInputStream("d:/Test1.txt");//2、尝试一个一个字节的读,把文件都读完//读文件的时候,也可很容易读取失败。硬盘很容易出现坏道,while (true) {int b = inputStream.read();if (b == -1) {//读到了文件末尾break;}System.out.println(b);}//用完关闭文件,写在 finally 里面会更好,因为如果有异常的话,也可以继续关闭资源。} catch (IOException e) {e.printStackTrace();} finally {try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}}

运行结果如下:

因为我们文件当中的内容是:abcdef。所以读出来就是:97 98 99 100 101 102

一次读取若干个字节

public static void main(String[] args) {try (InputStream inputStream = new FileInputStream("d:/Test1.txt")){//一次读若干个字节while (true) {byte[] buffer = new byte[1024];//这个操作是把读出来的结果放到了 buffer 数组里了。相当于是使用 参数 来表示方法的返回值// 这种做法称为”输出型参数“,这种操作在 Java 中少见,C++ 当中常见。// 相当于把餐盘给阿姨,阿姨打好饭再给你int len = inputStream.read(buffer);if (len == -1) {//读到了文件末尾,读取完毕break;}for (int i = 0; i < len; i++) {System.out.println(buffer[i]);}}} catch (IOException e) {e.printStackTrace();}}

运行结果如下:

写文件

使用字节流 OutputStream 来写文件。代码如下:

public static void main(String[] args) {try (OutputStream outputStream = new FileOutputStream("d:/Test1.txt")) {//一次写入一个字节outputStream.write(97);outputStream.write(98);outputStream.write(99);} catch (IOException e) {e.printStackTrace();}}

这里写的内容就是 a,b,c 因为是根据编码来写入的。文件中如下:

按照字符来读写

读文件

按照字符来读的时候,没有那种一次读一个字符的,都要写buffer
通过Reader实现,代码如下:

public static void main(String[] args) {try (Reader reader = new FileReader("d:/Test1.txt")) {//按照字符来读while (true) {char[] buffer = new char[1024];int len = reader.read(buffer);if (len == -1) {break;}String s = new String(buffer, 0, len);System.out.println(s);}} catch (IOException e) {e.printStackTrace();}}

文件当中的内容:

运行结果如下:

写文件

通过 Writer 来实现:

public static void main(String[] args) {try (Writer writer = new FileWriter("d:/Test1.txt")) {writer.write("syz");} catch (IOException e) {e.printStackTrace();}}

运行结果如下:

buffer

就是刷新缓冲区。就像吃瓜子,一次抓很多瓜子。一次抓很多瓜子的手就是 “输入缓冲区”。如果吃完瓜子,把瓜子皮放在一个纸巾上面,这个纸巾就是输出缓冲区。
缓冲区存在的意义: 缓冲区存在的意义就是为了提高效率,在 计算机 当中很重要,就像 CPU 读取内存的速度,比读取硬盘的速度高很多。所以缓冲区就是一次性读一堆数据放在缓冲区,这样就增加了之后读取的效率。
写数据的时候,需要先把数据写在缓冲区,然后再统一写硬盘。如果缓冲区已经满了,就触发写硬盘操作。如果缓冲区还没满,也想写在硬盘里,就可以通过 flush 来手动刷新缓冲区。


♥♥♥码字不易,大家的支持就是我坚持下去的动力♥♥♥
版权声明:本文为CSDN博主「亚太地区百大最帅面孔第101名」的原创文章