当前位置:首页 > 技术 > 正文内容

Java文件与IO操作详解

访客 技术 2026年7月3日 1

文件操作类:File

java.io包中,若要对文件本身进行操作(如创建、删除等),需依赖java.io.File类。以下是File类的常用方法:

方法 类型 描述
public File(String path) 构造方法 指定完整路径
public File(File parent, String child) 构造方法 设置父路径与子文件路径
boolean createNewFile() throws IOException 普通方法 创建新文件
boolean exists() 普通方法 判断路径是否存在
boolean delete() 普通方法 删除指定路径的文件
File getParentFile() 普通方法 获取当前路径的父路径
boolean mkdirs() 普通方法 创建多级目录
long length() 普通方法 获取文件大小(以字节为单位)
boolean isFile() 普通方法 判断路径是否是文件
boolean isDirectory() 普通方法 判断路径是否是目录
long lastModified() 普通方法 获取文件最后修改时间
String[] list() 普通方法 列出目录中的所有内容
File[] listFiles() 普通方法 列出所有路径并返回File对象数组

示例代码展示如何使用File类操作文件:

package com.example;

import java.io.File;
import java.io.IOException;

public class FileDemo {
    public static void main(String[] args) {
        File file = new File("d:" + File.separator + "test.txt");
        if (file.exists()) {
            file.delete();
        } else {
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

为了跨平台定义路径,可以使用File.separator常量:

File file = new File("d:" + File.separator + "test.txt");

多级目录创建

当需要创建带有路径的文件时,应先判断父路径是否存在,如果不存在则创建:

File file = new File("d:" + File.separator + "folder" + File.separator + "subfolder" + File.separator + "example.txt");
if (!file.getParentFile().exists()) {
    file.getParentFile().mkdirs();
}
try {
    file.createNewFile();
} catch (IOException e) {
    e.printStackTrace();
}

获取文件信息

可以通过以下代码获取文件或目录的相关信息:

File file = new File("d:" + File.separator + "mypicture.png");
if (file.exists()) {
    System.out.println("是否是文件:" + file.isFile());
    System.out.println("是否是目录:" + file.isDirectory());
    System.out.println("文件大小:" + file.length() / 1024.0 / 1024.0 + " MB");
    System.out.println("上次修改时间:" + new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new java.util.Date(file.lastModified())));
}

列出目录内容

使用listFiles()方法列出目录下的所有文件和子目录:

File dir = new File("d:" + File.separator);
if (dir.isDirectory()) {
    File[] files = dir.listFiles();
    for (File f : files) {
        System.out.println(f.getAbsolutePath());
    }
}

递归列出所有子目录及文件:

public static void printFiles(File file) {
    if (file.isDirectory()) {
        File[] subfiles = file.listFiles();
        if (subfiles != null) {
            for (File f : subfiles) {
                printFiles(f);
            }
        }
    }
    System.out.println(file.getAbsolutePath());
}

字节流与字符流

字节输出流:OutputStream

OutputStream用于写入字节数据,其常用方法如下:

方法 描述
void close() 关闭流
void flush() 强制刷新缓冲区
void write(int b) 写入单个字节
void write(byte[] b) 写入字节数组
void write(byte[] b, int off, int len) 写入部分字节数组

示例代码展示如何使用FileOutputStream写入数据:

File file = new File("d:" + File.separator + "output.txt");
if (!file.getParentFile().exists()) {
    file.getParentFile().mkdirs();
}

try (FileOutputStream fos = new FileOutputStream(file)) {
    String content = "Hello World!";
    fos.write(content.getBytes());
} catch (Exception e) {
    e.printStackTrace();
}

字节输入流:InputStream

InputStream用于读取字节数据,其常用方法如下:

方法 描述
int read() 读取单个字节
int read(byte[] b) 将数据读取到字节数组中
int read(byte[] b, int off, int len) 将数据读取到部分字节数组中

示例代码展示如何使用FileInputStream读取数据:

File file = new File("d:" + File.separator + "input.txt");
if (file.exists()) {
    try (FileInputStream fis = new FileInputStream(file)) {
        byte[] buffer = new byte[1024];
        int bytesRead = fis.read(buffer);
        System.out.println(new String(buffer, 0, bytesRead));
    } catch (Exception e) {
        e.printStackTrace();
    }
}

字符输出流:Writer

Writer用于写入字符数据,其常用方法如下:

方法 描述
void close() 关闭流
void flush() 强制刷新缓冲区
void write(String str) 写入字符串
void write(char[] cbuf) 写入字符数组

示例代码展示如何使用FileWriter写入数据:

File file = new File("d:" + File.separator + "output.txt");
if (!file.getParentFile().exists()) {
    file.getParentFile().mkdirs();
}

try (FileWriter writer = new FileWriter(file)) {
    writer.write("Hello World!");
} catch (Exception e) {
    e.printStackTrace();
}

字符输入流:Reader

Reader用于读取字符数据,其常用方法如下:

方法 描述
int read() 读取单个字符
int read(char[] cbuf) 将数据读取到字符数组中
long skip(long n) 跳过指定数量的字符

示例代码展示如何使用FileReader读取数据:

File file = new File("d:" + File.separator + "input.txt");
if (file.exists()) {
    try (FileReader reader = new FileReader(file)) {
        char[] buffer = new char[1024];
        int charsRead = reader.read(buffer);
        System.out.println(new String(buffer, 0, charsRead));
    } catch (Exception e) {
        e.printStackTrace();
    }
}

字节流与字符流的区别

  • 字节流直接操作字节数据,适合处理二进制文件(如图片、音频等)。
  • 字符流通过缓冲区处理字符数据,适合处理文本文件,并支持字符编码转换。
标签: JavaioFile

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。