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