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. tensorflow、cuda、cudnn之间的版本对应关系

    原文链接 tensorflow-gpu v1.9.0 | cuda9.0 |  cuDNN7.1.4可行  | 备注:7.0.4/ 7.0.5/ 7.1.2不明确 tensorflow-gpu v1. ...

  2. remove CMakeCache.txt and rerun cmake.On Debian/Ubuntu, package name is libncurses5-dev, on Redhat and derivates it is ncurses-devel.

    如果cmake提示下列错误:......CMake Error at cmake/readline.cmake:85 (MESSAGE):  Curses library not found.  Pl ...

  3. Unix程序员的Win10二三事

    macOS延续自BSD Unix, Linux则是从内核开始重新编写但延续Unix使用方式的Unix.所以mac还有linux程序员,一般都算是*nix程序员,尽管其中还有不少的区别. Windows ...

  4. 翻译 Asp.Net Core 2.2.0-preview1已经发布

    Asp.Net Core 2.2.0-preview1已经发布 原文地址 ASP.NET Core 2.2.0-preview1 now available 今天我们很高兴地宣布,现在可以试用ASP. ...

  5. Docker多主机管理(八)--技术流ken

    docker多主机管理 前面我们的实验环境中只有一个 docker host,所有的容器都是运行在这一个 host 上的.但在真正的环境中会有多个 host,容器在这些 host 中启动.运行.停止和 ...

  6. 【.NET Core项目实战-统一认证平台】第十五章 网关篇-使用二级缓存提升性能

    [.NET Core项目实战-统一认证平台]开篇及目录索引 一.背景 首先说声抱歉,可能是因为假期综合症(其实就是因为懒哈)的原因,已经很长时间没更新博客了,现在也调整的差不多了,准备还是以每周1-2 ...

  7. python-操作文件和目录

    操作文件和目录 为文件和目的操作经常用到os模块和shutil模块. 常用方法: 获取当前脚本工作的目录路径:os.getcwd(),返回的是str类型. 返回指定目录下的所有文件和目录名:os.li ...

  8. PHP指定日期转时间戳

    使用date_parse_from_format 可以转换指定的格式:举个例子: <?php $str = '2018.10.01';//或者 2018年10月1日 $arr = date_pa ...

  9. Java学习笔记——判断字符Character类

    常用方法 下面所说的均是静态方法,也就是可以不创建对象直接调用 例:Character.isLetter(char c); isLetter 判断参数是否为字母(不分大小写),返回结果 isDigit ...

  10. MySQL优化COUNT()查询

    COUNT()聚合函数,以及如何优化使用了该函数的查询,很可能是最容易被人们误解的知识点之一 COUNT()的作用 COUNT()是一个特殊的函数,有两种非常不同的作用: 统计某个列值的数量 统计行数 ...