news 2026/9/11 18:08:25

文件io(Java版)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
文件io(Java版)

文章目录

  • 1. 文件操作和IO
    • 1.1java中操作文件
    • 1.2文件内容的读写--数据流
      • InputStream
      • OutputStream
      • Reader
      • Writer
    • 2.练习 对普通文件进行复制

1. 文件操作和IO

1.1java中操作文件

Java中通过java.io.File类来对一个文件(包括目录)进行抽象的描述,有File对象,并不代表真实存在该文件(比如在获取文件名称时,不要求文件必须存在)

1.2文件内容的读写–数据流

java中的流分为字节流和字符流
1.字节流,以字节为单位,适用于二进制文件
抽象类:输入流InputStream
输出流OutputStream
实现类:输入流FileinputStream
输出流FileoutputStream
2.字符流,以字符为单位,适用于文本文件
抽象类:输入流Reader
输出流Writer
实现类:输入流FileReader
输出流FileWriter
输入输出的视角是CPU

InputStream

这几个方法都大同小异,只详细说明一个
方法:1.read()返回值类型int,读取一个字节的数据,返回-1表示已经完全读完了
2.read(byte[] b )返回值类型int,最多读取b.length字节的数据到b中,返回实际读到的数量,-1代表已经读完了
3.read(byte[]b,int off,int len)最多读取len-off字节的数据到b中,放在从off开始,返回实际读到的数量,-1代表已经读完了
4.close()返回值void,关闭字节流
InputStream只是个抽象类,要使用还需要具体的实现类,关于InputStream的实现类还有很多,基本可以认为不同的输入设备都可以对应一个InputStream类,我们只关心从文件中读取,所以使用FileInputStream

OutputStream

与InputStream相比,多了一个flush()方法,返回值是void
强调flush()方法
我们知道 I/O 的速度是很慢的,所以,大多的 OutputStream 为了减少设备操作的次数,在写数据的时候都会将数据先暂时写入内存的一个指定区域里,直到该区域满了或者其他指定条件时才真正将数据写入设备中,这个区域一般称为缓冲区。但造成一个结果,就是我们写的数据,很可能会遗留一部分在缓冲区中。需要在最后或者合适的位置,调用 flush(刷新)操作,将数据刷到设备中。(后面练习代码中展示)
强烈建议在代码中手动调用flush方法后再关闭流

Reader

publicclassFileoi{publicstaticvoidmain(String[]args)throwsIOException{Readerreader=newFileReader("d:/text.txt");/*Reader类是抽象类,只能new子类,标准库已经提供了现成的类了, 创建Reader对象的过程,就是"打开文件"的过程*/while(true){char[]cbuf=newchar[3];intn=reader.read(cbuf);//一次读取若干个字符,把参数指定的cbuf字符填满/*当int n =reader.read() 为什么是返回的int类型,因为返回的是0-65535范围的数,正好是无符号char能表示的范围 这里正好是两个字节范围,但如果是utf8编码,一个中文对应三个字节那该怎么办呢 是因为字符规定是unicode编码(一个中文对应两个字节),变成string类型才大概率是utf8(可配置,也可能不是)*/if(n==-1){//文件读完了,用-1表示break;}System.out.println("n="+n);for(inti=0;i<n;i++){System.out.print(cbuf[i]);}}reader.close();//当上面逻辑有异常时,执行不到}}

上述代码,当上面逻辑有异常时,close执行不到会导致资源泄露,所以用try语句改进一下

try(Readerreader=newFileReader("d:/text.txt")){/*try with resources,这个语法就是()里面定义的变量 在try代码块结束时会自动执行close方法,但是()里面的对象要实现closeable接口*/while(true){char[]cbuf=newchar[3];intn=reader.read(cbuf);//一次读取若干个字符,把参数指定的cbuf字符填满if(n==-1){break;}System.out.println("n="+n);for(inti=0;i<n;i++){System.out.print(cbuf[i]);}}}

Writer

2.练习 对普通文件进行复制

  1. ⽤户输⼊源⽂件的路径
  2. 检查源⽂件是否存在,并且是⼀个⽂件
  3. ⽤户输⼊⽬标⽂件的路径
  4. 检查⽬标⽂件是否存在,并校验⽬录或⽂件
  5. 完成复制
publicclassDemo_15_CopyFile{publicstaticvoidmain(String[]args){// 接收源⽂件路径System.out.println("请输⼊源⽂件的路径(绝对路径):");Scannerscanner=newScanner(System.in);StringsourcePath=scanner.next();// 根据源⽂件路径创建⽂件对象FilesourceFile=newFile(sourcePath);// 判断⽂件是否存在if(!sourceFile.exists()){System.out.println("源⽂件:"+sourcePath+",不存在.请重新输 ⼊.");return;}// 是否⽬录if(!sourceFile.isFile()){System.out.println("源⽂件:"+sourcePath+",不是⼀个有效⽂件, 不能复制.");return;}// 接收⽤户输⼊的⽬标⽂件路径System.out.println("请输⼊⽬标⽂件的路径(绝对路径):");StringdestPath=scanner.next();FiledestFile=newFile(destPath);// 判断⽬标路径是否存在if(destFile.exists()){if(destFile.isDirectory()){System.out.println("⽬标⽂件: "+destPath+",是⼀个⽬录,请重新输⼊.");return;}if(destFile.isFile()){System.out.println("⽬标⽂件: "+destPath+",已经存在,请 重新输⼊.");return;}}// 判断路径是否有效if(!destFile.getParentFile().exists()){System.out.println("⽬标路径⽆效.");return;}// 开始复制⽂件, 读取源⽂件并写⼊新⽂件try(InputStreamsourceStream=newFileInputStream(sourceFile);OutputStreamoutputStream=newFileOutputStream(destFile)){// 创建⼀个数组接收⽂件内容byte[]bytes=newbyte[1024];// 循环读取while(true){//intlen=sourceStream.read(bytes);if(len==-1){break;}// 写⼊⽬标⽂件outputStream.write(bytes,0,len);// 刷新缓冲区outputStream.flush();}}catch(FileNotFoundExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}System.out.println("复制完成.");}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/11 2:42:55

资深工程师亲授:行为树调试与优化的6步黄金流程

第一章&#xff1a;行为树的优化在复杂的游戏AI或自动化系统中&#xff0c;行为树&#xff08;Behavior Tree&#xff09;作为决策核心组件&#xff0c;其执行效率直接影响整体性能。随着节点数量增加和逻辑嵌套加深&#xff0c;未优化的行为树可能导致严重的性能瓶颈。因此&am…

作者头像 李华
网站建设 2026/9/10 21:55:28

最近在工控项目里折腾了一把信捷XD5 PLC和台达DT330温控器的通讯,整个过程就像玩解谜游戏——接线、调参数、写程序环环相扣。直接上干货,先看核心通讯程序

信捷XD PLC与台达DT330温控器通讯程序输出启停控制(XJXD-1)功能&#xff1a;通过信捷XD5&#xff0c;实现对台达DT330温控器 设定温度&#xff0c;读取温度&#xff0c;控制温控器输出启停&#xff0c;反应灵敏&#xff0c;通讯稳定可靠。 程序采用轮询方式器件&#xff1a;信捷…

作者头像 李华
网站建设 2026/9/11 4:24:25

dify 创建gitlab账号

目录 1、环境: 2、获取gitlab访问令牌 3、dify安装[JSON 处理]插件 ​4、dify创建工作流应用 5、dify详细配置 6、校验 1、环境 dify版本Version 1.5.1 gitlab版本号:gitlab企业版16.10 完成配置的工作流截图。 工作流导出的DSL:创建gitlab账号demo.yml 链接: https…

作者头像 李华
网站建设 2026/9/11 8:38:38

Carsim Simulink联合仿真-基于LQR/模糊PID/滑模控制的横摆稳定性控制系统

Carsim Simulink联合仿真-基于LQR/模糊PID/滑模控制的横摆稳定性控制系统 综合跟随理想横摆角速度的方法和抑制汽车质心侧偏角的汽车稳定性控制方法&#xff0c;以线性二自由度车辆操纵特性模型为控制目标&#xff0c;基于汽车横摆力矩与车辆状态偏差之间的动力学关系建立了控制…

作者头像 李华
网站建设 2026/9/11 9:17:15

原型链查找的 O(N) 开销:在超长继承链下属性访问的性能损耗实验

各位同仁&#xff0c;各位技术爱好者&#xff0c;大家好&#xff01;今天&#xff0c;我们将深入探讨一个在JavaScript编程中看似基础&#xff0c;实则蕴含深刻性能考量的话题&#xff1a;原型链查找的O(N)开销&#xff0c;以及它在超长继承链下对属性访问性能可能造成的损耗。…

作者头像 李华
网站建设 2026/9/11 10:30:37

计及需求响应的区域综合能源系统双层优化调度策略 参考文档:计及需求响应的区域综合能源系统双层优...

计及需求响应的区域综合能源系统双层优化调度策略参考文档&#xff1a;计及需求响应的区域综合能源系统双层优化调度策略 matlabyalmipcplex 主要内容&#xff1a;需求响应聚合商通过需求响应聚合用户的可转移负荷和可削减负荷&#xff0c;提高区域综合能源系统运行的灵活性和经…

作者头像 李华