Java IO 核心总结:File 类、字节流与字符流详解

发布时间:2026/10/4 1:56:07

Java IO 核心总结:File 类、字节流与字符流详解 在 Java 开发中文件操作和 IO 流是非常基础且重要的内容。无论是读取配置文件、保存日志还是实现文件上传下载都离不开 IO 操作。本文从实战角度出发系统总结File类的常见用法字节流InputStream/OutputStream的用法字符流Reader/Writer的用法字节流与字符流的区别与选择资源管理与综合示例一、File 类文件与目录的抽象java.io.File是 Java 对文件系统中文件包括目录的抽象描述。注意创建一个File对象并不代表该文件在磁盘上真实存在。它只是路径的抽象表示。1. 构造方法构造方法说明File(String pathname)根据路径字符串创建 File 对象可以是绝对路径或相对路径File(File parent, String child)根据父目录 File 对象和子路径创建File(String parent, String child)根据父目录路径字符串和子路径创建示例Filefile1newFile(hello.txt);Filefile2newFile(D:\\test,hello.txt);FileparentnewFile(D:\\test);Filefile3newFile(parent,hello.txt);2. 路径相关方法FilefilenewFile(..\\hello-world.txt);System.out.println(file.getParent());// ..\System.out.println(file.getName());// hello-world.txtSystem.out.println(file.getPath());// ..\hello-world.txtSystem.out.println(file.getAbsolutePath());// 绝对路径System.out.println(file.getCanonicalPath());// 修饰后的绝对路径会解析 . 和 ..3. 文件与目录操作方法说明exists()判断文件或目录是否真实存在isDirectory()判断是否为目录isFile()判断是否为普通文件createNewFile()创建普通文件已存在返回 falsedelete()删除文件或空目录deleteOnExit()程序退出时删除文件mkdir()创建单级目录父目录不存在会失败mkdirs()创建多级目录父目录不存在会一并创建renameTo(File dest)重命名或移动文件listFiles()返回目录下的子文件和子目录示例创建、删除文件FilefilenewFile(test.txt);System.out.println(file.exists());// falseSystem.out.println(file.createNewFile());// trueSystem.out.println(file.exists());// trueSystem.out.println(file.delete());// trueSystem.out.println(file.exists());// false示例创建目录FiledirnewFile(some-parent\\some-dir);// mkdir() 如果父目录不存在会失败System.out.println(dir.mkdir());// false// mkdirs() 可以创建多级目录System.out.println(dir.mkdirs());// true二、IO 流的分类在 Java 中IO 流按照处理数据的单位分为两类字节流Byte Stream以字节8位为单位读写适合处理图片、音频、视频等二进制文件。输入流InputStream输出流OutputStream字符流Character Stream以字符16位为单位读写专门用于处理文本文件会自动处理字符集编码。输入流Reader输出流Writer注意字符流本质上还是基于字节流实现的只是加了一层编码/解码的包装。三、字节流InputStream / OutputStream1. InputStream字节输入流InputStream是字节输入流的抽象类最常用的子类是FileInputStream。方法说明int read()读取一个字节返回 -1 表示读取完毕int read(byte[] b)最多读取b.length个字节返回实际读取数量-1 表示读完void close()关闭流推荐方式使用缓冲区读取try(InputStreamisnewFileInputStream(hello.txt)){byte[]bufnewbyte[1024];intlen;while((lenis.read(buf))!-1){// buf 的 [0, len) 是本次读取到的数据System.out.write(buf,0,len);}}2. OutputStream字节输出流OutputStream是字节输出流的抽象类最常用的子类是FileOutputStream。方法说明void write(int b)写入一个字节void write(byte[] b)写入整个字节数组void write(byte[] b, int off, int len)写入字节数组的指定范围void flush()刷新缓冲区强制将数据写入目标void close()关闭流写入示例try(OutputStreamosnewFileOutputStream(output.txt)){Strings你好中国;byte[]bs.getBytes(UTF-8);os.write(b);os.flush();// 不要忘记 flush}四、字符流Reader / Writer重点补充字符流专门用于处理文本数据它能自动处理字符集编码避免字节流读取中文时的乱码问题。1. Reader字符输入流Reader是字符输入流的抽象类常用子类有FileReader、BufferedReader。方法说明int read()读取一个字符返回 -1 表示读完int read(char[] cbuf)最多读取cbuf.length个字符返回实际读取数void close()关闭流基础用法FileReadertry(ReaderreadernewFileReader(hello.txt)){intch;while((chreader.read())!-1){System.out.print((char)ch);}}高效用法BufferedReader支持按行读取BufferedReader提供了readLine()方法可以一次读取一行文本非常适合处理文本文件。try(BufferedReaderreadernewBufferedReader(newFileReader(hello.txt))){Stringline;while((linereader.readLine())!null){System.out.println(line);}}注意FileReader使用系统默认字符集如果文件编码与系统默认不一致可能会出现乱码。此时应使用InputStreamReader手动指定编码。2. Writer字符输出流Writer是字符输出流的抽象类常用子类有FileWriter、BufferedWriter。方法说明void write(int c)写入一个字符void write(char[] cbuf)写入字符数组void write(String str)写入字符串void flush()刷新缓冲区void close()关闭流基础用法FileWritertry(WriterwriternewFileWriter(output.txt)){writer.write(你好世界\n);writer.write(Hello, World\n);writer.flush();}高效用法BufferedWriter支持换行try(BufferedWriterwriternewBufferedWriter(newFileWriter(output.txt))){writer.write(我是第一行);writer.newLine();// 换行writer.write(我是第二行);writer.flush();}3. 转换流InputStreamReader / OutputStreamWriter转换流是字节流和字符流之间的桥梁可以指定字符集编码解决乱码问题。读取时指定编码try(BufferedReaderreadernewBufferedReader(newInputStreamReader(newFileInputStream(hello.txt),UTF-8))){Stringline;while((linereader.readLine())!null){System.out.println(line);}}写入时指定编码try(BufferedWriterwriternewBufferedWriter(newOutputStreamWriter(newFileOutputStream(output.txt),UTF-8))){writer.write(你好世界);writer.flush();}五、字节流 vs 字符流如何选择维度字节流字符流处理单位字节8位字符16位适用场景图片、音频、视频、压缩包等二进制文件文本文件txt、java、html 等编码处理需要手动处理编码自动处理编码或通过转换流指定核心抽象类InputStream/OutputStreamReader/Writer常见子类FileInputStream/FileOutputStreamFileReader/FileWriter、BufferedReader/BufferedWriter性能优化使用byte[]缓冲区使用char[]缓冲区或BufferedReader选择原则如果是二进制文件图片、音视频等必须使用字节流。如果是文本文件优先使用字符流尤其是BufferedReader/BufferedWriter避免乱码并提高效率。如果文本文件编码特殊如 UTF-8 而系统默认 GBK必须使用转换流指定编码。六、资源管理try-with-resourcesIO 资源非常宝贵使用完毕后必须关闭。Java 7 提供了try-with-resources语法只要资源实现了AutoCloseable接口就能自动关闭。标准写法try(InputStreamisnewFileInputStream(source.txt);OutputStreamosnewFileOutputStream(dest.txt)){byte[]bufnewbyte[1024];intlen;while((lenis.read(buf))!-1){os.write(buf,0,len);}os.flush();}catch(IOExceptione){e.printStackTrace();}七、综合示例文件复制字节流 vs 字符流1. 使用字节流复制任意文件推荐publicclassFileCopyDemo{publicstaticvoidmain(String[]args){FilesourcenewFile(source.jpg);FiledestnewFile(dest.jpg);try(InputStreamisnewFileInputStream(source);OutputStreamosnewFileOutputStream(dest)){byte[]bufnewbyte[1024];intlen;while((lenis.read(buf))!-1){os.write(buf,0,len);}os.flush();System.out.println(复制完成);}catch(IOExceptione){e.printStackTrace();}}}2. 使用字符流复制文本文件publicclassTextCopyDemo{publicstaticvoidmain(String[]args){try(BufferedReaderreadernewBufferedReader(newInputStreamReader(newFileInputStream(source.txt),UTF-8));BufferedWriterwriternewBufferedWriter(newOutputStreamWriter(newFileOutputStream(dest.txt),UTF-8))){Stringline;while((linereader.readLine())!null){writer.write(line);writer.newLine();}writer.flush();System.out.println(文本复制完成);}catch(IOExceptione){e.printStackTrace();}}}八、总结类别核心类用途关键点文件抽象File描述文件或目录元信息对象存在不代表文件真实存在字节输入InputStream读取字节数据read()返回 -1 表示读完字节输出OutputStream写入字节数据write()写入flush()刷新字符输入Reader读取字符数据BufferedReader.readLine()按行读取字符输出Writer写入字符数据BufferedWriter.newLine()换行转换流InputStreamReader/OutputStreamWriter字节流转字符流可指定字符集解决乱码资源管理try-with-resources自动关闭流避免资源泄漏掌握File、字节流、字符流的基本用法是 Java 文件编程的基础。实际开发中操作文件元信息使用File读写二进制文件使用InputStream/OutputStream读写文本文件使用Reader/Writer优先选择BufferedReader/BufferedWriter编码不一致时使用转换流指定字符集始终使用try-with-resources管理资源不要忘记flush()和close()。
延伸阅读

更多相关文章

2026/10/4 1:51:07

Windows 11恢复IE11全攻略:兼容模式、文件提取与风险边界

很多人可能觉得,2023年还在折腾IE11是一件很魔幻的事情。但如果你在国企、银行、医院、学校这类环境里做过运维,或者家里有长辈需要登录某些老旧的政务系统,你就会明白——不是我们不想用现代浏览器,而是有些网站从骨子里只认IE&a…

2026/10/4 5:31:17

PyInstaller打包Scrapy报OSError解决方案

1. 这不是PyInstaller的锅,是Scrapy和Python运行时机制在“打架”你打包Scrapy项目时突然弹出OSError: could not get source code,第一反应可能是“PyInstaller又抽风了”,但真相往往更微妙——这根本不是打包工具的问题,而是Scr…

2026/10/4 5:31:17

QGC视频流二次开发实战:从GStreamer管线到黑屏排查

做 QGC 二次开发,十个需求里至少一半要碰视频流。不是要接机载摄像头,就是要在地面站上显示自定义图传画面,要么就是嫌默认的 UDP 拉流不够稳想换 RTSP。视频流这个模块,恰恰是 QGC 源码里最绕的一块:一头连着飞控端的…

2026/10/4 5:31:17

FastCFS v5.2.0分布式文件系统集群部署与性能调优实战

简介:FastCFS v5.2.0是一款面向大规模数据存储场景的开源分布式文件系统源码包,适合分布式系统开发者、云计算平台运维人员及存储方向毕业设计学生研读,可解决高并发访问、数据一致性及节点故障自动恢复等核心问题。压缩包共270个文件&#x…

2026/10/4 5:31:17

轻量自托管AI网关GPT-Load 2.0:统一管理API Key与订阅账号实战

这几年做 AI 应用集成的朋友,应该都有过类似的体验:业务代码没写几行,先被一堆 Key 的配置搞得怀疑人生。我在同时维护十几把 API Key、两三个团队订阅账号之后,终于花时间把这一摊事彻底理清了——核心方案就是自己部署一个轻量自…

2026/10/4 0:01:02

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/4 0:01:02

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/4 1:01:05

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 0:01:02

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/4 0:01:02

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/4 1:01:05

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑