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

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 exception

System.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 block

e.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 list=new ArrayList();

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.*;

读者福利

秋招我借这份PDF的复习思路,收获美团,小米,京东等Java岗offer

更多笔记分享

秋招我借这份PDF的复习思路,收获美团,小米,京东等Java岗offer

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.*;

读者福利

[外链图片转存中…(img-nB1vGetB-1721141057953)]

更多笔记分享

[外链图片转存中…(img-R2xbQG2n-1721141057954)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值