转换流
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cR0ummfV-1613780423964)(C:\Users\lcj\AppData\Roaming\Typora\typora-user-images\image-20210218110017045.png)]
package com.ioText.zhuanHuanLiu;
import java.io.*;
/*
java.io.OutputStreamWriter extends Writer
OutputStreamWriter; 是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。(编码:把把能看得懂的变成看不懂的)
继承自父类的共性成员方法:
void write(int c)写入单个字符。
void write(char[] cbuf)写入字符数组
abstract void write(char[] cbuf,int off,int len)写入字符数组的某一部分,off,数组开始索引,len 写的字符个数。
void write (String str)写入字符串
void write (String str,int off,int len)写入字符串的额一部分,off字符串开始索引,len写的字符个数
void write()刷新该流的缓冲
void close()关闭此流,但要先刷新
构造方法:
OutputStreamWriter(OutputStream out) 创建使用默认字符编码的 OutputStreamWriter。
OutputStreamWriter(OutputStream out, String charsetName)创建使用指定字符集的 OutputStreamWriter。
参数:
OutputStream out:字节输出流,可以用来写转换之后的字节到文件中
String charsetName:指定编码表名称,不区分大小写,可以是utf-8/UTF-8/gbk/GBK 不指定默认使用UTF-8
使用步骤:
1.创建OutputStreamWriter对象,构造方法中传递字节输出流和指定的编码表名称
2.使用OutputStreamWriter对象中的方法write,把字符转换为字节存储在缓冲区中(编码)
3.使用OutputStreamWriter对象中的方法flush,把内存缓冲区中的字节刷新到文件中(使用字节流写节的过程)
4.释放资源
*/
public class Demo01 {
public static void main(String[] args) throws IOException {
write_utf_8();
}
private static void write_utf_8() throws IOException {
//1.创建OutputStreamWriter对象,构造方法中传递字节输出流和指定的编码表名称
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("基础语法\\utf_8.txt"),"utjavf-8");
//2.使用OutputStreamWriter对象中的方法write,把字符转换为字节存储在缓冲区中(编码)
osw.write("你好");
//3.使用OutputStreamWriter对象中的方法flush,把内存缓冲区中的字节刷新到文件中(使用字节流写节的过程)
osw.flush();
//4.释放资源
osw.close();
}
}
package com.ioText.zhuanHuanLiu;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
/*
java.io.InputStreamReader extends Reader
InputStreamReader:是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。(看不懂的转换为看得懂的)
继承自父类的成员方法:
int read() 读取单个字符并返回
int read(char[] cbuf) 一次读取多个字符,将字符读入数组
void close()关闭资源并释放与之关联的所有资源
构造方法:
InputStreamReader(InputStream in) 创建一个使用默认字符集的 InputStreamReader。
InputStreamReader(InputStream in, String charsetName) 创建使用指定字符集的 InputStreamReader。
参数:
InputStream in:字节输入流:读取文件中保存的字节
String charsetName:指定编码表名称,不区分大小写,不指定默认使用utf-8
使用步骤:
1.创建InputStreamReader对象,构造方法中传递字节输入流和指定的编码表名称
2.使用InputStreamReader对象中的方法reader,读取文件
3.释放资源
注意事项:
构造方法指定的编码表名称要和我呢见的编码相同,否则会发生乱码
*/
public class Demo02 {
public static void main(String[] args) throws IOException {
reader_utf_8();
}
private static void reader_utf_8() throws IOException {
//1.创建InputStreamReader对象,构造方法中传递字节输入流和指定的编码表名称
InputStreamReader isr = new InputStreamReader(new FileInputStream("基础语法\\utf_8.txt"), "utf-8");
//2.使用InputStreamReader对象中的方法reader,读取文件
int len=0;
while((len= isr.read())!=-1){
System.out.print((char)len);
}
//3.释放资源
isr.close();
}
}
序列化与反序列化流
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XA0d7Iql-1613780423966)(C:\Users\lcj\AppData\Roaming\Typora\typora-user-images\image-20210218160531010.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oBTiJGVz-1613780423967)(C:\Users\lcj\AppData\Roaming\Typora\typora-user-images\image-20210218160604033.png)]
对象的序列化流
package com.ioText.xuLieHua;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
/*
java.io.ObjectOutputStream extends OutputStream
ObjectOutputStream:对象的序列化流
作用:把对象以流的方式写入到问价中保存
构造方法:
ObjectOutputStream(OutputStream out)创建写入指定 OutputStream 的 ObjectOutputStream。
参数:
OutputStream out:字节输出流
特有的成员方法:
writeObject(Object obj) 将指定的对象写入 ObjectOutputStream。
使用步骤:
1.创建ObjectOutputStream对象,构造方法中传递字节输出流
2.使用ObjectOutputStream对象中的方法writeObject,把对象写入文件中
3.释放资源
*/
/*
序列化和反序列化的时候会抛出NotSerializableException没有序列化异常
类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。
Serializable接口也叫标记型接口
要进行序列化和反序列化的类必须实现Serializable接口,就会给类添加一个标记
当我们进行序列化和反序列化的时候就会检测类上是否有这标记
有:可以序列化和反序列化
没有:就抛出NotSerializableException异常
*/
public class Demo01 {
public static void main(String[] args) throws IOException {
//1.创建ObjectOutputStream对象,构造方法中传递字节输出流
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("基础语法\\person.txt"));
//2.使用ObjectOutputStream对象中的方法writeObject,把对象写入文件中
oos.writeObject(new Person("小美女",18));
//3.释放资源
oos.close();
}
}
对象的反序列化流
package com.ioText.xuLieHua;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
/*
java.io.ObjectInputStream extends InputStream
ObjectInputStream:对象的反序列化流
作用:把文件中保存的对象,以流的方式读取出来
构造方法:
ObjectInputStream(InputStream in) 创建从指定 InputStream 读取的 ObjectInputStream。
参数:
InputStream in:字节输入流
特有的成员方法:
readObject()从 ObjectInputStream 读取对象。
使用步骤:
1.创建ObjectInputStream对象,构造方法中传递字节输入流
2.使用ObjectInputStream对象中的方法readerObject,读取保存对象的文件
3.释放资源
4.使用读取出来的对象(打印)
ClassNotFoundException(文件找不到异常)
当不存在对象的class文件时抛出异常
反序列化的前提:
1.类必须实现Serializable
2.必须存在类对应的class文件
*/
public class Demo02 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//1.创建ObjectInputStream对象,构造方法中传递字节输入流
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("基础语法\\person.txt"));
//2.使用ObjectInputStream对象中的方法readerObject,读取保存对象的文件
Object o = ois.readObject();
//3.释放资源
ois.close();
//4.使用读取出来的对象(打印)
System.out.println(o);
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fFyOf9Wb-1613780423971)(C:\Users\lcj\AppData\Roaming\Typora\typora-user-images\image-20210218165850516.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nzyLd4Pm-1613780423973)(C:\Users\lcj\AppData\Roaming\Typora\typora-user-images\image-20210218170012685.png)]
序列练习
package com.ioText.xuLieHua;
import java.io.*;
import java.util.ArrayList;
/*
练习:序列化集合
当我们想在文件中保存多个对象的时候
可以把多个对象存储在一个集合中
对集合进行序列化和反序列化
分析:
1.定义一个存储Person对象的ArrayList集合
2.往ArrayList集合存储Person对象
3.创建一个序列化流ObjectOutputStream对象
4.使用ObjectOutputStream对象中的方法writeObject,对集合进行序列化
5.创建一个反序列化ObjectInputStream对象
6.使用ObjectInputStream对象中的方法readObject读取文件中保存的集合
7.把Object类型的集合转换为ArrayList类型
8.遍历ArrayList集合
9释放资源
*/
public class Text {
public static void main(String[] args) throws IOException, ClassNotFoundException {
ArrayList<Person> list=new ArrayList<>();
list.add(new Person("张三",18));
list.add(new Person("李四",19));
list.add(new Person("王五",20));
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("基础语法\\text.txt"));
oos.writeObject(list);
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("基础语法\\text.txt"));
Object object = ois.readObject();
ArrayList<Person> list1=(ArrayList)object;
for (Person person : list1) {
System.out.println(person);
}
ois.close();
oos.close();
}
}
打印流
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LtwGFo1y-1613780423974)(C:\Users\lcj\AppData\Roaming\Typora\typora-user-images\image-20210218184412827.png)]
package com.ioText.daYinLiu;
import java.io.FileNotFoundException;
import java.io.PrintStream;
/*
java.io.printStream:打印流
PrintStream 为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。
PrintStream特点:
1.只负责数据的输出,不负责数据的读取
2.与其他输出流不同,PrintStream 永远不会抛出 IOException
3.有特有的方法print println
void print(输出任意的值)
void println(输出任意的值并换行)
构造方法:
PrintStream(File file) 创建具有指定文件且不带自动行刷新的新打印流。 //输出的目的地是一个文件
PrintStream(OutputStream out) 创建新的打印流。 //输出的目的地是一个字节输出流
PrintStream(String fileName) 创建具有指定文件名称且不带自动行刷新的新打印流。 //输出的目的地是一个文件路径
PrintStream extends OutputStream
继承自父类的成员方法:
-public void close():关闭此输出流并释放与此相关联的任何资源
-public void flush():刷新此输出流并强制任何缓冲的输出字节被写入
-public void write(byte[] b):将b.length字节从指定的字节数组写入此输出流
-public void write(byte[] b,int off,int len):从指定字节数组len字节,从偏移量off开始输出到此输出流
-public abstract void write(byte[] b)从指定的字节输出流
注意:
如果使用继承自父类的write方法写数据,那么查看数据的时候会查询编码表97->a
如果使用自己特有的方法print/println方法写数据,写的数据鸳鸯输出97->97
*/
public class Demo01 {
public static void main(String[] args) throws FileNotFoundException {
//创建打印流PrintStream对象,构造方法中绑定要输出的目的地
PrintStream ps = new PrintStream("基础语法\\print.txt");//抛出文件找不到异常
ps.write(97);
ps.println(97);
ps.close();
}
}