蜂信物联FastBee平台https://gitee.com/beecue/fastbee
阿里资料开源项目https://gitee.com/vip204888
百度低代码前端框架https://gitee.com/baidu/amis
OpenHarmony开源项目https://gitcode.com/openharmony
仓颉编程语言开放项目https://gitcode.com/Cangjie
//写入数据到文件
fos.write("hello".getBytes());
} catch (IOException e) {
e.printStackTrace();
} finally {
//判断fos是否为null
if(fos != null) {
//异常处理
try {
//释放资源
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
读数据:一次读一个字节数据、一次读一个字节数组数据
**字节输入流:FileInputStream(String name)**通过打开与实际文件的连接来创建一个FileInputStream,该文件由文件系统中的路径名name命名
字节输入流读取数据的步骤:
-
创建字节输入流对象
-
调用字节输入流对象的读数据方法
-
释放资源
一次读一个字节数组的方法:
-
public int read(byte[] b):从输入流读取最多b.length个字节的数据
-
返回的是读入缓冲区的总字节数,也就是实际的读取字节个数
字节流读数据案例:
public class FileInputStreamDemo {
public static void main(String[] args) throws IOException {
//创建字节输入流对象
//myByteStream\fos.txt表示要读取的文件(相对路径)
FileInputStream fis = new FileInputStream(“myByteStream\fos.txt”);
//一次读一个字节数据
int by;
while ((by=fis.read())!=-1) {
System.out.print((char)by);
}
//一次读一个字节数组数据
byte[] bys = new byte[1024]; //1024及其整数倍
int len;
while ((len=fis.read(bys))!=-1) {
System.out.print(new String(bys,0,len));
}
//释放资源
fis.close();
}
}
字节流图解:
字节缓冲流:
-
**BufferOutputStream:**该类实现缓冲输出流。 通过设置这样的输出流,应用程序可以向底层输出流写入字节,而不必为写入的每个字节导致底层系统的调用
-
**BufferedInputStream:**创建BufferedInputStream将创建一个内部缓冲区数组。 当从流中读取或跳过字节时,内部缓冲区将根据需要从所包含的输入流中重新填充,一次很多字节
构造方法:
| 方法名 | 说明 |
| — | — |
| BufferedOutputStream(OutputStream out) | 创建字节缓冲输出流对象 |
| BufferedInputStream(InputStream in) | 创建字节缓冲输入流对象 |
字节缓冲流读写数据案例:
public class BufferStreamDemo {
public static void main(String[] args) throws IOException {
//字节缓冲输出流:BufferedOutputStream(OutputStream out)
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(“myByteStream\bos.txt”));
//写数据
bos.write(“hello\r\n”.getBytes());
bos.write(“world\r\n”.getBytes());
//释放资源
bos.close();
//字节缓冲输入流:BufferedInputStream(InputStream in)
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(“myByteStream\bos.txt”));
//一次读取一个字节数据
int by;
while ((by=bis.read())!=-1) {
System.out.print((char)by);
}
//一次读取一个字节数组数据
byte[] bys = new byte[1024];
int len;
while ((len=bis.read(bys))!=-1) {
System.out.print(new String(bys,0,len));
}
//释放资源
bis.close();
}
}
字符流、字符缓冲流
抽象基类:
-
Reader:字符输入流的抽象类
-
Writer:字符输出流的抽象类
字符流中的编码解码:
-
InputStreamReader:是从字节流到字符流的桥梁。它读取字节,并使用指定的编码将其解码为字符,它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集
-
OutputStreamWriter:是从字符流到字节流的桥梁。使用指定的编码将写入的字符编码为字节,它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集
构造方法:
| 方法名 | 说明 |
| — | — |
| InputStreamReader(InputStream in) | 使用默认字符编码创建InputStreamReader对象 |
| InputStreamReader(InputStream in,String chatset) | 使用指定的字符编码创建InputStreamReader对象 |
| OutputStreamWriter(OutputStream out) | 使用默认字符编码创建OutputStreamWriter对象 |
| OutputStreamWriter(OutputStream out,String charset) | 使用指定的字符编码创建OutputStreamWriter对象 |
写数据的五种方式、刷新和关闭 :
| 方法名 | 说明 |
| — | — |
| void write(int c) | 写一个字符 |
| void write(char[] cbuf) | 写入一个字符数组 |
| void write(char[] cbuf, int off, int len) | 写入字符数组的一部分 |
| void write(String str) | 写一个字符串 |
| void write(String str, int off, int len) | 写一个字符串的一部分 |
| 刷新和关闭 |
| flush() | 刷新流,之后还可以继续写数据 |
| close() | 关闭流,释放资源,但是在关闭之前会先刷新流。一旦关闭,就不能再写数据 |
读数据的两种方式:
| 方法名 | 说明 |
| — | — |
| int read() | 一次读一个字符数据 |
| int read(char[] cbuf) | 一次读一个字符数组数据 |
PS:字符流写数据可直接根据方法实现,字符流读数据和字节流读数据的代码大同小异 (基本一样),可参考上述代码自行实现。
字符流图解:
字符缓冲流:
-
BufferedWriter:将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入,可以指定缓冲区大小,或者可以接受默认大小。默认值足够大,可用于大多数用途
-
BufferedReader:从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取,可以指定缓冲区大小,或者可以使用默认大小。 默认值足够大,可用于大多数用途
构造方法:
| 方法名 | 说明 |
| — | — |
| BufferedWriter(Writer out) | 创建字符缓冲输出流对象 |
| BufferedReader(Reader in) | 创建字符缓冲输入流对象 |
特有功能:
| 方法名 | 说明 |
| — | — |
| void newLine() | 写一行行分隔符,行分隔符字符串由系统属性定义 |
| String readLine() | 读一行文字。 结果包含行的内容的字符串,不包括任何行终止字符如果流的结尾已经到达,则为null |
字符缓冲流读写数据案例:使用特有功能
public class BufferedStreamDemo {
public static void main(String[] args) throws IOException {
//创建字符缓冲输出流
BufferedWriter bw = new BufferedWriter(new FileWriter(“myCharStream\bw.txt”));
//写数据
for (int i = 0; i < 10; i++) {
bw.write(“hello” + i);
bw.newLine(); //换行
bw.flush(); //刷新
}
//释放资源
bw.close();
//创建字符缓冲输入流
BufferedReader br = new BufferedReader(new FileReader(“myCharStream\bw.txt”));
//读数据
String line;
while ((line=br.readLine())!=null) {
System.out.println(line);
}
//释放资源
br.close();
}
}
特殊操作流
标准输入输出流:
-
System类中有两个静态的成员变量
-
**public static final InputStream in:标准输入流。**通常该流对应于键盘输入或由主机环境或用户指定的另一个输入源
-
**public static final PrintStream out:标准输出流。**通常该流对应于显示输出或由主机环境或用户指定的另一个输出目标
-
输出语句的本质:是一个标准的输出流
-
PrintStream ps = System.out;
-
PrintStream类有的方法,System.out都可以使用
打印流特点:
-
只负责输出数据,不负责读取数据
-
永远不会抛出IOException
-
有自己的特有方法
**分类:**字节打印流 (PrintStream);字符打印流 (PrintWriter)
字节打印流:
-
PrintStream(String fileName):使用指定的文件名创建新的打印流
-
使用继承父类的方法写数据,查看的时候会转码;使用自己的特有方法写数据,查看的数据原样输出
-
可以改变输出语句的目的地,public static void setOut(PrintStream out):重新分配“标准”输出流
字符打印流构造方法:
| 方法名 | 说明 |
| — | — |
| PrintWriter(String fileName) | 使用指定的文件名创建一个新的PrintWriter,而不需要自动执行刷新 |
| PrintWriter(Writer out, boolean autoFlush) | 创建一个新的PrintWriter out:字符输出流 autoFlush: 一个布尔值,如果为真,则println , printf ,或format方法将刷新输出缓冲区 |
对象序列化概述:
-
对象序列化:就是将对象保存到磁盘中,或者在网络中传输对象
-
这种机制就是使用一个字节序列表示一个对象,该字节序列包含:对象的类型、对象的数据和对象中存储的属性等信息
-
字节序列写到文件之后,相当于文件中持久保存了一个对象的信息
-
反之,该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化
**对象序列化流 (ObjectOutputStream):**将Java对象的原始数据类型和图形写入OutputStream。 可以使用ObjectInputStream读取(重构)对象。 可以通过使用流的文件来实现对象的持久存储。 如果流是网络套接字流,则可以在另一个主机上或另一个进程中重构对象
构造方法:ObjectOutputStream(OutputStream out):创建一个写入指定的OutputStream的ObjectOutputStream
序列化对象的方法:void writeObject(Object obj):将指定的对象写入ObjectOutputStream
注意事项:
-
一个对象要想被序列化,该对象所属的类必须实现Serializable接口
-
Serializable是一个标记接口,实现该接口,不需要重写任何方法
**对象反序列化流 (ObjectInputStream):**ObjectInputStream反序列化先前使用ObjectOutputStream编写的原始数据和对象
**构造方法:ObjectInputStream(InputStream in):**创建从指定的InputStream读取的ObjectInputStream
**反序列化对象的方法:Object readObject():**从ObjectInputStream读取一个对象
关于序列化ID (serialVersionUID)出现的问题及解决方式:
用对象序列化流序列化了一个对象后,假如我们修改了对象所属的类文件,读取数据会抛出InvalidClassException异常,如何解决?
- 重新序列化
- 给对象所属的类加一个serialVersionUID
- private static final long serialVersionUID = 42L;
一个对象中的某个成员变量的值不想被序列化,该如何实现?
- 给该成员变量加transient关键字修饰,该关键字标记的成员变量不参与序列化过程
Properties集合
概述:
-
是一个Map体系的集合类
-
Properties可以保存到流中或从流中加载
-
属性列表中的每个键及其对应的值都是一个字符串
特有方法:
| 方法名 | 说明 |
| — | — |
| Object setProperty(String key, String value) | 设置集合的键和值,都是String类型,底层调用 Hashtable方法 put |
| String getProperty(String key) | 使用此属性列表中指定的键搜索属性 |
| Set stringPropertyNames() | 从该属性列表中返回一个不可修改的键集,其中键及其对应的值是字符串 |
Properties和IO流相结合的方法:
| 方法名 | 说明 |
| — | — |
| void load(InputStream inStream) | 从输入字节流读取属性列表(键和元素对) |
| void load(Reader reader) | 从输入字符流读取属性列表(键和元素对) |
| void store(OutputStream out, String comments) | 将此属性列表(键和元素对)写入此 Properties表中,以适合于使用 load(InputStream)方法的格式写入输出字节流 |
| void store(Writer writer, String comments) | 将此属性列表(键和元素对)写入此 Properties表中,以适合使用 load(Reader)方法的格式写入输出字符流 |
总结
本期关于Java中文件IO流知识点的总结就到这里了,可以发现该部分的知识点又多又杂,出现了大量的构造方法以及部分特有的方法,很容易造成知识点的记忆混乱,但是只要善于总结观察,多运用多思考,就会发现其中的知识并不复杂也很好掌握。为了能够把本期的知识点掌握的更加牢固,下期小编用本期学到的知识点给大家介绍一个有趣的小游戏程序,期待你的关注~
最后
每年转战互联网行业的人很多,说白了也是冲着高薪去的,不管你是即将步入这个行业还是想转行,学习是必不可少的。作为一个Java开发,学习成了日常生活的一部分,不学习你就会被这个行业淘汰,这也是这个行业残酷的现实。
如果你对Java感兴趣,想要转行改变自己,那就要趁着机遇行动起来。或许,这份限量版的Java零基础宝典能够对你有所帮助。
元素对) |
| void load(Reader reader) | 从输入字符流读取属性列表(键和元素对) |
| void store(OutputStream out, String comments) | 将此属性列表(键和元素对)写入此 Properties表中,以适合于使用 load(InputStream)方法的格式写入输出字节流 |
| void store(Writer writer, String comments) | 将此属性列表(键和元素对)写入此 Properties表中,以适合使用 load(Reader)方法的格式写入输出字符流 |
总结
本期关于Java中文件IO流知识点的总结就到这里了,可以发现该部分的知识点又多又杂,出现了大量的构造方法以及部分特有的方法,很容易造成知识点的记忆混乱,但是只要善于总结观察,多运用多思考,就会发现其中的知识并不复杂也很好掌握。为了能够把本期的知识点掌握的更加牢固,下期小编用本期学到的知识点给大家介绍一个有趣的小游戏程序,期待你的关注~
最后
每年转战互联网行业的人很多,说白了也是冲着高薪去的,不管你是即将步入这个行业还是想转行,学习是必不可少的。作为一个Java开发,学习成了日常生活的一部分,不学习你就会被这个行业淘汰,这也是这个行业残酷的现实。
如果你对Java感兴趣,想要转行改变自己,那就要趁着机遇行动起来。或许,这份限量版的Java零基础宝典能够对你有所帮助。
[外链图片转存中…(img-Ock4ontq-1725174032688)]