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流进阶篇:内存流,打印流,对象流的更多相关文章

  1. Java实现IO通信(服务器篇)

    Java实现IO通信(服务器篇) 如何利用java实现我们的通信呢?首先我们了解一下什么是通信?通信的机制是怎样的? 首先来讨论一下什么是通信?通信,指人与人或人与自然之间通过某种行为或媒介进行的信息 ...

  2. Python进阶篇四:Python文件和流

    摘要: Python对于文件和流的操作与其他编程语言基本差不多,甚至语句上比其他语言更为简洁.文件和流函数针对的对象除了这两者之外还有,类文件(file-like),即python中只支持读却不支持写 ...

  3. Android进阶篇-内存管理

    很多时候我们需要考虑Android平台上的内存管理问题,Dalvik VM给每个进程都分配了一定量的可用堆内存,当我们处理一些耗费资源的操作时可能会产生OOM错误(OutOfMemoryError)这 ...

  4. JavaScript学习笔记 - 进阶篇(8)- DOM对象,控制HTML元素

    认识DOM 文档对象模型DOM(Document Object Model)定义访问和处理HTML文档的标准方法.DOM 将HTML文档呈现为带有元素.属性和文本的树结构(节点树). 先来看看下面代码 ...

  5. JavaScript学习笔记 - 进阶篇(7)- 浏览器对象

    window对象 window对象是BOM的核心,window对象指当前的浏览器窗口. window对象方法: 注意:在JavaScript基础篇中,已讲解了部分属性,window对象重点讲解计时器. ...

  6. go语言之进阶篇方法面向过程和对象函数的区别

    1.方法 (method) 在面向对象编程中,一个对象其实也就是一个简单的值或者一个变量,在这个对象中会包含一些函数,这种带有接收者的函数,我们称为方法(method). 本质上,一个方法则是一个和特 ...

  7. 对象流,它们是一对高级流,负责即将java对象与字节之间在读写的过程中进行转换。 * java.io.ObjectOutputStream * java.io.ObjectInputStream

    package seday06; import java.io.Serializable;import java.util.Arrays; /** * @author xingsir * 使用当前类来 ...

  8. Java之IO(十)Reader和Writer

    转载请注明源出处:http://www.cnblogs.com/lighten/p/7071733.html 1.前言 之前的章节已经将Java8的io包中的字节流介绍完毕了.本章开始介绍Java的I ...

  9. Java中的IO流 - 入门篇

    前言 大家好啊,我是汤圆,今天给大家带来的是<Java中的IO流-入门篇>,希望对大家有帮助,谢谢 由于Java的IO类有很多,这就导致我刚开始学的时候,感觉很乱,每次用到都是上网搜,结果 ...

随机推荐

  1. C++11 实现生产者消费者模式

    代码都类似,看懂一个,基本都能理解了. 共有代码: #include <cstdlib>#include <condition_variable>#include <io ...

  2. windows之桌面程序引导功能

    经常使用windows系统的同学可能都会遇到这样一种情况,刚按照完的应用程序,可能会在桌面产生一个提示信息,指示当前快捷方式可以使用了,并给出相应的文字说明,指示该快捷方式的功能.那么大家有没有考虑过 ...

  3. NPM 安装速度慢,镜像修改

    今天安装gitbook的时候,竟然花了两个小时没有安装成功,大家在使用npm安装依赖的时候速度是不是经常慢的要死?最佳解决方案是手动更改镜像服务器地址, 强烈推荐阿里巴巴在国内的镜像服务器,执行下面命 ...

  4. Android Studio gradle插件版本和gradle版本对应关系

    1.gradle插件版本配置位置: project对应的build.gradle文件中 buildscript { repositories { jcenter() } dependencies { ...

  5. C#2.0之可空类型

    可空类型Nullable<T> 在C#2.0之前 ,值类型一直不可以为null,但是实际开发中常常会有这样的需求,比如结束时间. 为什么不可以为null 对于引用类型来说,null代表着空 ...

  6. C#2.0之细说泛型

    C#2的头号亮点 : 泛型 在C#1中,Arraylist总是会给人带来困扰,因为它的参数类型是Object,这就让开发者无法把握集合中都有哪些类型的数据.如果对string类型的数据进行算术操作那自 ...

  7. Spring Boot 2.x (十五):Dubbo + Zookeeper + 新版Dubbo Admin

    Dubbo 简介 Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的RPC实现服务的输出和输入功能,可以和Spring框架无缝集成. 它提供了三大核心能力: 面向接口的远程 ...

  8. 记一次vue长列表的内存性能分析和优化

    好久没写东西,博客又长草了,这段时间身心放松了好久,都没什么主题可以写了 上周接到一个需求,优化vue的一个长列表页面,忙活了很久也到尾声了,内存使用和卡顿都做了一点点优化,还算有点收获 写的有点啰嗦 ...

  9. C#之Invoke学习

    C#中invoke和beginInvoke的使用 1.Control类中的invoke和beginInvoke的定义 invoke的含义是:在拥有此控件的基础窗口句柄的现呈上同步执行指定的委托(同步) ...

  10. Js的reduce()方法

    Js 数组reduce()方法应用一个函数针对数组的两个值(从左到右),以减至一个值. 语法:array.reduce(callback[, initialValue]) 参数说明: 1)callba ...