Java中文件操作和IO(如果想知道Java中有关文件操作和IO的知识,那么只看这一篇就足够了!)

Java中文件操作和IO(如果想知道Java中有关文件操作和IO的知识,那么只看这一篇就足够了!)

        前言:在 Java 中,输入输出(I/O)是常见的操作,字节流和字符流是处理文件和数据的核心类,本文将介绍 InputStream、OutputStream、Reader 和 Writer 类的基本用法。




✨✨✨这里是秋刀鱼不做梦的BLOG

✨✨✨想要了解更多内容可以访问我的主页
秋刀鱼不做梦-ZEEKLOG博客

在正式开始讲解之前,先让我们看一下本文大致的讲解内容:

目录

1.File 类

        (1)构造方法

        【1】File(String pathname):最简单的方式,直接传入文件的路径

        【2】File(String parent, String child):我们也可以先给出父目录,然后再给出子文件或子目录的名称

        【3】File(File parent, String child):首先先创建一个 File 对象表示父目录,然后用它来构建子文件或子目录

        (2)File中的方法

【1】获取文件信息类

【2】判断文件状态类

【3】文件与目录操作

【4】列出目录内容

2.数据流类

        (1)InputStream 类

        (2)OutputStream 类

        (3)Reader 类

        (4)Writer 类


1.File 类

        首先先让我们了解一下Java中的File 类,在 Java 中,File 类是我们用来操作文件和目录的工具,虽然它并不能直接读取或写入文件的内容,但它提供了很多方法,让我们能够管理文件系统,比如检查文件是否存在、获取文件信息、创建文件和目录、删除文件等等,简而言之,它是与文件打交道时的一个基础类。

        (1)构造方法

        初步了解了File类是个什么东西之后,那么我们在Java中如何去创建File类呢?常见的创建方式有如下三种:

        【1】File(String pathname):最简单的方式,直接传入文件的路径

File file = new File("path/to/file.txt"); 

        【2】File(String parent, String child):我们也可以先给出父目录,然后再给出子文件或子目录的名称

File file = new File("path/to", "file.txt"); 

        【3】File(File parent, String child):首先先创建一个 File 对象表示父目录,然后用它来构建子文件或子目录

File parentDir = new File("path/to"); File file = new File(parentDir, "file.txt"); 

        通过上述方法,我们就可以方便地根据路径创建 File 对象,之后就可以对这些文件或目录进行各种操作了!!!

        (2)File中的方法

         File类中提供了很多方法,能帮助我们做各种文件和目录的操作,比如获取文件信息、检查文件状态、创建和删除文件等等,我们来看看其中一些最常用的方法:

【1】获取文件信息方法

        getName():返回文件的名称,不包括路径。

File file = new File("path/to/file.txt"); System.out.println(file.getName()); // 输出 file.txt 

        getAbsolutePath():返回文件的绝对路径,这个路径不管你在哪个目录下都能访问到文件。

System.out.println(file.getAbsolutePath()); 

        getPath():返回文件的路径,可能是相对路径,也可能是绝对路径,取决于创建 File 对象时传入的是什么路径

System.out.println(file.getPath()); 

        getParent():返回文件的父目录,如果文件在根目录或者没有父目录,这个方法会返回null。

System.out.println(file.getParent()); 

【2】判断文件状态方法

        exists():检查文件或目录是否存在,如果存在,返回 true,否则返回 false

if (file.exists()) { System.out.println("文件存在"); } else { System.out.println("文件不存在"); } 

        isFile():判断它是否是一个文件,如果是文件,返回 true,如果是目录,返回 false

if (file.isFile()) { System.out.println("是文件"); } 

       

         isDirectory():判断它是否是一个目录,如果是目录,返回 true,如果是文件,返回 false

if (file.isDirectory()) { System.out.println("是目录"); } 

【3】文件与目录操作方法

        createNewFile()用来创建一个新文件,如果文件已经存在,这个方法会返回 false

try { if (file.createNewFile()) { System.out.println("文件创建成功"); } else { System.out.println("文件已存在"); } } catch (IOException e) { e.printStackTrace(); } 

        mkdir():创建一个目录。如果目录已存在,返回 false,如果成功创建,返回 true

File dir = new File("path/to/directory"); if (dir.mkdir()) { System.out.println("目录创建成功"); } 

【4】列出目录内容方法

        listFiles():返回一个 File 数组,包含目录下所有的文件和子目录,如果这个 File 对象代表的不是目录,返回 null

File dir = new File("path/to/directory"); File[] files = dir.listFiles(); if (files != null) { for (File f : files) { System.out.println(f.getName()); } } 

        这样我们就大致的了解了File中的常用方法了!!!

2.数据流类

        在 Java 中,处理文件和数据流的输入输出是非常常见的操作,为了让这些操作更加高效,Java 提供了字节流和字符流的不同方式,这些类分为 InputStream 和 OutputStream,以及 Reader 和 Writer,接下来让我们一一讲解一下:

        (1)InputStream 类

        InputStream 是所有字节输入流的超类,它负责从外部读取字节数据,你可以把它想象成一个“读取器”,它帮助你从磁盘文件、网络连接或者内存等地方读取数据。

常用方法:

        ——read():从输入流中读取一个字节并返回它,如果流的末尾已经到达,则返回 -1

InputStream inputStream = new FileInputStream("file.txt"); int byteData = inputStream.read(); while (byteData != -1) { System.out.print((char) byteData); // 转换为字符并输出 byteData = inputStream.read(); // 继续读取下一个字节 } inputStream.close(); // 别忘了关闭流 

        代码解释:这个例子逐个字节读取文件内容,直到到达文件末尾。我们将每个字节转换为字符并打印出来

        ——read(byte[] b):一次性读取多个字节到字节数组 b 中,返回实际读取的字节数,如果已经到达流的末尾,它返回 -1

byte[] buffer = new byte[1024]; int bytesRead = inputStream.read(buffer); System.out.println("读取了 " + bytesRead + " 个字节"); inputStream.close(); 

        代码解释:这个例子中我们使用read方法将数据读到了buffer这个数组中,并返回了读取到的字节数。

        ——read(byte[] b, int off, int len):从字节数组 boff 偏移量开始,最多读取 len 个字节,返回实际读取的字节数。

byte[] buffer = new byte[1024]; int bytesRead = inputStream.read(buffer, 0, 100); // 从数组开头读取 100 字节 inputStream.close(); 

        代码解释:和read(byte[] b)方法类似,只不过我们只读取了0到100字节而已

至此,我们就了解了InputStream类的常用方法了!!!

        (2)OutputStream 类

        与 InputStream 类相对应,OutputStream 负责将数据写入输出流,它可以用于文件、网络或内存等目标的写入。

常用方法:

        ——write(int b):将一个字节的数据写入输出流,需要注意,write() 方法接受的是一个 int 类型的参数,它会自动转换为字节。

OutputStream outputStream = new FileOutputStream("output.txt"); outputStream.write(65); // 写入字节 'A'(ASCII 码为 65) outputStream.close(); 

        代码解释:这个例子将字节 65 写入文件。

        ——write(byte[] b):将字节数组中的数据写入输出流。

byte[] data = "Hello".getBytes(); outputStream.write(data); outputStream.close(); 

        代码解释:我们将字符串 "Hello" 转换成字节数组,然后写入文件。

        ——write(byte[] b, int off, int len):从字节数组 boff 偏移量开始,最多写入 len 个字节。

byte[] data = "HelloWorld".getBytes(); outputStream.write(data, 0, 5); // 写入 "Hello" outputStream.close(); 

        代码解释:这段代码将 "HelloWorld" 字符串中的前 5 个字节写入文件

        ——flush():在某些情况下,写入的数据会被暂时保存在缓冲区中,直到缓冲区满了才会被写入,如果你需要强制将缓冲区中的数据立即写入目标,可以使用 flush()

outputStream.flush(); 

以上就是OutputStream 类的常见方法了!!!

        (3)Reader 类

        如果你要处理文本文件中的字符数据,Reader 类是一个非常方便的选择,它是所有字符输入流的超类,专门用来处理字符而不是字节。

常用方法:

        ——read():读取一个字符并返回它的 Unicode 值。如果已到文件末尾,返回 -1

Reader reader = new FileReader("file.txt"); int charData = reader.read(); while (charData != -1) { System.out.print((char) charData); // 转换为字符并输出 charData = reader.read(); // 继续读取下一个字符 } reader.close(); 

        代码解释:这个例子将逐字符读取文件内容,直到遇到文件的末尾。

        ——read(char[] cbuf):一次性读取多个字符并将它们存入字符数组 cbuf 中,返回实际读取的字符数。

char[] buffer = new char[1024]; int charsRead = reader.read(buffer); System.out.println("读取了 " + charsRead + " 个字符"); reader.close(); 

        代码解释:我们使用一个char数组来接收读取到的数据,并且read方法返回了读取到的个数

        ——read(char[] cbuf, int off, int len):从字符数组 cbufoff 偏移量开始,最多读取 len 个字符。

char[] buffer = new char[1024]; int charsRead = reader.read(buffer, 0, 100); // 从数组开头读取 100 个字符 reader.close(); 

        代码解释:我们使用了char数组来接收读取的数据,只读取了前100个字节

至此,我们就了解了Reader类的常用方法了!!!

        (4)Writer 类

        与 Reader 类相对应,Writer 类用于将字符数据写入目标输出流,它专门用于处理字符数据,避免了字节流处理文本时的编码问题。

常用方法:

        ——write(int c):将一个字符的 Unicode 值写入到输出流。

Writer writer = new FileWriter("output.txt"); writer.write(65); // 写入字符 'A' writer.close(); 

        代码解释:这段代码将字符 'A' 写入到文件中。

        ——write(char[] cbuf):将字符数组中的数据一次性写入输出流。

char[] data = "Hello".toCharArray(); writer.write(data); writer.close(); 

       代码解释:这里我们将字符串 "Hello" 转换为字符数组,然后写入文件

        ——write(char[] cbuf, int off, int len):从字符数组 cbufoff 偏移量开始,最多写入 len 个字符。

char[] data = "HelloWorld".toCharArray(); writer.write(data, 0, 5); // 写入 "Hello" writer.close(); 

         代码解释: 这段代码将 "HelloWorld" 字符串中的前 5 个字符写入文件

        ——flush():与字节流类似,Writer 类也有 flush() 方法,可以将缓冲区中的数据强制写入文件。

writer.flush(); 

以上就是Writer类的常见方法了!!!


以上就是本篇文章全部内容了

Read more

AI 编程工具选型:Copilot、Cursor、Codex 核心差异

AI 编程工具选型:Copilot、Cursor、Codex 核心差异

【如文章引起大家共鸣,请“点赞”以及“转发”,以支持继续创作,谢谢大家!】 朋友们大家好!今天咱们不聊那些虚头巴脑的,直接来点实在的——AI编程工具选型,Copilot、Cursor、Codex这仨到底咋选?别急,我这就用最接地气的方式,给你唠唠它们的“脾气秉性”,保证你听完就能上手挑! 先说Copilot,这哥们儿可是“代码补全界的扛把子”!它就像你身边的“代码小秘书”,你敲代码时,它就在旁边默默观察,你刚敲个“for”,它立马给你补上“(int i=0;i<n;i++)”,那叫一个快!而且,它还支持多IDE,VS Code、JetBrains啥的,都能无缝对接。不过呢,Copilot也有个“小毛病”,就是它更擅长“补全”,对于复杂的代码重构或者项目级理解,就有点力不从心了。

By Ne0inhk

Copilot代理与网络配置全攻略(突破访问限制的终极方法)

第一章:Copilot代理与网络配置全攻略(突破访问限制的终极方法) 在使用 GitHub Copilot 的过程中,开发者常因网络策略或区域限制无法正常激活服务。通过合理配置代理与网络环境,可有效绕过此类问题,确保代码补全功能稳定运行。 配置本地代理服务器 为确保 Copilot 能够连接至远程 API,建议在本地部署 HTTP 代理服务。以下是一个基于 Node.js 的简易代理示例: // proxy-server.js const http = require('http'); const net = require('net'); // 创建 HTTP 代理服务器 const server = http.createServer((req, res) => { // 允许跨域请求 res.setHeader(

By Ne0inhk

AI绘画报错

提示输出验证失败:CheckpointLoaderSimple: - 值不在列表中:ckpt_name: 'v1-5-pruned-emaonly-fp16.safetensors' 不在 ['anything-v5-PrtRE.safetensors'] 中 模型文件夹里面没模型 这是官方链接:v1-5-pruned-emaonly.safetensors https://huggingface.co/runwayml/stable-diffusion-v1-5/tree/main 点击同一行的小下载箭头。然后把文件放在:models/checkpoints文件夹里 你还需要标准的VAE文件,也就是:vae-ft-mse-840000-ema-pruned.safetensors https://huggingface.co/stabilityai/sd-vae-ft-mse-original/tree/main 这个文件放在:models/vae文件夹里 现在你已经拥有运行所需的一切了。慢慢来。你最初生成的图片会很糟糕。但是继续尝试,很快你就能得到很棒的结果。

By Ne0inhk

openMES开源制造执行系统完整指南:从零部署到生产监控全流程

openMES是一款基于ISA88和ISA95国际标准设计的开源制造执行系统,为中小企业提供数字化转型的完整解决方案。通过模块化架构和灵活配置,系统能够无缝对接离散制造与流程工业场景,实现生产过程透明化、智能化和高效化管理。 【免费下载链接】openMESA MES system designed based on ISA88&ISA95/一个参考ISA88&ISA95标准来设计的MES系统 项目地址: https://gitcode.com/gh_mirrors/op/openMES 🚀 openMES核心优势与价值解析 国际标准兼容性 openMES严格遵循ISA88(批量控制)和ISA95(企业与控制系统集成)标准,确保与ERP、SCADA等系统的互联互通。系统核心模块位于openmes-plugin-baseInformation,提供标准化的数据模型和接口定义。 模块化架构设计 系统采用高度模块化的设计理念,各功能模块独立部署、按需扩展: * 工厂建模:配置生产资源与工艺路线 * 生产计划:智能排程与任务分配 * 过程控制:实时监控生产状态 * 质量

By Ne0inhk