内容概要:

Java以流的形式处理所有输入和输出。流是随通信路径从源移动到目的地的字节序列。

内存与存储设备之间传输数据的通道

流的分类:

按方向

输入流:将存储空间中的内容读到内存中   硬盘-->内存   外部源-->程序

输出流:将内存中的内容写到存储设备中

按单位

字节流:以字节为单位,可以读写所有数据

字符流:以字符为单位,只能读写文本数据

按功能

节点流:具有实际传输数据的读写功能

过滤流:在节点流的基础之上增强功能

缓冲流

缓冲输入流

可以说没有定义缓冲流时,我在进行输入流时,就像拿着灌满水的水杯往缸里装水,定义缓冲区后,我就先将杯子里的水装进水桶里,待水桶装满,再将水桶中的水往缸里倒。

减少往缸里运水的次数,从而提高效率

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException; //BufferedInputStream
public class Demo03 {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("d:\\1764\\aaa.txt");
//BufferedInputStream bis = new BufferedInputStream(fis);
//定义缓冲区
/*int data = 0;
while ((data = bis.read()) != -1){
System.out.print((char)data);
}*/
//自定义缓冲区
byte[] buf = new byte[1024];
int count = 0;
while ((count = fis.read(buf)) != -1){
System.out.println(new String(buf,0,count));
}
bis.close();//只需关闭缓冲输入流,输入流也会跟着关闭
}
}

缓冲输出流

import java.io.BufferedOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException; //字节输出缓冲流
public class Demo04 {
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("d:\\1764\\aaa.txt");
BufferedOutputStream bos = new BufferedOutputStream(fos);
int count = 0;
for (int i = 0; i < 10; i++) {
bos.write("helloworld\n".getBytes());//写入缓冲区
bos.flush();//刷新到硬盘,如果没有写,当断电时,会出现没有写到硬盘上的问题,导致数据丢失;在write中当缓冲区满时,会自动调用flushBuffer方法写出
}
bos.close();//关闭的时候内部也会调用flush方法
System.out.println("打印结束");
}
}

一  什么叫序列化

通俗点讲:它是处理对象流的一种机制,即可以很方便的保存内存中java对象的状态,同时也为了方便传输。

二 序列化有什么作用

1.方便传输,速度快,还很安全,被调用方序列化,调用方反序列化即可拿到传输前最原始的java对象,常用于不同进程之间的对象传输

2.方便存储,不管是存储成文件还是数据库,都行,存储为文件,下回要用可以直接反序列拿到对象

三 怎么序列化和反序列化

实现序列化接口就行(里面什么方法都没有,不用管的,只是一个标记接口而已)Serializable;

至于他们的代码怎么写,网上例子很多,随便搜一下就行了


//ObjectOutputStream实现对象的序列化
Student
//序列化类必须实现Serializable接口
//标志可以进行序列化
import java.io.*;
//序列化类必须实现Serializable接口
class Student implements Serializable { //标志可以进行序列化
private String name;
private int age; public Student() {
} public Student(String name, int age) {
this.name = name;
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} @Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
//ObjectOutputStream实现对象的序列化
public class Demo05 {
public static void main(String[] args) throws IOException {
//创建对象流
FileOutputStream fos = new FileOutputStream("d:\\1764\\aaa.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
//进行序列化(写入操作)
Student s1 = new Student("张三",20);
oos.writeObject(s1); oos.close();
System.out.println("序列化完毕");
}
}
//使用ObjectInputStream实现反序列化(读取重构成对象)
//使用ObjectInputStream实现反序列化(读取重构成对象)

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;public class Demo06 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//创建对象流
FileInputStream fis = new FileInputStream("d:\\1764\\aaa.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
//读取文件(反序列化)
Student s = (Student) ois.readObject(); ois.close();
System.out.println("执行完毕");
System.out.println(s.toString());
}
}

关于序列化类

import java.io.*;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.LinkedList;
//1.序列化类必须要实现Serializable接口
//2.序列化类中对象属性要求实现Serializable接口
//3.序列化版本号ID serialVersionUID,保证序列化的类和反序列化的类是同一个类
//4.使用transient(瞬间的) 修饰属性,这个属性不能序列化
//5.静态属性不能序列化
//6.序列化多个对象,可以借助集合实现
//ObjectOutputStream实现对象的序列化
public class Demo05 {
public static void main(String[] args) throws IOException {
//创建对象流
FileOutputStream fos = new FileOutputStream("d:\\1764\\aaa.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
//进行序列化(写入操作)
Student s1 = new Student("张三",20);
Student s2 = new Student("李四",18);
ArrayList<Student> list = new ArrayList<>();
list.add(s1);
list.add(s2);
oos.writeObject(list); oos.close();
System.out.println("序列化完毕");
}
}

then  ObjectInputStream

//使用ObjectInputStream实现反序列化(读取重构成对象)

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.Serializable;
import java.util.ArrayList; public class Demo06 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//创建对象流
// new String();//ctrl shift alt u
FileInputStream fis = new FileInputStream("d:\\1764\\aaa.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
//读取文件(反序列化)
// Student s = (Student) ois.readObject();
// Student s1 = (Student) ois.readObject();
ArrayList<Student> list = (ArrayList<Student>) ois.readObject();
ois.close();
System.out.println("执行完毕");
System.out.println(list.toString()); } }

IO流(一)的更多相关文章

  1. Java基础之IO流

    很长时间都没有更新了,最近在补充JavaSE的一些细节部分 关于IO流的一些总结 首先要介绍的是File类,File类用于对文件和目录的一些操作 1.创建文件CreateNewFile() 2.对文件 ...

  2. Java中IO流,输入输出流概述与总结

    总结的很粗糙,以后时间富裕了好好修改一下. 1:Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中.其中, 所有输入流类都是抽象类InputStream(字节输入 ...

  3. Java:IO流与文件基础

    Java:IO流与文件基础 说明: 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列的对象 ...

  4. java IO流详解

    流的概念和作用 学习Java IO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...

  5. IO流总结

    IO流的作用:用于设备和设备之间的数据传输. IO流的概念:流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象. IO流的分类:  按照操作数据的类型分为两种: 字节流和字符流.  按 ...

  6. IO流

    流的概念和作用 学习JavaIO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特 ...

  7. Java IO流学习总结

    Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...

  8. 揭开Java IO流中的flush()的神秘面纱

    大家在使用Java IO流中OutputStream.PrintWriter --时,会经常用到它的flush()方法. 与在网络硬件中缓存一样,流还可以在软件中得到缓存,即直接在Java代码中缓存. ...

  9. java IO流 之 其他流

    一.内存操作流(ByteArrayInputStream.ByteArrayOutputStream) (一).   public class ByteArrayInputStream extends ...

  10. java IO流 之 字符流

    字符是我们能读懂的一些文字和符号,但在计算机中存储的却是我们看不懂的byte 字节,那这就存在关于字符编码解码的问题.所以在学习Io流的字符流前我们先了解些关于编码问题. 一.字符集与字符编码 1.什 ...

随机推荐

  1. Android系统编程入门系列之应用级文件在应用程序间的共享

    在上篇文章了解到应用级文件只能被其所创建的应用程序所访问,那么其他应用程序是不是就无论如何都无法访问了呢?肯定不是的,只要文件经过其创建的应用程序授权,还是可以被其他应用程序所访问的.这也就是应用级文 ...

  2. Django+Nginx+Uwsgi(全网最全步骤工作原理流程与部署历程)

    一.必要前提 1.1 准备知识 django 一个基于python的开源web框架,请确保自己熟悉它的框架目录结构. uWSGI 一个基于自有的uwsgi协议.wsgi协议和http服务协议的web网 ...

  3. 暑期 2021 | Serverless Devs 最全项目申请攻略来啦!

    Serverless 是近年来云计算领域热门话题,凭借极致弹性.按量付费.降本提效等众多优势受到很多人的追捧,各云厂商也在不断地布局 Serverless 领域.但是随着时间的发展,Serverles ...

  4. SpringBoot-使用异步

    SpringBoot提供了异步的支持,上手使用十分的简单,只需要开启一些注解支持,配置一些配置文件即可! 编写方法,假装正在处理数据,使用线程设置一些延时,模拟同步等待的情况: service: @S ...

  5. C 可变参数列表 stdarg.h

    内容来自<c和指针>,整理后方便个人理解 stdarg.h 菜鸟教程 - <stdarg.h> 类型 va_list 宏 va_start va_arg va_end #inc ...

  6. /usr/bin/python^M: bad interpreter: No such file or directory

    利用如下命令查看文件格式 :set ff 或 :set fileformat 可以看到如下信息 fileformat=dos 或 fileformat=unix 利用如下命令修改文件格式 :set f ...

  7. vue介绍啊

    声明式渲染:vue的核心是一个允许你才用一个简洁的模板语法来声明式的将数据渲染进行DOM的系统 html部分:<div id="app"> {{message}}< ...

  8. 【数据结构与算法Python版学习笔记】基本数据结构——列表 List,链表实现

    无序表链表 定义 一种数据项按照相对位置存放的数据集 抽象数据类型无序列表 UnorderedList 方法 list() 创建一个新的空列表.它不需要参数,而返回一个空列表. add(item) 将 ...

  9. Golang通脉之反射

    什么是反射 官方关于反射定义: Reflection in computing is the ability of a program to examine its own structure, pa ...

  10. OO第二单元电梯作业总结

    目录 目录一.第一次作业分析设计策略基于度量分析程序结构二.第二次作业分析设计策略基于度量分析程序结构三.第三次作业分析设计策略基于度量分析程序结构四.分析自己程序的bug五.发现别人程序bug所采用 ...