Java之IO流进阶篇:内存流,打印流,对象流
Java中的IO流,即为输入输出流。所谓输入输出流,都是相对于程序而言,程序就是这个参照物。一张图看懂输入输出流:

输入流抽象基类:InputStream,Reader
输出流抽象基类:OutputStream,Writer
输入输出流子类众多,详情见下图:

1.内存流
用来操作内存
ByteArrayInputStream 内存到程序 不需要关闭 不使用内存资源,内存不够建议不用
ByteArrayOutputStream 程序到内存 不需要关闭 不使用内存资源,内存不够建议不用

内存输入流和内存输出流:
首先创建字节数组,一般引用数据类型存放在内存中。显然此时,可以创建字节数组输入流,读入程序当中。
package com.test; import java.io.ByteArrayInputStream;
import java.io.IOException; public class ByteArrayInputStreamDemo { public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
//1.创建字节数组(要读取的数据)
byte[] data= {10,15,50,33,12,22};
//2.创建流
ByteArrayInputStream bais=new ByteArrayInputStream(data);
//3.读取
// int d;
// while((d=bais.read())!=-1) {
// System.out.println(d);
// }
// bais.close();//实际操作中无需关闭流
byte[] buf=new byte[1024];
int len;
while((len=bais.read(buf))!=-1) {
for (int i = 0; i < len; i++) {
System.out.println(buf[i]);
}
}
}
}
package com.test;
import java.io.ByteArrayOutputStream;
public class ByteArrayOutputStreamDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
//1.创建字节数组输出流对象
ByteArrayOutputStream baos=new ByteArrayOutputStream();
//2.写入数据
baos.write(12);
baos.write(20);
baos.write(18);
baos.write(32);
//3.获取输出流中的字节数据
byte[] data=baos.toByteArray();
for (byte b : data) {
System.out.println(b);
}
}
}
使用内存流读取图片:
package com.test; import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException; public class ReadImg { public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
//1.创建文件字节输入流
FileInputStream fis=new FileInputStream("E:\\xx.png");
ByteArrayOutputStream baos=new ByteArrayOutputStream();
byte[] buf=new byte[1024];
//2.读取数据
int len;
while((len=fis.read(buf))!=-1) {
baos.write(buf,0,len);
}
//3.获取图片数据
byte[] imgbyte=baos.toByteArray();
System.out.println(imgbyte.length);
//4.创建文件输出流
FileOutputStream fos=new FileOutputStream("E:\\xx1.png");
ByteArrayInputStream bais=new ByteArrayInputStream(imgbyte);
//5.读取数组
byte[] buf1=new byte[1024];
int len1;
while((len1=bais.read(buf1))!=-1) {
fos.write(buf1,0,len1);
}
fis.close();
fos.close();
bais.close();
baos.close();
} }
2.打印流
PrintSream:操作字节,自动刷新,可设置字符集
PrintWriter :不能操作字节,内部有缓冲区
打印字节流实例:
package com.test; import java.io.BufferedOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream; public class PrintStreamDemo {
//打印流(字节)
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
//PrintStream ps=new PrintStream("E:\\aaa.txt");
BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("E:\\xx.txt"));
PrintStream ps=new PrintStream(bos,true);
ps.print("123456");
ps.print(true);
ps.println("abcdef");
ps.printf("%d", 200);
ps.printf("%.2f", 3.1415926);
ps.printf("%s", "我爱生活");
ps.printf("%x", 256); } }
打印字符流实例:
package com.test; import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter; public class PrintWriterDemo { public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
PrintWriter pw=new PrintWriter(new FileOutputStream("E:\\bbb.txt"));
pw.println("123");
pw.close();
} }
3.对象序列化与反序列化(对象流)
本例举一个学生类Student.class序列化和反序列化的过程。
创建的学生类:
package com.test;
import java.io.Serializable;
public class Student implements Serializable {
private static final long serialVersionUID=123L;//序列化与反序列化的唯一标记
private int StuNo;//序列化和访问权限没有关系
String name;
//transient int age;//transient 瞬时的,不能序列化瞬时的属性
//static String address="北京";//静态变量不能被序列化
public Student() {
super();
// TODO Auto-generated constructor stub
}
public Student(int stuNo, String name) {
super();
StuNo = stuNo;
this.name = name;
}
public int getStuNo() {
return StuNo;
}
public void setStuNo(int stuNo) {
StuNo = stuNo;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
使用对象类序列化和反序列化学生类:
package com.test; import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream; public class SerializeDemo { public static void main(String[] args) throws IOException, ClassNotFoundException {
//序列化过程:
//1.创建序列化对象
Student stu=new Student(1101,"小明");
//2.创建文件输出流
FileOutputStream fos=new FileOutputStream("E:\\receive.bin");
//3.创建对象流接入输出流
ObjectOutputStream oos=new ObjectOutputStream(fos);
//4.对象流输出序列化对象保存在文件中
oos.writeObject(stu);
oos.close();
//反序列化过程:
//1.创建对象流
FileInputStream fis=new FileInputStream("E:\\receive.bin") ;
ObjectInputStream ois=new ObjectInputStream(fis);
//2.反序列化
Student stu1=(Student)ois.readObject();
ois.close();
System.out.println("学号:"+stu1.getStuNo());
System.out.println("姓名:"+stu1.getName());
}
}
控制台输出信息(表明反序列化成功):

Java之IO流进阶篇:内存流,打印流,对象流的更多相关文章
- Java实现IO通信(服务器篇)
Java实现IO通信(服务器篇) 如何利用java实现我们的通信呢?首先我们了解一下什么是通信?通信的机制是怎样的? 首先来讨论一下什么是通信?通信,指人与人或人与自然之间通过某种行为或媒介进行的信息 ...
- Python进阶篇四:Python文件和流
摘要: Python对于文件和流的操作与其他编程语言基本差不多,甚至语句上比其他语言更为简洁.文件和流函数针对的对象除了这两者之外还有,类文件(file-like),即python中只支持读却不支持写 ...
- Android进阶篇-内存管理
很多时候我们需要考虑Android平台上的内存管理问题,Dalvik VM给每个进程都分配了一定量的可用堆内存,当我们处理一些耗费资源的操作时可能会产生OOM错误(OutOfMemoryError)这 ...
- JavaScript学习笔记 - 进阶篇(8)- DOM对象,控制HTML元素
认识DOM 文档对象模型DOM(Document Object Model)定义访问和处理HTML文档的标准方法.DOM 将HTML文档呈现为带有元素.属性和文本的树结构(节点树). 先来看看下面代码 ...
- JavaScript学习笔记 - 进阶篇(7)- 浏览器对象
window对象 window对象是BOM的核心,window对象指当前的浏览器窗口. window对象方法: 注意:在JavaScript基础篇中,已讲解了部分属性,window对象重点讲解计时器. ...
- go语言之进阶篇方法面向过程和对象函数的区别
1.方法 (method) 在面向对象编程中,一个对象其实也就是一个简单的值或者一个变量,在这个对象中会包含一些函数,这种带有接收者的函数,我们称为方法(method). 本质上,一个方法则是一个和特 ...
- 对象流,它们是一对高级流,负责即将java对象与字节之间在读写的过程中进行转换。 * java.io.ObjectOutputStream * java.io.ObjectInputStream
package seday06; import java.io.Serializable;import java.util.Arrays; /** * @author xingsir * 使用当前类来 ...
- Java之IO(十)Reader和Writer
转载请注明源出处:http://www.cnblogs.com/lighten/p/7071733.html 1.前言 之前的章节已经将Java8的io包中的字节流介绍完毕了.本章开始介绍Java的I ...
- Java中的IO流 - 入门篇
前言 大家好啊,我是汤圆,今天给大家带来的是<Java中的IO流-入门篇>,希望对大家有帮助,谢谢 由于Java的IO类有很多,这就导致我刚开始学的时候,感觉很乱,每次用到都是上网搜,结果 ...
随机推荐
- C++11 实现生产者消费者模式
代码都类似,看懂一个,基本都能理解了. 共有代码: #include <cstdlib>#include <condition_variable>#include <io ...
- windows之桌面程序引导功能
经常使用windows系统的同学可能都会遇到这样一种情况,刚按照完的应用程序,可能会在桌面产生一个提示信息,指示当前快捷方式可以使用了,并给出相应的文字说明,指示该快捷方式的功能.那么大家有没有考虑过 ...
- NPM 安装速度慢,镜像修改
今天安装gitbook的时候,竟然花了两个小时没有安装成功,大家在使用npm安装依赖的时候速度是不是经常慢的要死?最佳解决方案是手动更改镜像服务器地址, 强烈推荐阿里巴巴在国内的镜像服务器,执行下面命 ...
- Android Studio gradle插件版本和gradle版本对应关系
1.gradle插件版本配置位置: project对应的build.gradle文件中 buildscript { repositories { jcenter() } dependencies { ...
- C#2.0之可空类型
可空类型Nullable<T> 在C#2.0之前 ,值类型一直不可以为null,但是实际开发中常常会有这样的需求,比如结束时间. 为什么不可以为null 对于引用类型来说,null代表着空 ...
- C#2.0之细说泛型
C#2的头号亮点 : 泛型 在C#1中,Arraylist总是会给人带来困扰,因为它的参数类型是Object,这就让开发者无法把握集合中都有哪些类型的数据.如果对string类型的数据进行算术操作那自 ...
- Spring Boot 2.x (十五):Dubbo + Zookeeper + 新版Dubbo Admin
Dubbo 简介 Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的RPC实现服务的输出和输入功能,可以和Spring框架无缝集成. 它提供了三大核心能力: 面向接口的远程 ...
- 记一次vue长列表的内存性能分析和优化
好久没写东西,博客又长草了,这段时间身心放松了好久,都没什么主题可以写了 上周接到一个需求,优化vue的一个长列表页面,忙活了很久也到尾声了,内存使用和卡顿都做了一点点优化,还算有点收获 写的有点啰嗦 ...
- C#之Invoke学习
C#中invoke和beginInvoke的使用 1.Control类中的invoke和beginInvoke的定义 invoke的含义是:在拥有此控件的基础窗口句柄的现呈上同步执行指定的委托(同步) ...
- Js的reduce()方法
Js 数组reduce()方法应用一个函数针对数组的两个值(从左到右),以减至一个值. 语法:array.reduce(callback[, initialValue]) 参数说明: 1)callba ...