Java中的IO流 - 入门篇
前言
大家好啊,我是汤圆,今天给大家带来的是《Java中的IO流-入门篇》,希望对大家有帮助,谢谢
由于Java的IO类有很多,这就导致我刚开始学的时候,感觉很乱,每次用到都是上网搜,结果每次用完就忘;
后来沉下心去看书学习,才明白都是有规律的;
这里先做个简单的介绍,作为入门级教程,后面还有很多要学习的,有空再整理吧。
简介
文件IO流,主要有两种方式
-
字节流:基于普通的Java对象,仅适用于Java程序之间的读写
-
字符流:基于普通的文本字符串,不仅适用于Java程序之间的读写,也适用于Java程序和其他语言程序之间的读写
本例中用到的相关类如下:
所有的读写操作都是针对内存而言的,因为程序就是运行在内存中
读操作就是从磁盘文件或网络流读到内存,对于内存而言就是Input
写操作就是从内存写到磁盘文件或网络流,对于内存而言就是Output
下面分别介绍这两种方式
字节流:基于普通的Java对象
字节流的读和写都是基于Java程序而言,比如在一个机器上的Java程序写入一个对象到文件,然后传输到另一个机器上的Java程序去读取文件中的对象
写入Java对象时,会先将Java对象序列化(对象转为字节),然后写入
读取Java对象时,会先将Java对象反序列化(字节转为对象),然后读取
写对象
将对象写入到文件中,需要先把对象 ad8 序列化,然后再把序列化后的字节写入到文件中;
序列化就是将对象的属性信息转为一系列字节(不包括transient 类型的属性,下面会介绍)
大概流程如下所示:
读对象
将对象从文件中读出来,需要先反序列化,然后再转为对应的Java对象,并恢复对象属性值
反序列化就是将一系列字节转为真实的对象实例(不包括transient类型的属性)
大概流程如下所示:
transient
该修饰符 字面意思是瞬时的,短暂的
用在对象的属性上,就表示这个属性是暂时有效的,等序列化的时候会失效
在反序列化的时候,这个属性就会为null(如果属性是对象引用)或基础类型的默认值(如果属性是基础类型)
比如密码等比较隐私的属性,我们就可以设置为
transient,这样就不会在传输过程中被被人拦截,从而破解出密码
代码
public class ObjectIoDemo {
public static void main(String[] args) throws IOException, ClassNotFoundException {
InnerObject object1 = new InnerObject(10);
String filename = "object.bin";
writeObjectFun(filename, object1);
InnerObject objectReturn = (InnerObject) readObjectFun(filename);
System.out.println(objectReturn);
}
// 写对象 到指定文件
public static void writeObjectFun(String filename, Object o) throws IOException {
FileOutputStream fileOutputStream = new FileOutputStream(filename);
ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
objectOutputStream.writeObject(o);
// 关闭流,fileOutputStream会一并关闭
objectOutputStream.close();
}
// 读对象 从指定文件
public static Object readObjectFun(String filename) throws IOException, ClassNotFoundException {
FileInputStream fileInputStream = new FileInputStream(filename);
ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
Object o = objectInputStream.readObject();
// 关闭流,fileInputStream会一并关闭
objectInputStream.close();
return o;
}
}
class InnerObject implements Serializable{
@Override
public String toString() {
return "InnerObject{" +
"num=" + num +
'}';
}
public InnerObject(int num) {
this.num = num;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
private int num;
}
如果要写入的Java对象没有序列化,则会报错如下
Exception in thread "main" java.io.NotSerializableException: com.jalon.basic.io.InnerObject
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
at com.jalon.basic.io.ObjectIoDemo.writeObjectFun(ObjectIoDemo.java:28)
at com.jalon.basic.io.ObjectIoDemo.main(ObjectIoDemo.java:19)
字符流:基于普通文本字符串
字符流写入到文件中的数据,是作为通用文本数据来处理的,这样Java程序和其他程序都可以去读写这个文件
写文本
大致流程如下:
读文本
大致流程如下:
BufferedReader和BufferedWriter的作用
为什么要用缓冲区呢?直接用FileReader和FileWriter不也可以吗?
如果直接用
FileWriter和
FileReader是可以运行,只不过效率会比较低,因为每一次的读写都是针对磁盘操作的;
而
BufferedWriter和
BufferedReader这两个缓冲区可以减少磁盘的读写次数;
BufferedReader:程序可以从磁盘一次性读很多数据到缓冲区,再从缓冲区一次次读,等缓冲区为空时再去磁盘读;
BufferedWriter:程序可以写多次到缓冲区,等缓存区满了再一次性写入到磁盘中
代码
public class TextIoDemo {
public static void main(String[] args) throws IOException {
String filename = "string.txt";
writeString(filename, "hello world");
String res = readString(filename);
System.out.println(res);
}
// 写字符串到指定文件
public static void writeString(String filename, String content) throws IOException {
FileWriter fileWriter = new FileWriter(filename);
BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
bufferedWriter.write(content);
bufferedWriter.close();
}
// 从指定文件读取字符串
public static String readString(String filename) throws IOException {
FileReader fileReader = new FileReader(filename);
BufferedReader bufferedReader = new BufferedReader(fileReader);
String line = "";
StringBuilder stringBuilder = new StringBuilder();
while ((line=bufferedReader.readLine())!=null){
stringBuilder.append(line);
}
bufferedReader.close();
return stringBuilder.toString();
}
}
总结
IO流分为字节流和字符流
如果读写两边都是Java程序,则推荐用字节流,序列化和反序列化很方便
如果一边是Java程序,另一边是其他语言的程序,则推荐用字符流,读写的内容都是文本格式,方便解析
上面只是列出了个别读写类,Java中读写类还有很多,大家感兴趣的可以去java.io下查看
参考
-
《H 564 ead First Java》(第二版)
-
《Java 核心技术卷一》(第十版)
-
《Java 编程思想》(第四版)
后记
最后,感谢大家的观看,谢谢
- Java入门之IO流
- java 从零开始,学习笔记之基础入门<IO流>(十八)
- java入门IO流--FileOutputStream&&FlieInputStream
- 黑马程序员_java入门_IO流
- 基础入门:关于JavaIO流学习总结
- java IO文件操作简单基础入门例子,IO流其实没那么难
- Java-io流入门到精通详细总结
- java学会这些,我就入门啦!(基础篇五)流与IO流
- java程序员菜鸟入门之五IO流
- 黑马程序员_java入门_IO流_3(字符流缓冲区)
- Java入门之IO流(输入流和输出流)
- JAVA的IO流入门
- 17、Java入门—Java IO流之字符流
- Java零基础入门系列09--文件&IO流[参考正文顶部目录]
- 14、Java入门—Java IO流之File类的使用
- 黑马程序员_java入门_IO流_5(文件概述)
- java IO文件操作简单基础入门例子,IO流其实没那么难
- Java入门之IO流
- Java中的IO流,入门
- 18、Java入门—Java IO流之对象的序列化和反序列化