1.字节输出流

输出流:

OutputStream(抽象类)
FileOutputStream(基本输出流)
构造方法:
public FileOutputStream(String name):创建输出流操作的目标
public FileOutputStream(String name,boolean append)append为true代表每次写入都向文件末尾追加,为false则每次都是覆盖写入
操作方法:
write(int n):输出一个字节;
write(byte[] b):输出一个字节数组;
write(byte[] b, int off , int len):输出字节数组的一部分;
close(): 释放IO占用的windows底层资源;

public void write(byte[] b) 写出一个字节数组的字节

  • 输出流的源代码实现:如果输出时没有该文件,则会先创建该文件,再输出数据
  • 默认的写出是覆盖掉了文件以前的内容,如果想每次运行程序写出数据不覆盖之前的内容,使用特定的构造方法
  • public FileOutputStream(String name,boolean append) append参数:是否追加数据

  • 在FileOutputStream的构造方法当中,指定的io资源可以是文件对象,也可以是文件路径,其本质是相同的.
  • 一般情况下直接使用给予文件路径的方式创建IO流对象,因为源代码中会自动帮助我们创建File对象. ```java package com.igeek_01;

import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.HashSet; import java.util.Set;

/**

  • @author Lynn
  • @create 2020-12-11-10:20 / public class FileOutPutStreamDemo { /public static void main(String[] args) throws IOException {

    1. //创建流对象,绑定io数据
    2. FileOutputStream fos=new FileOutputStream("test.txt");
    3. //向文件中写入数据

    // fos.write(0b01100001);//当前输入的是一个a的二进制字节码 // fos.write(98);

    1. fos.write('a');
    2. //关闭流
    3. fos.close();

    }*/

    /*public static void main(String[] args) throws IOException {

    1. //创建一个流对象
    2. FileOutputStream fos=new FileOutputStream("test.txt",true);//支持追加
    3. //写入数据
    4. byte[] b={97,98,99};
    5. fos.write(b);
    6. //int类型的数组不支持,因为方法的参数中只传入byte类型的数组
    7. *//*int[] i={100,101,102};
    8. fos.write(i);*//*
    9. fos.close();

    }*/ } ```

    字节输入流

    输入流:

    InputStream(抽象类):
    FileInputStream(基本输入流)
    构造方法:
    public FileInputStream(String name)
    操作方法:
    int read():读取一个字节, 返回的是字节内容本身,读取到末尾返回-1
    int read(byte[] b):读取一个字节数组
    close():释放IO占用的系统底层资源 ```java package com.igeek_02;

import java.io.FileInputStream; import java.io.IOException;

/**

  • @author Lynn
  • @create 2020-12-11-10:34 */ public class InputStreamDemo { public static void main(String[] args) throws IOException {

    1. //创建文件输入流--保证文件必须存在
    2. FileInputStream fis=new FileInputStream("test.txt");
    3. /*//读取
    4. int c= fis.read();
    5. System.out.println(c);//97
    6. System.out.println(Integer.toBinaryString(c));//1100001--97的二进制换算*/
    7. /*//逐个读取--底层有一个指针,进行逐个读取
    8. System.out.println(fis.read());//97
    9. System.out.println(fis.read());//97
    10. System.out.println(fis.read());//98
    11. System.out.println(fis.read());//99
    12. System.out.println(fis.read());//-1---读完了,没有了*/
    13. //循环读取
    14. int c=-1;//没有内容可读
    15. while ((c= fis.read())!=-1){

    // System.out.println(c+” “);

    1. System.out.println((char)c+" ");
    2. }
    3. fis.close();

    } } ``` 一次读取一个字节数组

  • int read(byte[] b):读取一个字节数组
    1. 返回值是本次读取到的字节的个数
    1. 参数用于每次存储字节数据的数组
    1. 读取到文件末尾返回-1
    ```java package com.igeek_02;

import java.io.FileInputStream; import java.io.IOException; import java.util.Arrays;

/**

  • @author Lynn
  • @create 2020-12-11-10:42 */ public class InputStreamDemo2 { public static void main(String[] args) throws IOException {

    1. FileInputStream fis=new FileInputStream("test.txt");
    2. /*//封装一个数组--byte
    3. byte[] b=new byte[3];
    4. int len= fis.read(b);
    5. System.out.println(len);//确定一次性读取的数组的长度是3
    6. System.out.println(Arrays.toString(b));//[97,98,99]--数组的内容*/
    7. //循环读取
    8. byte[] bytes=new byte[3];
    9. int len=-1;//说明没有内容了
    10. while ((len= fis.read(bytes))!=-1){
    11. String s=new String(bytes,0,len);
    12. System.out.println(s);
    13. }
    14. fis.read();

    } } ```

    高效流

    Java在常规IO流的基础上,提供了更为高效的缓冲流,如下:
    高效字节缓冲流:BufferedInputStream/BufferedOutputStream
    高效流使用普通流对象作为构造方法参数。将普通流包装,提供高效的装饰。
    高效流write写出数据时,写出位置为缓冲区,并非目标资源。需要通过flush刷新方法将缓冲区的内容写出到目标文件中。
    高效输出流的关闭方法会自动调用flush方法。 ```java package com.igeek_02;

/**

  • @author Lynn
  • @create 2020-12-11-11:06 */

import java.io.BufferedOutputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException;

/**

  • 高效流—高级流
  • 原理:缓存区临时存放多个数据,一次性调用底层的资源,减少调用的次数,从而提升程序运行的效率
  • 所以在高级流的底层需要一个低级流作为支撑 *
  • 高效字节流的api:
  • BufferedInputStream/BufferedOutputStream *
  • 高效流和普通流基本(完全)一样
  • 高效流使用普通流作为构造函数的参数,在普通流的基础上增加缓存区 *
  • 高效write写出的时候,写出的位置是在缓存区,并不是目标资源
  • 需要通过flush()方法将缓存区中的内容写出到目标资源中—目的是提高效率 *
  • 方法:
  • void flush()—刷新缓存区
  • void close()—关闭流,关闭前调用flush方法 */ public class BufferedStreamDemo { public static void main(String[] args) throws IOException {

    1. //以高效字节输出流为例
    2. //1.创建普通字节流
    3. FileOutputStream fos=new FileOutputStream("test.txt");
    4. //2.通过高效流使用普通流---将普通流作为参数参入高效流的构造函数
    5. BufferedOutputStream bos=new BufferedOutputStream(fos);
    6. //利用高效流处理数据
    7. bos.write(97);
    8. bos.write(new byte[]{100,101,102});
    9. //刷新缓存区
    10. bos.flush();
    11. //关闭流--直接关闭高效流即可,普通流会随之关闭
    12. bos.close();

    } } ```

    高效流使用案例1

    ```java package com.igeek_02;

/**

  • @author Lynn
  • @create 2020-12-11-11:17 */

import java.io.*;

/**

  • 高效流使用案例 */ public class BufferedWriterReaderDemo { public static void main(String[] args) throws IOException {

    1. //1.创建普通流
    2. FileWriter fw=new FileWriter("test2.txt");
    3. //2.创建高效流--将普通流作为参数传入--对应FileWriter
    4. BufferedWriter bw=new BufferedWriter(fw);
    5. //写入数据
    6. bw.write("天空飘来五个字");//支持字符,因为是BufferedWriter中的
    7. //刷新缓存区
    8. bw.flush();
    9. //关闭流
    10. bw.close();
    11. System.out.println("---------------------------------------");
    12. //1.创建普通流--保证文件存在
    13. FileReader fr=new FileReader("test2.txt");
    14. //2.创建高效流--将普通流作为参数传入--对应FileWriter
    15. BufferedReader br=new BufferedReader(fr);
    16. //读出数据
    17. char[] chs=new char[1024];
    18. //获取读取字符的个数
    19. int len=br.read(chs);
    20. //将字符转换成字符串
    21. String s=new String(chs,0,len);
    22. System.out.println(s);
    23. //关闭流
    24. br.close();

    } } ```

    高效流使用案例2

    特殊方法(属于高效流的)

  • public void readLine()—读取一行,读到末尾的时候返回null ```java package com.igeek_02;

/**

  • @author Lynn
  • @create 2020-12-11-11:17 */

import java.io.*;

/**

  • 高效流使用案例 *
  • 特殊方法(属于高效流的)
  • public void readLine()—读取一行,读到末尾的时候返回null */ public class BufferedWriterReaderDemo { public static void main(String[] args) throws IOException {

    1. //1.创建普通流
    2. FileReader fr=new FileReader("test3.txt");
    3. //2.创建高效流--将普通流作为参数传入--对应FileWriter
    4. BufferedReader br=new BufferedReader(fr);
    5. //读取操作--每次读取一行
    6. /* System.out.println(br.readLine());
    7. System.out.println(br.readLine());
    8. System.out.println(br.readLine());
    9. System.out.println(br.readLine());//null */
    10. //循环读取
    11. String s=null;//必须写成null,不能用 s=""
    12. while ((s=br.readLine())!=null){
    13. //输出的是一行
    14. System.out.println(s);
    15. }
    16. //关闭流
    17. br.close();
    18. System.out.println("---------------------------------------");
  1. }

}

  1. <a name="aNVH7"></a>
  2. ### 演示流传输中编码的问题
  3. ![image.png](https://cdn.nlark.com/yuque/0/2020/png/2706946/1607911005050-276a360d-0701-497d-b207-0add1a239eca.png#align=left&display=inline&height=194&margin=%5Bobject%20Object%5D&name=image.png&originHeight=324&originWidth=1246&size=420784&status=done&style=none&width=746)
  4. ```java
  5. package com.igeek_02;
  6. import java.io.*;
  7. /**
  8. * @author Lynn
  9. * @create 2020-12-14-9:57
  10. */
  11. public class CharacterDemo {
  12. public static void main(String[] args) throws IOException {
  13. //使用utf-8格式输出到文件中,文件使用gbk观看乱码,使用utf-8就正常
  14. FileOutputStream fos=new FileOutputStream("test5.txt");
  15. OutputStreamWriter osw=new OutputStreamWriter(fos,"gbk");
  16. //写入数据
  17. osw.write("你好");
  18. osw.close();
  19. //读出
  20. FileInputStream fis=new FileInputStream("test5.txt");
  21. InputStreamReader isr=new InputStreamReader(fis,"utf-8");
  22. System.out.println((char)isr.read());
  23. System.out.println((char)isr.read());
  24. isr.close();
  25. }
  26. }

高效流练习

  1. package com.igeek_02;
  2. /**
  3. * @author Lynn
  4. * @create 2020-12-14-9:30
  5. */
  6. import java.io.*;
  7. import java.util.ArrayList;
  8. import java.util.Collections;
  9. /**
  10. * 练习
  11. *
  12. * 需求:
  13. * 将test4.txt中的所有的名称进行读取,并且倒序再次输入到test.txt中
  14. *
  15. * 步骤:
  16. * 1.定义一个集合存储名字
  17. * 2.使用高效流一次读取一行
  18. * 3.将读取的名字放到集合中
  19. * 4.使用工具类中的反排序方法--reverse
  20. * 5.使用高级流依次写出一个名字
  21. */
  22. public class Test {
  23. public static void main(String[] args) throws IOException {
  24. //流 处理
  25. FileReader fr=new FileReader("test4.txt");
  26. BufferedReader br=new BufferedReader(fr);
  27. //定义一个集合
  28. ArrayList<String> list=new ArrayList<>();
  29. //一次读取一个名字
  30. String s=null;
  31. while ((s=br.readLine())!=null){
  32. //查看文档中的数据
  33. System.out.println(s);
  34. //保存到集合
  35. list.add(s);
  36. }
  37. //关闭流
  38. br.close();
  39. //使用工具类中的反排序方法--reverse
  40. Collections.reverse(list);
  41. //使用高级流写出
  42. FileWriter fw=new FileWriter("test4.txt");
  43. BufferedWriter bw=new BufferedWriter(fw);
  44. //写出操作
  45. for (String name:list){
  46. //将每一个名字放到test4.txt
  47. bw.write(name);
  48. //换行--相当于加一个回车
  49. bw.newLine();
  50. }
  51. //关闭流
  52. bw.close();
  53. }
  54. }

文件复制

文件复制不使用字节数组

利用字节流将当前工程下的ASCII码表完整版.doc复制到当前工程下的ASCII码表完整版(副本).doc

案例代码六:

A:分析:
最终两个文件中的数据一致
1. 利用字节输入流关联ASCII码表完整版.doc文件
2. 利用字节输出流关联ASCII码表完整版(副本).doc文件
3. 循环从ASCII码表完整版.doc读一个字节,然后将这个字节写入到ASCII码表完整版(副本).doc,直到读到ASCII码表完整版.doc的末尾

  1. package com.igeek_01;
  2. import java.io.FileInputStream;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5. /**
  6. * @ClassName: CopyFileDemo
  7. * @Description: 文件复制不使用字节数组
  8. * @date 2017年11月23日 上午8:58:46
  9. * Company www.igeekhome.com
  10. *
  11. * 分析:
  12. * 1. 利用字节输入流关联ASCII码表完整版.doc文件
  13. * 2. 利用字节输出流关联ASCII码表完整版(副本).doc文件
  14. * 3. 循环从ASCII码表完整版.doc读一个字节,
  15. * 然后将这个字节写入到ASCII码表完整版(副本).doc,
  16. * 直到读到ASCII码表完整版.doc的末尾
  17. * 即先读后写
  18. */
  19. public class CopyFileDemo {
  20. public static void main(String[] args) throws IOException {
  21. //使用一次一个字节的方式完成复制
  22. //创建IO流对象绑定IO资源
  23. FileInputStream fis = new FileInputStream("ASCII码表完整版.doc");
  24. FileOutputStream fos = new FileOutputStream("ASCII码表完整版(副本).doc");
  25. //读取数据,读一个字节,写一个字节
  26. //先读
  27. //定义变量c,用于存储每次读取到的字节
  28. int c=-1;
  29. while((c=fis.read())!=-1) {
  30. //后写
  31. fos.write(c);
  32. }
  33. //关闭流
  34. fos.close();
  35. fis.close();
  36. }
  37. }

文件复制使用字节数组

利用字节流和字节数组将当前工程下的ASCII码表完整版.doc复制到当前工程下的ASCII码表完整版(副本).doc

案例代码七:

A:分析:
最终两个文件中的数据一致
1. 定义一个长度为1024整数倍的字节数组
2. 利用字节输入流关联ASCII码表完整版.doc文件
3. 利用字节输出流关联ASCII码表完整版(副本).doc文件
4. 循环从ASCII码表完整版.doc读一个字节数组,然后将这个字节数组中有效的内容写入到ASCII码表完整版(副本).doc,直到读到ASCII码表完整版.doc的末尾

  1. package com.igeek_02;
  2. import java.io.FileInputStream;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5. /**
  6. * @ClassName: CopyFileDemo
  7. * @Description: 文件复制使用字节数组
  8. * @date 2017年11月23日 上午9:05:23
  9. * Company www.igeekhome.com
  10. *
  11. * 分析:
  12. * 1. 定义一个长度为1024整数倍的字节数组
  13. * 2. 利用字节输入流关联ASCII码表完整版.doc文件
  14. * 3. 利用字节输出流关联ASCII码表完整版(副本).doc文件
  15. * 4. 循环从ASCII码表完整版.doc读一个字节数组,
  16. * 然后将这个字节数组中有效的内容写入到ASCII码表完整版(副本).doc,
  17. * 直到读到ASCII码表完整版.doc的末尾
  18. * 即先读后写
  19. */
  20. public class CopyFileDemo {
  21. public static void main(String[] args) throws IOException {
  22. //使用一次一个字节数组的方式完成复制
  23. //创建IO流对象绑定IO资源
  24. FileInputStream fis = new FileInputStream("ASCII码表完整版.doc");
  25. FileOutputStream fos = new FileOutputStream("ASCII码表完整版(副本).doc");
  26. //读取数据,读一个字节数组,写一个字节数组
  27. //定义字节数组,用于存储每次读取到的数据
  28. byte[] bytes = new byte[1024];
  29. //定义变量,用于记录每次读取到数据的长度
  30. int len=-1;
  31. //先读
  32. while((len = fis.read(bytes))!=-1) {
  33. //后写
  34. fos.write(bytes,0,len);
  35. }
  36. //关闭流
  37. fos.close();
  38. fis.close();
  39. }
  40. }

转换流

Reader:
InputStreamReader可以完成字节输入流转换为字符输入流
Writer:
OutputStreamWriter可以完成字节输出流转换为字符输出流

  1. package com.igeek_01;
  2. import java.io.FileOutputStream;
  3. import java.io.IOException;
  4. import java.io.OutputStreamWriter;
  5. /**
  6. * @ClassName: OutputStreamWriterDemo
  7. * @Description: OutputStreamWriter的使用
  8. * @date 2017年11月23日 上午10:47:22
  9. * Company www.igeekhome.com
  10. *
  11. * 需求:
  12. * 已经具备字节流,绑定了IO资源
  13. * 需要将字节流转成字符流
  14. *
  15. * 此时,可以使用转换流,接收一个字节流对象,进行字符流的操作.
  16. * 转换流本身就是字符流
  17. *
  18. * 转换流:
  19. * Reader:
  20. * InputStreamReader可以完成字节输入流转换为字符输入流
  21. * Writer:
  22. * OutputStreamWriter可以完成字节输出流转换为字符输出流。
  23. *
  24. * 则转换流的使用方法:
  25. * 构造方法传入字节流对象
  26. * 自身调用字符流的方法
  27. */
  28. public class OutputStreamWriterDemo {
  29. public static void main(String[] args) throws IOException {
  30. //创建字节输出流
  31. FileOutputStream fos = new FileOutputStream("test.txt");
  32. //将字节流转为字符流,即通过字节流对象创建转换流对象
  33. OutputStreamWriter osw = new OutputStreamWriter(fos);
  34. //使用字符流的方法
  35. osw.write("hello:中国");
  36. //与高效流类似,转换流包含字节流,所以直接关闭转换流,字节流也关闭了
  37. osw.close();
  38. }
  39. }
  1. package com.igeek_01;
  2. import java.io.FileInputStream;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;
  5. /**
  6. * @ClassName: InputStreamReaderDemo
  7. * @Description: InputStreamReaderDemo的使用
  8. * @date 2017年11月23日 上午10:55:03
  9. * Company www.igeekhome.com
  10. *
  11. * 需求:
  12. * 已经具备字节流,绑定了IO资源
  13. * 需要将字节流转成字符流
  14. *
  15. * 此时,可以使用转换流,接收一个字节流对象,进行字符流的操作.
  16. * 转换流本身就是字符流
  17. *
  18. * 转换流:
  19. * Reader:
  20. * InputStreamReader可以完成字节输入流转换为字符输入流
  21. * Writer:
  22. * OutputStreamWriter可以完成字节输出流转换为字符输出流。
  23. *
  24. * 则转换流的使用方法:
  25. * 构造方法传入字节流对象
  26. * 自身调用字符流的方法
  27. */
  28. public class InputStreamReaderDemo {
  29. public static void main(String[] args) throws IOException {
  30. //对比字节流操作字符与字符流操作字符的区别
  31. //普通字节流
  32. FileInputStream fis = new FileInputStream("test.txt");
  33. int b=-1;
  34. while((b=fis.read())!=-1) {
  35. System.out.println((char)b);
  36. }
  37. fis.close();
  38. System.out.println("=====================");
  39. //字符流(这里使用转换流转成一个字符流)
  40. FileInputStream fis2 = new FileInputStream("test.txt");
  41. InputStreamReader isr = new InputStreamReader(fis2);
  42. int c=-1;
  43. while((c=isr.read())!=-1) {
  44. System.out.println((char)c);
  45. }
  46. isr.close();
  47. }
  48. }

序列化和反序列化

用于向流中写入对象的操作流 ObjectOutputStream称为序列化流
用于从流中读取对象的操作流 ObjectInputStream称为反序列化流
特点:用于操作对象。可以将对象写入到文件中,也可以从文件中读取对象。
ObjectOutputStream序列化流
public final void writeObject(Object obj)
ObjectInputStream反序列化流
public final Object readObject()
每个被序列化操作的类型必须实现Serializable接口(具备序列化功能的标记接口),让其具备序列化能力。

  1. package com.igeek_03;
  2. /**
  3. * @author Lynn
  4. * @create 2020-12-14-10:18
  5. */
  6. import java.io.Serializable;
  7. /**
  8. * 序列化和反序列化:
  9. * 序列化:利用序列化流将一个对象的整体转换为二进制的数据,并且存储到文件中
  10. * 将对象永久性的存入一个文件,叫做序列化,读取的过程叫做反序列化
  11. *
  12. * 对象是需要封装的,为了实现对象的序列化,我们要将对象实现一个序列化接口--Serializable
  13. * 这个接口中没有方法,就是一个规范,只要实现了这个接口,那么序列化的时候就不会出现问题
  14. *
  15. * 序列化版本号:序列化ID(serialVersionUID),用于记录对象的类型
  16. * 每一个被序列化的操作对象操作其对象上午ID与接收类型的ID必须一致
  17. * 序列化的ID和反序列化的ID必须一致
  18. *
  19. * 封装一个开发级别的实体类(标准的)
  20. * 1.必须实现序列化接口--声明UID
  21. * 2.属性私有化,并且声明get/set方法
  22. * 3.声明无参有参构造函数
  23. * 4.重写HashCode和equals方法
  24. * 5.重写toString方法
  25. *
  26. * 拓展:
  27. * transient关键字在序列化中的使用:是一个修饰符,被修饰的属性可以在序列化中被忽略,
  28. * 在某些特定的业务场景会使用
  29. */
  30. class Person_up implements Serializable {
  31. private static final long serialVersionUID = 324576945194316948L;
  32. /**
  33. * serialVersionUID:生成的标准的唯一的码
  34. */
  35. // private static final long serialVersionUID=;
  36. //定义普通的标识码--普通版本码
  37. // private static final long serialVersionUID=1L;
  38. private String name;
  39. //这个age就不会被序列化
  40. private transient int age;
  41. public Person_up() {
  42. }
  43. public Person_up(String name, int age) {
  44. this.name = name;
  45. this.age = age;
  46. }
  47. public String getName() {
  48. return name;
  49. }
  50. public void setName(String name) {
  51. this.name = name;
  52. }
  53. public int getAge() {
  54. return age;
  55. }
  56. public void setAge(int age) {
  57. this.age = age;
  58. }
  59. @Override
  60. public String toString() {
  61. return "Person{" +
  62. "name='" + name + '\'' +
  63. ", age=" + age +
  64. '}';
  65. }
  66. @Override
  67. public boolean equals(Object o) {
  68. if (this == o) return true;
  69. if (o == null || getClass() != o.getClass()) return false;
  70. Person_up person = (Person_up) o;
  71. if (age != person.age) return false;
  72. return name != null ? name.equals(person.name) : person.name == null;
  73. }
  74. @Override
  75. public int hashCode() {
  76. int result = name != null ? name.hashCode() : 0;
  77. result = 31 * result + age;
  78. return result;
  79. }
  80. }
  1. package com.igeek_03;
  2. /**
  3. * @author Lynn
  4. * @create 2020-12-14-10:35
  5. */
  6. import java.io.FileOutputStream;
  7. import java.io.IOException;
  8. import java.io.ObjectOutput;
  9. import java.io.ObjectOutputStream;
  10. /**
  11. * 序列化对象
  12. *
  13. * 序列化流:
  14. * ObjectOutputStream:序列化流(对象输出流)
  15. * public final void writeObject(Object obj)
  16. *
  17. * ObjectInputStream:反序列化流(对象输入流)
  18. * public final Object readObject()
  19. */
  20. public class SerializableDemo {
  21. public static void main(String[] args) throws IOException {
  22. //准备被序列化的对象
  23. Person_up p=new Person_up("jack",18);
  24. //进行序列化操作
  25. FileOutputStream fos=new FileOutputStream("person_up.txt");
  26. ObjectOutput oos=new ObjectOutputStream(fos);
  27. //开始序列化
  28. oos.writeObject(p);
  29. //关闭流
  30. oos.close();
  31. }
  32. }
  1. package com.igeek_03;
  2. /**
  3. * @author Lynn
  4. * @create 2020-12-14-10:35
  5. */
  6. import java.io.*;
  7. /**
  8. * 序列化对象
  9. *
  10. * 序列化流:
  11. * ObjectOutputStream:序列化流(对象输出流)
  12. * public final void writeObject(Object obj)
  13. *
  14. * ObjectInputStream:反序列化流(对象输入流)
  15. * public final Object readObject()
  16. */
  17. public class SerializableDemo2 {
  18. public static void main(String[] args) throws IOException,Exception {
  19. //进行反序列化操作--保证对象存在
  20. FileInputStream fis=new FileInputStream("person_up.txt");
  21. ObjectInputStream ois=new ObjectInputStream(fis);
  22. //开始反序列化
  23. Person_up p=(Person_up) ois.readObject();
  24. System.out.println(p.getName());
  25. System.out.println(p.getAge());
  26. System.out.println(p);
  27. //关闭流
  28. ois.close();
  29. }
  30. }

打印流

  1. package com.igeek_04;
  2. /**
  3. * @author Lynn
  4. * @create 2020-12-14-11:12
  5. */
  6. import java.io.FileNotFoundException;
  7. import java.io.PrintWriter;
  8. /**
  9. * 演示操作:
  10. *
  11. * 打印流(自动行刷新流):只有输出没有输入
  12. * printStream:字节打印流,调用println方法自动刷新
  13. * printwriter:字符打印流,指定自动化刷新开关后,调用println方法自动刷新,无需手动调用flush方法
  14. * 每执行一次会自动刷新缓存区
  15. * 在网络传输中使用很多
  16. */
  17. public class PrintwriterDemo {
  18. public static void main(String[] args) throws FileNotFoundException {
  19. //创建对象
  20. PrintWriter pw=new PrintWriter("test8.txt");
  21. //println自带换行
  22. pw.println("干饭啦");
  23. pw.println("干饭啦");
  24. pw.println("干饭啦");
  25. pw.println("干饭啦");
  26. pw.println("干饭啦");
  27. pw.print("我是谁");
  28. pw.print("\n");//制表符在这个打印方法中是有效的
  29. pw.print("我是哪");
  30. // pw.print("\\n");无效
  31. pw.print("我在干什么");
  32. pw.close();
  33. }
  34. }