Java文件操作(超详细+代码示例)
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(先进先出) 的方式接收和发送数据
- 数据流又分为输入流和输出流
- 输入输出流又分为字节流和字符流
- 字节流:以字节为基本单位 , 在 java.io包中,大部分操作继承InputStream(输入字节流)类和OutputStream(输出字节流)类
- 字符流:两个字节为基本单位,专门处理字符串和文本,对于字符流进行操作的类主要是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 系列内容 (最全内容)
Java文件操作(超详细+代码示例)相关推荐
- Java时间类型转换详细代码示例
Java时间类型转换详细代码示例 一.时间类型转换代码示例 二.时间标准简介 1.UTC(世界标准时间) 2.GMT(格林尼治平时) 3.CST(北京时间) 三.SimpleDateFormat 参数 ...
- JAVA 正则表达式 (超详细,转)
转 JAVA 正则表达式 (超详细,转) 2015年03月25日 10:27:57 阅读数:1514 在Sun的Java JDK 1.40版本中,Java自带了支持正则表达式的包,本文就抛砖引玉地介绍 ...
- Java文件操作源码大全
Java文件操作源码大全 1.创建文件夹 5 2.创建文件 5 3.删除文件 5 4.删除文件夹 6 5.删除一个文件下夹所有的文件夹 7 6.清空文件夹 8 7.读取文件 8 8.写入文件 9 9. ...
- mask rcnn 超详细代码解读(一)
mask r-cnn 代码解读(一) 文章目录 1 代码架构 2 model.py 的结构 3 train过程代码解析 3.1 Resnet Graph 3.2 Region Proposal Net ...
- 单片机c语言全程图文教程,单片机C语言,从小白到菜鸟进阶教程(超详细代码解读)...
首先要认识单片机是啥?单片机语言是啥?单片机是一种可存储可读写可编程可运行的芯片,你写啥它就运行啥,运行出错,那你程序写错了.单片机语言,嗯!确定要学C啊!有哪一种语言能够抗衡C的强大地位?没有!哪一 ...
- 【Java文件操作(八)】将控制台输出重定向到txt文件
我的博客--Java文件操作系列 [Java文件操作(一)]递归打印文件目录 [Java文件操作(二)]删除文件夹,但保留其内部文件 [Java文件操作(三)]递归复制文件夹内所有文件 [Java文件 ...
- 【Java文件操作(七)】序列化:将自定义类写入文件
我的博客--Java文件操作系列 [Java文件操作(一)]递归打印文件目录 [Java文件操作(二)]删除文件夹,但保留其内部文件 [Java文件操作(三)]递归复制文件夹内所有文件 [Java文件 ...
- 【Java文件操作(六)】借助内存复制图片:ByteArrayOutputStream\ByteArrayInputStream\FileOutputStream\FileInputStream辨析
我的博客--Java文件操作系列 [Java文件操作(一)]递归打印文件目录 [Java文件操作(二)]删除文件夹,但保留其内部文件 [Java文件操作(三)]递归复制文件夹内所有文件 [Java文件 ...
- 【Java文件操作(五)】从txt文件中读取字符串、乱码原因
我的博客--Java文件操作系列 [Java文件操作(一)]递归打印文件目录 [Java文件操作(二)]删除文件夹,但保留其内部文件 [Java文件操作(三)]递归复制文件夹内所有文件 [Java文件 ...
最新文章
- linux中sudo如何读取标准输入作为密码,避免每次都输入密码?
- macos关闭软件更新小红点_MacOS和Windows哪个更适合你?
- 深入理解Delete(JavaScript)
- STL学习系列一:STL(标准模板库)理论基础
- javaScript设计模式之常用工厂模式
- 设计模式笔记二十五:访问者模式
- java 线程间的通讯(升级版)
- 最新(2019)斯坦福CS224n深度学习自然语言处理课程(视频+笔记+2017年合集)
- AB=C型向量分解思路思考
- error: ‘VPX_IMG_FMT_RGB32’ undeclared (first use in this function); did you mean ‘VPX_IMG_FMT_NV12’?
- 程序员必备:变量命名神器 CODELF
- 智慧CAD手机精准看图隐私
- strtok用法详解
- freeswitch实战六(呼叫转移)
- PS轻松打造低多边形风格图像
- 适用于数据中心和边缘应用的液冷技术
- python求主析取范式_求公式q→(r∧p)的析取范式。
- vmware 架设网站无法打开解决办法
- LaTeX目录居中及目录字体设置
- bilibili 镜像