JAVA流的知识点

概念:存储和内存之间的传输数据的通道.(硬盘和内存之间)

一、流的分类:

1.按方向:

输入流(input):将“存储设备”中的数据留到“内存(程序)”中。

输出流(output):将“内存(程序)”中的数据流到“存储设备”中去。

2.按单位:

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

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

3.按功能:

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

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

字节流的父类(抽象):
InputStream:字节输入流:

int available() 返回从该输入流中可以读取(或跳过)的字节数的估计值,而不会被下一次调用此输入流的方法阻塞。

void close() 关闭此输入流并释放与流相关联的任何系统资源。

void mark(int readlimit) 标记此输入流中的当前位置。

boolean markSupported() 测试这个输入流是否支持 mark和 reset方法。

abstract int read() 从输入流读取数据的下一个字节。

int read(byte[] b) 从输入流读取一些字节数,并将它们存储到缓冲区 b 。

int read(byte[] b, int off, int len) 从输入流读取最多 len字节的数据到一个字节数组。

void reset() 将此流重新定位到上次在此输入流上调用 mark方法时的位置。

long skip(long n) 跳过并丢弃来自此输入流的 n字节数据。

OutputStream:字节输出:

void close() 关闭此输出流并释放与此流相关联的任何系统资源。

void flush() 刷新此输出流并强制任何缓冲的输出字节被写出。

void write(byte[] b) 将 b.length字节从指定的字节数组写入此输出流。

void write(byte[] b, int off, int len) 从指定的字节数组写入 len个字节,从偏移 off开始输出到此输出流。

abstract void write(int b) 将指定的字节写入此输出流。

二、文件字节流:

1.FileInputStream:–public int read(byte[] b)// 从流中读取多个数据,将读到的内容存入b数组,返回实际读到的字节数,,如果达到文件的结尾,则返回-1.

2.FileOutputStream:–public void write(byte[] b)//一次写多个字节,将写的字节读入输出流.(就是把想要写进文件里面的字符串写在代码里面,代码会帮你写进字符串里面)

FileOutputStream fop = new FileOutputStream("D:\\aa.txt");
//如果改成FileOutputStream fop = new FileOutputStream("D:\\aa.txt",true);则会变成运行一次在后面加一次123456;
String str = "123456";
fop.write(str.getBytes());
//就是用这三行代码可以把123456输入到aa.txt里面。

三、字节缓冲流
import  java.io.BufferedInputStream;
import  java.io.BufferedOutputStream;
用处:1.提高IO流效率,减少访问磁盘的次数;2.数据存储在缓冲区,flush是将缓冲区的内容写进文件里面,也可以直接close。

在创建BufferedOutputStream对象之后,关闭bis对象时默认也会关闭fis对象,因此只用调用bis.close();即可关闭两个。

输出(output)缓冲区会把write方法里面的内容存在缓冲区,要输入文件就要调用flush方法写入文件。

四、对象流:(ObjectInputStream和ObjectOutputStream)

两个基本方法:

1.readObject:从流中读取一个对象。

2.writeObject(Object obj):向流中写入一个对象。

称为序列化和反序列化,下面来解释:

1.序列化:(类似于在硬盘里面输出对象)(ObjectOutputStream)

*注意:序列化时在要输出的类当中,必须要调用一个接口:implements Serializable。

2.反序列化:(类似于往流里面输入对象)(ObjectInputStream)

我们可以使用对象.toString方法打印出写入流的数据。(方法,属性等等)

*序列的注意事项:

1.必须使用Serializable接口。(包括属性也是一样)

2.序列化版本号ID可以在类中定义,保证序列化和反序列化的ID是相同的值。(更改了声明对象的类的序列化ID之后,不能直接反序列化,必须先序列化一次使得硬盘中的序列号相同才能下一步反序列化)。

3.使用transient(瞬间的)修饰属性,这个属性不能被序列化。

4.静态的属性不能序列化。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值