毕向东_Java基础视频教程第21天_IO流(1)
第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)的更多相关文章
- 毕向东_Java基础视频教程第20天_IO流(7~10)
第20天-07-IO流(递归) package bxd; import java.io.File; public class FileDemo3 { // 非递归打印 public static vo ...
- 毕向东_Java基础视频教程第19天_IO流(01~05)
第19天-01-IO流(BufferedWriter) 字符流的缓冲区 缓冲区的出现提高了对数据的读写效率. 对应类缓冲区要结合流才可以使用. BufferedWriter BufferedReade ...
- 毕向东_Java基础视频教程第19天_IO流(06~10)
第19天-06-IO流(装饰设计模式) 装饰设计模式: 当想要对已有的对象进行功能增强时, 可以定义类,将已有对象传入,基于已有的功能,并提供加强功能.那么这个自定义的类称为装饰类. 装饰类通常会通过 ...
- 毕向东_Java基础视频教程第19天_IO流(11~14)
第19天-11-IO流(字节流File读写操作) import java.io.FileInputStream; import java.io.FileOutputStream; import jav ...
- 毕向东_Java基础视频教程第20天_IO流(15~17)
第20天-15-IO流(打印输出流) 打印输出流:PrintWriter与PrintStream 两者的区别:Since JDK 1.4 it's possible to specify the ch ...
- 毕向东_Java基础视频教程第20天_IO流(11~14)
第20天-11-IO流(Properties简述) .properties是一种主要在Java相关技术中用来存储应用程序的可配置参数的文件的文件扩展名.它们也可以存储用于国际化和本地化的字符串,这种文 ...
- 毕向东_Java基础视频教程第20天_IO流(5~6)
第20天-05-IO流(文件列表一) static File[] listRoots() List the available filesystem roots. String[] list() Re ...
- 毕向东_Java基础视频教程第20天_IO流(1~4)
第20天-01-IO流(File概述) File类: 用来将文件或者文件夹封装成对象, 方便进行操作. File对象可以作为参数, 传递给流对象的构造函数. 流对象不能操作文件夹; 流对象不能操作文件 ...
- 毕向东_Java基础视频教程第19天_IO流(20~22)
第19天-20-IO流(改变标准输入输出设备) static void setIn(InputStream in) Reassigns the "standard" input s ...
随机推荐
- Universal-Image-Loader完全解析(下)
Universal-Image-Loader完全解析(下) 在这篇文章中,我会继续跟大家分享有关于Universal-Image-Loader框架的相关知识,这次主要分享的是框架中图片缓存方面的知识. ...
- Mac 10.12安装专业抓包工具Wireshark
说明:专业到不太会用. 下载: (链接: https://pan.baidu.com/s/1c570YE 密码: pkmr)
- (转)Heartbeat+DRBD+MySQL高可用方案
原文:http://www.cnblogs.com/gomysql/p/3674030.html 1.方案简介 本方案采用Heartbeat双机热备软件来保证数据库的高稳定性和连续性,数据的一致性由D ...
- ECharts概念学习系列之ECharts官网教程之自定义构建 ECharts(图文详解)
不多说,直接上干货! 官网 http://echarts.baidu.com/tutorial.html#%E8%87%AA%E5%AE%9A%E4%B9%89%E6%9E%84%E5%BB%BA%2 ...
- Eclipse/MyEclipse按任何键,都可以提示?(最强帮手)
说明: 一般在Eclipse ,MyEclipse代码里面,打个foreach,switch等这些,是无法得到代码提示的(不信自己试试),其他的就更不用说了,而在Microsoft Visual St ...
- Check类之TypeValidation
(1)Validator类的visitTypeApply()方法 实例1: class TestTypeVal<T extends InputStream>{ TestTypeVal< ...
- git stash使用一则
当在新的分支工作,修改的文件提交到暂存区,这时,切换到其他分之,可能报错,因为米有commit,如果切换到其他分支,暂存区的修改可能丢失,我们可以使用git stash save -a(暂存区) &q ...
- Spring源码深度解析系列-----------org.springframework.aop-3.0.6.RELEASE
Spring源码深度解析系列-----------org.springframework.aop-3.0.6.RELEASE
- 使用Jprofiler+jmeter进行JVM性能调优
一.JProfiler简介 JProfiler 是一个商业授权的Java剖析工具,由EJ技术有限公司,针对的Java EE和Java SE应用程序开发的.它把CPU.执行绪和内存的剖析组合在一个强大的 ...
- 使用 Angular 和 RxJS 实现的无限滚动加载
无限滚动加载应该是怎样的? 无限滚动加载列表在用户将页面滚动到指定位置后会异步加载数据.这是避免寻主动加载(每次都需要用户去点击)的好方法,而且它能真正保持应用的性能.同时它还是降低带宽和增强用户体验 ...