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类有很多,这就导致我刚开始学的时候,感觉很乱,每次用到都是上网搜,结果 ...
随机推荐
- java线程阻塞唤醒的四种方式
java在多线程情况下,经常会使用到线程的阻塞与唤醒,这里就为大家简单介绍一下以下几种阻塞/唤醒方式与区别,不做详细的介绍与代码分析 suspend与resume Java废弃 suspend() 去 ...
- synchronize 关键字原理
众所周知 synchronized 关键字是解决并发问题常用解决方案,有以下三种使用方式: 同步普通方法,锁的是当前对象. 同步静态方法,锁的是当前 Class 对象. 同步块,锁的是 () 中的对象 ...
- requirejs、vue、vuex、vue-route的结合使用,您认为可行吗?
在五一节之前和一网友讨论前端技术时,对方提到vue.vue-route如果配合requirejs应用.当时的我没有想得很明白,也没能这位网友一个准确的回复,但我许诺于他五一研究后给他一个回复.本是一天 ...
- CSS,JavaScript知识点
1.css重用 <style> 如果整个页面的宽度 > 900px时: { . ...
- windows之桌面程序引导功能
经常使用windows系统的同学可能都会遇到这样一种情况,刚按照完的应用程序,可能会在桌面产生一个提示信息,指示当前快捷方式可以使用了,并给出相应的文字说明,指示该快捷方式的功能.那么大家有没有考虑过 ...
- Solr 03 - Solr的模式设计与优化 - 最详细的schema.xml模式文件解读
目录 1 关于schema.xml文件 2 解读schema.xml文件 2.1 field - 配置域 2.2 fieldType - 配置域类型 2.3 copyField - 配置复制域 2.4 ...
- Linux~yum命令安装程序
当我们使用linux的最小安装时,很多系统程序都没有被安装,这时,我们可以通过yum命令安装指定的包包,当然前提是你的linux处于联网状态的,下面说一下yum的用法 1 显示程序列表(联网的) yu ...
- consistent hash(一致性哈希算法)
一.产生背景 今天咱不去长篇大论特别详细地讲解consistent hash,我争取用最轻松的方式告诉你consistent hash算法是什么,如果需要深入,Google一下~. 举个栗子吧: 比如 ...
- docker删除镜像和删除容器
删除容器:docker rm ID 删除镜像:docker rmi ID
- SQL优化总结之二
1.列优先 如图有表A和表B,对其查询时,会有如下语句: select a.*,b.* from a,b where a.id = b.a_id; 注意from 后边的表名, a.如果多表查询是完全无 ...