第21天-01-IO流(对象的序列化)

ObjectInputStream与ObjectOutputStream

  • 被操作的对象需要实现Serializable接口(标记接口)
  • 非必须, 但强烈建议所有可序列化类都显式声明serialVersionUID
package bxd;

import java.io.*;

public class ObjectStreamDemo {
public static void readObj() throws Exception {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("Person.object"));
Person person = (Person) ois.readObject();
System.out.println(person);
ois.close();
} public static void writeObj() throws Exception {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("Person.object"));
oos.writeObject(new Person("lily", 39, "us"));
oos.close();
} public static void main(String[] args) throws Exception {
// writeObj();
readObj();
}
} /*
输出lily:0:cn, 因为age不会被序列化(使用初始值0), 静态变量country也不会被序列化(使用初始值cn).
*/
class Person implements Serializable { public static final long serialVersionUID = 42L; // 强烈建议所有可序列化类都显式声明serialVersionUID
private String name;
transient int age; // 如果某个实例变量不需要被序列化, 可以使用transient修饰
static String country = "cn"; // 序列化行为只针对Java堆(heap), 而静态变量不存在于heap. Person(String name, int age, String country) {
this.name = name;
this.age = age;
this.country = country;
} public String toString() {
return name + ":" + age + ":" + country;
}
}

第21天-02-IO流(管道流)

PipedInputStream和PipedOutputStream

  • 输入和输出可以直接进行连接, 通常结合线程使用.
  • 不建议对这两个对象尝试使用单个线程, 因为这样可能发生线程死锁
package bxd;

import java.io.*;

public class PipedStreamDemo {

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

        PipedInputStream pipedInputStream = new PipedInputStream();
PipedOutputStream pipedOutputStream = new PipedOutputStream();
// 只要往pipedOutputStream写入的内容, 就可以从pipedInputStream读到
pipedInputStream.connect(pipedOutputStream); Read read = new Read(pipedInputStream);
Write write = new Write(pipedOutputStream); new Thread(read).start();
new Thread(write).start();
}
} class Write implements Runnable { private PipedOutputStream out; public Write(PipedOutputStream out) {
this.out = out;
} @Override
public void run() {
try {
System.out.println("开始执行PipedOutputStream操作: ");
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); String line = null;
while ((line = bufferedReader.readLine()) != null) {
if ("over".equals(line)) break;
out.write(line.getBytes());
out.write(System.lineSeparator().getBytes());
} bufferedReader.close();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} class Read implements Runnable { private PipedInputStream in; public Read(PipedInputStream in) {
this.in = in;
} @Override
public void run() {
try {
System.out.println("开始执行PipedInputStream操作: "); BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream("读取到的内容.txt")); byte[] buf = new byte[1024];
int len = 0;
while ((len = in.read(buf)) != -1) {
bufferedOutputStream.write(buf, 0, len);
} bufferedOutputStream.close();
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

毕向东_Java基础视频教程第21天_IO流(1)的更多相关文章

  1. 毕向东_Java基础视频教程第20天_IO流(7~10)

    第20天-07-IO流(递归) package bxd; import java.io.File; public class FileDemo3 { // 非递归打印 public static vo ...

  2. 毕向东_Java基础视频教程第19天_IO流(01~05)

    第19天-01-IO流(BufferedWriter) 字符流的缓冲区 缓冲区的出现提高了对数据的读写效率. 对应类缓冲区要结合流才可以使用. BufferedWriter BufferedReade ...

  3. 毕向东_Java基础视频教程第19天_IO流(06~10)

    第19天-06-IO流(装饰设计模式) 装饰设计模式: 当想要对已有的对象进行功能增强时, 可以定义类,将已有对象传入,基于已有的功能,并提供加强功能.那么这个自定义的类称为装饰类. 装饰类通常会通过 ...

  4. 毕向东_Java基础视频教程第19天_IO流(11~14)

    第19天-11-IO流(字节流File读写操作) import java.io.FileInputStream; import java.io.FileOutputStream; import jav ...

  5. 毕向东_Java基础视频教程第20天_IO流(15~17)

    第20天-15-IO流(打印输出流) 打印输出流:PrintWriter与PrintStream 两者的区别:Since JDK 1.4 it's possible to specify the ch ...

  6. 毕向东_Java基础视频教程第20天_IO流(11~14)

    第20天-11-IO流(Properties简述) .properties是一种主要在Java相关技术中用来存储应用程序的可配置参数的文件的文件扩展名.它们也可以存储用于国际化和本地化的字符串,这种文 ...

  7. 毕向东_Java基础视频教程第20天_IO流(5~6)

    第20天-05-IO流(文件列表一) static File[] listRoots() List the available filesystem roots. String[] list() Re ...

  8. 毕向东_Java基础视频教程第20天_IO流(1~4)

    第20天-01-IO流(File概述) File类: 用来将文件或者文件夹封装成对象, 方便进行操作. File对象可以作为参数, 传递给流对象的构造函数. 流对象不能操作文件夹; 流对象不能操作文件 ...

  9. 毕向东_Java基础视频教程第19天_IO流(20~22)

    第19天-20-IO流(改变标准输入输出设备) static void setIn(InputStream in) Reassigns the "standard" input s ...

随机推荐

  1. 数据库主键ID生成策略

    前言: 系统唯一ID是我们在设计一个系统的时候常常会遇见的问题,下面介绍一些常见的ID生成策略. Sequence ID UUID GUID COMB Snowflake 最开始的自增ID为了实现分库 ...

  2. 【WinSCP】WinSCP 5.x使用密钥连接服务器

    在WinSCP 4.x中,主页面有一个添加密钥文件的选项,如下图所示 但是在WinSCP 5.x中主界面发生了很大的变化 在主页上没有了载入密钥文件的选项,那么我们应该怎么使用密钥验证呢? WinSC ...

  3. php array_flip() 删除数组重复元素

    在PHP中,用于删除数组中重复元素有一个可用的函数,那就是 array_unique(), 但是它并不是一个最高效的方法,使用array_flip() 函数将比array_uniqure()在速度上高 ...

  4. 各种height/width总结

    CSS盒模型是比较复杂的,尤其是当页面中有滚动条时,仅仅通过css来操作高度宽度是不够的,幸运的是Javascript提供了不少这样的接口.Javascript中clientHeight / clie ...

  5. Python案例之QQ空间自动登录程序实现

    不多说,直接上干货! 工具选择: 电脑系统:win7,32 位,下面第二部安装SetupTools时注意系统版本要求: Python: 2.7.11,  相信只要是2.7的就可以实现: Seleniu ...

  6. UTF8最好不要带BOM,附许多经典评论

    UTF-8 不需要 BOM,尽管 Unicode 标准允许在 UTF-8 中使用 BOM.所以不含 BOM 的 UTF-8 才是标准形式,在 UTF-8 文件中放置 BOM 主要是微软的习惯(顺便提一 ...

  7. HighCharts理解与总结

    摘自:http://www.highcharts.com/docs/getting-started/installation Installation Highcharts requires two ...

  8. 每天一道剑指offer-二叉树的下一个结点

    题目 每天一道剑指offer-二叉树的下一个结点 https://www.nowcoder.com/practice/ef068f602dde4d28aab2b210e859150a?tpId=13& ...

  9. javascript图形动画设计--以简单正弦波轨迹移动

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  10. FE面试题库

    一.HTML 序号 面试题目 难度等级 回答要点 H1 简述编写HTML需要注意哪些事项? ☆ DOCTYPE.charset.viewport.语义化.CSS与JS的位置.DOM层级.结构样式行为的 ...