Java文件操作(超详细+代码示例)

article/2025/9/23 21:13:48

Java文件操作

      • 一、Java.io包
          • 1.1 File类
          • 1.2 Stream流(字节流)
            • 1.2.1 使用FileInputStream类
            • 1.2.2 使用FileOutputStream类
            • 1.2.3 小总结
          • 1.3 Stream流(字符流)
            • 1.3.1 FileWriter类 与 BufferedWriter类使用
            • 1.3.2 FileReader类 与 BufferedReader类使用
      • 二、序列化与反序列化
          • 2.1 FileOutputStream类 以及 ObjectOutputStream类的使用
          • 2.1 FileInputStream类 以及 ObjectInputStream类的使用
  • 三、彩蛋

2020 最新更新:
Java IO 系列内容

我们日常使用电脑的时候,基本都会和文件打交道,比如我们做ppt,或者写论文的时候,我们打开的word,ppt等等都是一个文件,这些文件不一样的主要是因为后缀名不一样,所以计算机才可以分辨出来这些文件的区别。

文件一般都存放在硬盘中,在上世纪还会存储在光驱还有软盘等等

一、Java.io包

  • 现在大家看到 “i/o” 想必也不会陌生了吧,这是Java中一个内置的包,专门用于文件读写的一个操作的类
  • 在程序中使用 文件或者的操作就要导入import java.io.*;
1.1 File类
  • File类可以表示一个文件,还可以表示一个目录(Directory),所以我们可以在程序中用File 类的对象可以表示一个文件 或者 目录
  • 当创建了 File 对象之后,我们可以利用该对象来对文件或者目录进行书属性修改:例如:文件的名称,修改日期的日期等等
  • File 类的对象 还不能直接对文件进行读写操作,只能修改文件的属性

File类 示例:

import java.io.*;public class FileDemo {public static void main(String[] args) {File f1=new File("src\\aa.txt");//相对路径,如果没有前面的src,就在当前目录创建文件if(f1.exists()) {System.out.println("文件已经存在");}else {try {f1.createNewFile();System.out.println("文件创建成功");} catch (Exception e) {// TODO: handle exception}}System.out.println("文件已经存在:"+f1.exists());System.out.println("文件的名字:"+f1.getName());System.out.println("文件的路径:"+f1.getPath());System.out.println("文件的绝对路径:"+f1.getAbsolutePath());System.out.println("是目录吗:"+f1.isDirectory());System.out.println("文件大小:"+f1.length());}
}

在这里插入图片描述
Tips:这里我运行了两次,一开始文件是不存在的,所以程序会进入else,完成创建这个文件的操作,上面的图片我截图是第二次运行的情况

1.2 Stream流(字节流)

流是指一连串流动的数据信号,通过FiFO(先进先出) 的方式接收和发送数据

  • 数据流又分为输入流输出流
  • 输入输出流又分为字节流字符流
  1. 字节流:以字节为基本单位 , 在 java.io包中,大部分操作继承InputStream(输入字节流)类和OutputStream(输出字节流)类
  2. 字符流:两个字节为基本单位,专门处理字符串和文本,对于字符流进行操作的类主要是Reader(读取流)类和 Writer(写入流)类。
1.2.1 使用FileInputStream类
  • 继承于InputStream类,这是一个文件输入流,进行文件读操作的最基本的类
  • 作用是将文件中的数据输入到内存中,我们可以用它来读文件操作
  • 由于字节流的缘故,因此无法读取中文字符

我们现在之前创建的aa.txt文件中加入如下的一句话
在这里插入图片描述
示例代码:

import java.io.*;public class FileStreamDemo {public static void main(String[] args) {try {File file=new File("src\\aa.txt");FileInputStream f1=new FileInputStream(file);//这里需要进行抛出异常处理for (int i = 0; i < file.length(); i++) {char ch=(char)(f1.read());//循环读取字符System.out.print(ch+" ");}System.out.println();//换行操作f1.close();//关闭文件} catch (Exception e) {// TODO: handle exceptionSystem.out.println("文件打开失败");}}
}

在这里插入图片描述
这里我在文件中的感叹号打的是中文的字符,所以字节流是无法读取的

这里我们使用了一个新的知识点,try catch的一个异常捕获的知识点,这样操作的好处,即使报错了,程序也可以正常的运行下去,并显示报错信息

1.2.2 使用FileOutputStream类
  • FileOutputStream类称为文件输出流,继承于OutputStream类,是文件的基本读写的一个类
  • 它的作用和上面读文件恰恰相反,将内存中的数据输出到文件中,所以我们可以用这个类来进行写文件的操作

我们先按aa,txt文件的内容清空,然后实现下边的代码进行写操作
代码示例:

import java.io.*;public class FileOuputDemo {public static void main(String[] args) throws FileNotFoundException {File file=new File("src\\aa.txt");FileOutputStream f1=new FileOutputStream(file);//(file,true),这里有true的话,代表可以在文件后面追加内容String str="I love coding";byte[] buff=str.getBytes();//将字符串转换为字节数组try {f1.write(buff);//把字节数组的内容写进去文件} catch (Exception e) {// TODO: handle exception}finally {try {f1.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
}

在这里插入图片描述

1.2.3 小总结
  • FileInputStream类 和 FileOutputStream类总是成对出现的,一个用作输入流,另一个自然是输出流
  • 我们在输入流中使用 byte(字节)数组 来存储我们的数据,因此我们不必考虑数据格式,所以说这两种操作的效率会比较高
1.3 Stream流(字符流)

字符串的读取,以及解决中文字符无法读入的问题

1.3.1 FileWriter类 与 BufferedWriter类使用

问题描述:

前面我们FileInputStream时,使用的是字节流,但是有个问题无法解决,它只能读取英文字符,而中文字符是无法读取的,会出现奇怪的东西。

这个操作就可以直接读入字符串了
示例:

import java.io.*;public class FileWriterDemo {public static void main(String[] args) {String[] str= {"春眠不觉晓,","处处闻啼鸟,","夜来风雨声,","花落知多少,"};File file=new File("src\\cc.txt");//我们在该类的位置创建一个新文件FileWriter f=null;//创建文件写入对象BufferedWriter f1=null;//创建字符流写入对象try {//这里把文件写入对象和字符流写入对象分开写了f=new FileWriter("src\\cc.txt");//创建一个名为cc.txt的文件f1=new BufferedWriter(f);//通过循环遍历上面的String 数组中的元素for (int i = 0; i < str.length; i++) {f1.write(str[i]);//把String中的字符写入文件f1.newLine();//换行操作}} catch (Exception e) {// TODO: handle exception}finally {//如果没有catch 异常,程序最终会执行到这里try {f1.close();f.close();//关闭文件} catch (Exception e2) {// TODO: handle exception}}}
}

在这里插入图片描述
反思与总结:

这段代码我在调试的过程中,犯下了一个致命的错误,就是文件关闭的先后的顺序,我们应该先关闭输入流,然后再关闭文件,我之前是先关闭文件,导致写进去的内容还没保存就关掉了。这里一定要注意!!!

1.3.2 FileReader类 与 BufferedReader类使用

读取上面写入文件的数据

import java.io.*;public class FileReaderDemo {public static void main(String[] args) {File file=new File("src\\cc.txt");FileReader f=null;//文件读取对象BufferedReader f1=null;//字符流对象try {f=new FileReader(file);f1=new BufferedReader(f);//循环打印cc文件中的每行数据String str=null;while((str=f1.readLine())!=null) {System.out.println(str);}} catch (Exception e) {// TODO: handle exception}finally {try {f1.close();f.close();} catch (Exception e2) {// TODO: handle exception}}}
}

运行结果:
在这里插入图片描述

二、序列化与反序列化

简化成一句话、序列化是把Java对象存在一个硬盘,网络,以便传输
也就是把我们的数据永久的存放到计算机当中

2.1 FileOutputStream类 以及 ObjectOutputStream类的使用

这也成为序列化的操作

将你的数据存入计算机中
示例:

import java.io.*;
import java.util.*;/*** 序列化操作* */
public class Xl {public static void main(String[] args) {//数据完成持久化的操作List<String> list=new ArrayList<String>();list.add("aaa");list.add("bbb");list.add("ccc");FileOutputStream f1=null;ObjectOutputStream f2=null;try {//第一行省略了前面的 File file = new File(~)的操作,直接创建一个文件f1=new FileOutputStream(new File("src\\dd.txt"));f2=new ObjectOutputStream(f1);f2.writeObject(list);} catch (Exception e) {// TODO: handle exception}finally {try {f2.close();f1.close();} catch (Exception e2) {// TODO: handle exception}}}

我们来看看我们写入的数据
在这里插入图片描述
虽然我们看不懂,但是计算机看得懂呀

2.1 FileInputStream类 以及 ObjectInputStream类的使用

反序列化

import java.io.*;
import java.util.*;//反序列化操作
public class FXL {public static void main(String[] args) {FileInputStream f=null;ObjectInputStream f1=null;List list=null;try {f=new FileInputStream("src\\dd.txt");//对应我们前面往输入dd.txt 文件的内容f1=new ObjectInputStream(f);list=(List<String>)f1.readObject();} catch (Exception e) {// TODO: handle exception}finally {try {f1.close();f.close();} catch (Exception e2) {// TODO: handle exception}}//这种方法就不必循环打印数据了,可以一步到位System.out.println(list);}
}

在这里插入图片描述
如果我们读入的是字符流数据,在反序列化的操作,我们需要实现Serializable 接口,如下代码所示

import java.io.*;
import java.util.*;/*** 2:将三个学生对象序列化进去,在取出来(参考一下txt里面的做法)*	对象需要实现Serializable* */
public class Work2 implements Serializable{public static void main(String[] args) {Student stu[]=new Student[3];FileOutputStream f1=null;ObjectOutputStream f2=null;//初始化三个学生的数据stu[0]=new Student("小明",18,"男");stu[1]=new Student("小白",19,"女");stu[2]=new Student("小张",20,"男");//学生信息的序列化try {f1=new FileOutputStream("Student.txt");f2=new ObjectOutputStream(f1);for (int i = 0; i < stu.length; i++) {f2.writeObject(stu[i]);}} catch (Exception e) {// TODO: handle exception}finally {try {f2.close();f1.close();} catch (Exception e2) {// TODO: handle exception}}//学生信息的取出(反序列化)FileInputStream f3=null;ObjectInputStream f4=null;List<Object> list1=null;try {f3=new FileInputStream("Student.txt");f4=new ObjectInputStream(f3);System.out.println("学生的姓名\t年龄\t性别\t");for (int i = 0; i < stu.length; i++) {System.out.println(stu[i].getStudentName()+"\t"+stu[i].getAge()+"\t"+stu[i].getGender());}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}finally {try {f4.close();f3.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
}

在这里插入图片描述

三、彩蛋

  • 是不是感觉意犹未尽
  • 没有找到你想要的答案
  • 那就试试看这篇文章 —— 系统学习 Java io

这篇文章是我在疫情期间,把 Java SE,EE 的知识体系构建出来了,欢迎大家来指正
Java IO 系列内容 (最全内容)


http://chatgpt.dhexx.cn/article/gc8McNMJ.shtml

相关文章

二、八大数据类型

在Java中有八种基本数据类型来存储数值、字符和布尔值&#xff1a; 2.1 整数型 整数型有byte(字节)、short(短整型)、int(整型)、long(长整型)四种。&#xff08;说明&#xff1a;可使用L或l后缀来声明长整型数值&#xff09; 以0开始的数值被解释为8进制数值&#xff1b;以…

Java 八大基本数据类型简述

java 的基本数据类型关系图 1、取值范围 类型默认值占用存储空间/字节范围byte01-127~128(-2的7次方到2的7次方-1)short02-32768~32767(-2的15次方到2的15次方-1)int04-2147483648~2147483647(-2的31次方到2的31次方-1)long08-9223372036854774808~9223372036854774807(-2的63次…

Java基础(一) 八大基本数据类型

自从Java发布以来&#xff0c;基本数据类型就是Java语言的一部分&#xff0c;分别是***byte, short, int, long, char, float, double, boolean***. 其中&#xff1a; 整型&#xff1a;byte, short, int, long 字符型&#xff1a;char 浮点型&#xff1a;float, double 布…

Java 中的八大基本数据类型、类型转换

目录 1. ♥常见的数据类型 2. ♥引用数据类型 3. ♥类型转换 4. ♥数值提升 5. ♥int 和 String 之间的相互转换 1. 基本数据类型 八大基本数据类型&#xff1a; 整型&#xff1a;byte、short、int、long浮点型&#xff1a;double&#xff08;双精度浮点型&#xff09;、…

Java基础:Java八大基本数据类型

一、背景。 这篇文章主要介绍了Java八大数据类型详细教程,本文通过图文并茂的形式给大家介绍的非常详细&#xff0c;对大家的学习或工作具有一定的参考借鉴价值&#xff0c;需要的朋友可以参考下。放假在家里休息&#xff0c;闲来无事&#xff0c;想巩固巩固自己的基础知识。J…

Java八大基本数据类型

前言&#xff1a;做一下笔记。 1.Java基本数据类型图 2.Java基本数据类型 整数类型&#xff1a;byte&#xff0c;1字节&#xff0c;8位&#xff0c;最大存储数据量是255&#xff0c;存放的数据范围是-128~127之间。整数类型&#xff1a;short&#xff0c;2字节&#xff0c;16…

好用网站推荐

说明 整理一下常用的网站&#xff0c;其中包括学习、素材、教学视频、一些优秀的论坛等网站&#xff0c;并推荐给大家大家按需获取 首先推荐一些非常好的网站&#xff0c;网站百度就能搜到&#xff1a;知乎&#xff0c;轻单&#xff0c;果壳&#xff0c;花瓣&#xff0c;电子发…

c++好用的网站

目录 洛谷www.luogu.com.cn 有道小图灵https://oj.youdao.com/csp 维基https://oi-wiki.org/ 信奥赛一本通http://ybt.ssoier.cn:8088/index.php 1&#xff0c;洛谷 他的网址是www.luogu.com.cn。 这是一个好用的刷题网站&#xff0c;题库里有大约有2000多道题。 洛谷有题…

有哪些好用的搜索引擎网站推荐?

分享一些私藏已久的搜索引擎&#xff0c;个个都十分强大&#xff0c;一起来看看吧&#xff01; 01.秘迹搜索 这是一款无敌有良心、无敌安全的搜索引擎&#xff0c;不会收集私人信息&#xff0c;保护私隐&#xff0c;没有Cookie&#xff0c;并且秘迹搜索聚合了百度、360、Bing…

分享一些冷门好用的网站和软件

分享一&#xff1a;UZER UZER是一个功能强大的云端应用空间&#xff0c;可以帮助您将所有的文件和应用程序都集中在一个地方&#xff0c;让您随时随地轻松访问。 以下是它的主要特点&#xff1a; 云存储&#xff1a;UZER提供大量的云存储空间&#xff0c;让您可以安全地存储…

网站分享:7个非常好用的电子书网站

❤️作者主页&#xff1a;IT技术分享社区 ❤️作者简介&#xff1a;大家好,我是IT技术分享社区的博主&#xff0c;从事C#、Java开发九年&#xff0c;对数据库、 C#、 Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉&#xff1a; 数据库领域优质创作者&#x1f3c6;&…

推荐几个好用的网站导航

1、爱达杂货铺 里面包含很多网站的导航&#xff0c;是我感觉我用过最好的导航网站了&#xff08;里面的网站有些是访问不了的&#xff09; 2、不求人影视导航 该网站里面有各种影视网站的地址集合&#xff0c;还有动漫、美剧。。。。。 3、龙轩导航 界面简洁&#xff0c;集合…

收藏的一些好用的网站

一、PPT模板 网址&#xff1a;https://pptmon.com/ PPTMON - Free PowerPoint Templates and Google Slides Themes 是一个提供 PowerPoint 模板和图标素材下载的网站。该网站上有大量的 PowerPoint 模板&#xff0c;可供用户根据自己的需要进行选择和下载。此外&#xff0c;该…

别找了!前端那些好用的网站都在这里了!【文末送书】

&#x1f340;前言 好用的网站千千万万&#xff0c;如果你还发现好用的网站&#xff0c;欢迎在评论区中留言分享&#x1f601;&#xff0c;赠书活动在文末哟&#xff0c;中奖者可以从给出的五本书中任意挑选自己喜欢的那本 文章目录 &#x1f340;前言 &#x1f340;一、渐变…

值得推荐好用的网址导航网站大全

一个好用的网址导航网站&#xff0c;可以帮助我们快速发现找到一些优质的网站。小编就和大家分享几个值得推荐的网站导航网。 1.办公人导航 办公人导航是一个特别适合职场办公人使用的网址导航网站&#xff0c;收录了办公人常用的在线工具&#xff0c;软件下载&#xff0c;ppt…

推荐几个很好很好用的网站

1. MSDN 这是非官方性质的微软网站&#xff0c;但是它无广告&#xff0c;提供了很多的微软资源&#xff0c;却是相当的良心。如果要安装操作系统、office、VS、Visio等都可以从这个网站上进行下载。 2. 高清图片 该网站提供很多高清壁纸&#xff0c;风格清新&#xff0c;艺术风…

这些好用的网站,你千万别错过

目录 一、网站导航 二、在线代码截图 三、 图片无损压缩 四、图片无损放大 五、 临时邮箱 六、长链接转短链接 七、免费在线作图 八、在线PS 九、pdf文档操作 十、在线代码运行工具 十一、免费在线压缩 十二、在线视频剪辑 十三、在线音频剪辑 一、网站导航 国外网址&#xff…

强烈推荐非常好用的网站

常用网站推荐 学习算法 网址&#xff1a;[算法学习]:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html 目前&#xff0c;有以下数据结构和算法的可视化效果: 基本知识递归索引排序堆的数据结构图算法动态规划几何算法 在线画图 网址&#xff1a;[画图]: h…

这几款好用冷门的网站推荐给你

网站一&#xff1a;adobeedu导航 adobeedu导航是一个设计师必备的网站&#xff0c;它提供了大量的设计工具、素材和教程资源&#xff0c;帮助用户快速学习和提升设计技能。以下是该网站的主要特点&#xff1a; 工具&#xff1a;adobeedu导航提供了大量的设计工具&#xff0c;…

介绍几款好用的网站给你

网站一&#xff1a;addog addog是一款在线广告管理平台&#xff0c;主要为广告主和代理商提供广告投放、优化和管理的一站式解决方案。该网站支持多种广告形式&#xff0c;包括横幅广告、原生广告、视频广告等。 使用addog&#xff0c;广告主可以轻松地创建和发布广告活动&am…