文件操作和IO(Java)
目录
一、IO、存储、硬盘、文件系统相关常识
1、IO(输入/输出)
IO:计算机与外部设备(含存储)的数据交互动作,也可以理解为 input(输入)和 output(输出),是数据 “ 流动 ” 的过程,比如打开硬盘文件就是一次 IO 读取 ,保存文件就是 IO
写入
2、存储
存储:存放数据的 “ 容器 ” 统称,分内存(临时存储、断电丢失、速度快)和外存(“永久” 存储,断电数据保留,速度慢),硬盘是外存的核心代表,以下是存储介质:
- 磁性存储:硬盘驱动器(HDD)
- 固态存储:固态硬盘(SSD)
- 光学存储:CD、DVD
- 云存储:数据保留在远程服务器上
3、硬盘
硬盘 主要分为机械硬盘(HDD)和固态硬盘(SSD)
- 机械硬盘:通过磁头和机械结构读写数据,速度较慢但容量大,价格低,适合存储大量冷数据,如备份文件视频等
- 固态硬盘:基于闪存芯片,读写速度快,抗震性强,成本高,适合安装操作系统,高频使用软件,提升系统响应速度
4、文件系统
文件系统是操作系统与存储设备之间的 “ 翻译官 ” 和 “ 管理员 ” ,它将存储设备的原始二进制数据组织成我们可以理解的 “ 文件 ” 和 “ 文件夹 ” 形式,同时管理文件的创建、读取、修改和删除全生命周期
文件系统核心功能:
- 目录结构:树状层级组织文件,记录文件的从属关系(如 /home/user)
- 元数据管理:记录文件大小、权限、时间戳等信息
3. 空间分配:通过块或簇管理磁盘空间,减少碎片
4. 读写保障:通过日志(如office相关软件的隐藏文件),记录文件的操作过程,若突然 断电或出错,可以依据隐藏文件恢复数据,减少文件损坏风险
5. 权限控制:基于用户/组的读写执行权限
二、Java中操作文件
1、File 概述
Java 中的 File 类(位于java.io包)用于文件或目录的抽象路径名,提供对文件系统的操作能力,它不涉及文件内容的读写,主要用于管理文件元数据、路径操作及目录遍历
2、属性
| 修饰符及类型 | 属性 | 说明 |
|---|---|---|
| static String | pathSeparator | 依赖于系统的路径分隔符,String类型的表示 |
| static char | pathSeparator | 依赖于系统的路径分隔符,char类型的表示 |
3、方法
构造方法:
方法 说明 File(File parent,String child)
根据父目录+孩子文件路径,创建一个新的File类 File (String pathname) 根据文件路径创建一个新的 File 实例,路径可以是绝对或相对路径 File(String parent,String child) 根据父目录加孩子文件路径,创建一个新的 File 实例,父目录用路径表示
方法:
修饰符及返回值类型 方法 说明 String getParent() 返回 File 对象的父目录文件路径 String getName() 返回 File 对象的纯文件名称 String Path() 返回 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() 判断用户是否对文件有可写权限
4、代码展示
get方法:
import java.io.File; import java.io.IOException; public class Demo7 { public static void main(String[] args) throws IOException { File file=new File("D:/TEST1/test.txt");//并不要求该文件真实存在 System.out.println(file.getParent()); System.out.println(file.getName()); System.out.println(file.getPath()); System.out.println(file.getAbsoluteFile()); System.out.println(file.getCanonicalPath()); } }
文件的创建和删除:
import java.io.File; import java.io.IOException; public class Demo20 { public static void main(String[] args) throws IOException { File file=new File("D:/TEST1/test.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()); } }
import java.io.File; import java.io.IOException; import java.util.Scanner; public class Demo21 { public static void main(String[] args) throws IOException { File file=new File("D:/TEST1/test.txt"); System.out.println(file.createNewFile()); System.out.println(file.exists()); System.out.println(file.delete()); System.out.println(file.exists()); System.out.println(file.createNewFile()); file.deleteOnExit(); Scanner scanner=new Scanner(System.in); scanner.next(); System.out.println(file.exists());//这里文件还存在,当程序运行结束后文件还是被删除了 } }
目录的创建:
import java.io.File; public class Demo22 { public static void main(String[] args) { File file=new File("D:/Hello"); System.out.println(file.isDirectory()); System.out.println(file.isFile()); System.out.println(file.mkdir()); System.out.println(file.isDirectory()); System.out.println(file.isFile()); } }
在 mkdir()的时候,如果中间目录不存在,则无法创建成功,所以我们使用 mkdirs()
import java.io.File; public class Demo23 { public static void main(String[] args) { File file=new File("D:/Hello/aaa/"); System.out.println(file.isDirectory()); System.out.println(file.isFile()); System.out.println(file.mkdirs()); System.out.println(file.isDirectory()); System.out.println(file.isFile()); } }
文件重命名:
import java.io.File; import java.io.IOException; public class Demo24 { public static void main(String[] args) throws IOException { File file=new File("D:/TEST1/test.txt");//这个文件得存在 file.createNewFile(); File dest=new File("D:/TEST1/dest.txt"); System.out.println(file.exists()); System.out.println(dest.exists()); System.out.println(file.renameTo(dest)); System.out.println(file.exists()); System.out.println(dest.exists()); } }
三、文件内容的读写 - 数据流
1、InputStream
InputStream 是Java I/O 中的抽象基类,用于表示字节输入流,所有字节输入流均继承自此类,提供读取字节数据的通用方法
方法和说明
InputStream 只是一个抽象类,要使用还需具体的实现类,我们现在只使用 FileInputStream
修饰符及返回值类型 方法 说明 int read() 读取一个字节的数据,返回 -1 代表已经读取完了 int read(byte[ ] b) 最多读取b . length 字节的数据到 b 中,返回实际读到的数量,-1 代表已经读完了
int read(byte [ ] b,int off,int len) 最多读取 len-off 字节的数据到 b 中,放在从 off 开始,返回实际读到的数据,-1 代表已经读完了 void close() 关闭字节流
2、FileInputStream
FileInputStream 是 Java 中用于从文件读取字节流的类,属于 java , io 包。它继承自 InputStream,适用于读取原始字节
构造方法
方法 说明 FileInputStrem(File file) 利用File构造文件输入流 FileInputStream(String name) 利用文件路径构造文件输入流
3、代码展示
将文件完全读完:
import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; public class Demo25 { public static void main(String[] args) throws FileNotFoundException { try (InputStream inputStream=new FileInputStream("D:/TEST1/test.txt")){ while (true){ int n=inputStream.read(); if(n==-1){ break; } System.out.printf("%x\n",n); } } catch (IOException e) { e.printStackTrace(); } } }
import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; public class Demo26 { public static void main(String[] args) { //try-with-resources 语句声明时,无需手动调用close()方法 try (InputStream inputStream=new FileInputStream("D:/TEST1/test.txt")){ 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("%c",bytes[i]); } } }catch (IOException e){ e.printStackTrace(); } } }
4、利用 Scanner 进行字符读取
构造方法(此处仅列举一个):
构造方法 说明 Scanner (InputStream source) 字节输入流对象 import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.Scanner; public class Demo27 { public static void main(String[] args) { try (InputStream inputStream=new FileInputStream("D:/TEST1/test.txt")){ Scanner scanner=new Scanner(inputStream); String content=scanner.next(); System.out.println(content); }catch (IOException e){ e.printStackTrace(); } } }
5、OutputStream
OutputStream 是 Java 中用于输出字节数据的抽象类,位于 java . io 包中。它是所有字节输出流类的父类,定义了写入字节数据的基本方法
方法和说明
修饰符及返回值类型 方法 说明 void write(int b) 写入单个字节 void write(byte [ ] b) 写入字节数组中的所有字节 int write(byte [ ] b,int off,int len) 从字节数组的指定偏移量开始
写入指定长度的字节
void close() 关闭字节流 void flush() 强制将缓冲区中的数据写入目标,
确保数据及时输出
OutputStream 也是个抽象类,我们使用 FileOutputStream来实现
6、代码展示
进行字符写入:
import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; public class Demo28 { public static void main(String[] args) { //这里加上true这个参数不会删除原有数据,而是继续向后添加 try(OutputStream outputStream=new FileOutputStream("D:/TEST1/test.txt",true)) { /*outputStream.write(65); outputStream.write(66); outputStream.write(67); outputStream.write(68);*/ byte[] bytes={97,98,99,100}; outputStream.write(bytes); }catch (IOException e){ e.printStackTrace(); } } }
7、PrintWriter 类
PrintWriter 是 Java 中 java . io 包提供的类,用于将格式化数据写入文本输出流,适用于写入文件、网络流或标准输出
代码展示:
import java.io.IOException; import java.io.PrintWriter; public class Demo29 { public static void main(String[] args) { try(PrintWriter printWriter=new PrintWriter("D:/TEST1/test.txt")) { printWriter.printf("%d + %d = %d\n",10,20,30); }catch (IOException e){ e.printStackTrace(); } } }

更多推荐
















所有评论(0)