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

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

//反序列化操作

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)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

}

}

最后

2020年在匆匆忙忙慌慌乱乱中就这么度过了,我们迎来了新一年,互联网的发展如此之快,技术日新月异,更新迭代成为了这个时代的代名词,坚持下来的技术体系会越来越健壮,JVM作为如今是跳槽大厂必备的技能,如果你还没掌握,更别提之后更新的新技术了。

更多JVM面试整理:

ream(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

}

}

最后

2020年在匆匆忙忙慌慌乱乱中就这么度过了,我们迎来了新一年,互联网的发展如此之快,技术日新月异,更新迭代成为了这个时代的代名词,坚持下来的技术体系会越来越健壮,JVM作为如今是跳槽大厂必备的技能,如果你还没掌握,更别提之后更新的新技术了。

[外链图片转存中…(img-uOpmLfYK-1714374098640)]

更多JVM面试整理:

[外链图片转存中…(img-p4k0450q-1714374098642)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值