输入输出流
数据流
概念
- 数据流指一组有顺序的,有起点和重点的字节集合。
输入流
-
概念
- 只读,用于向计算机内输入信息使用。
-
主要的读取方法
-
int read()
- 从输入流中读取一个字节的二进制数据。
-
int read(byte [ ] b)
- 将多个字节读到数组中,填满整个数组。
-
int read(byte [ ] b,int off , int len)
- 从输入流中读取长度为len的数据,从数组b中下标为off欸点位置开始放置读入的数据,读毕返回读取的字节数。
-
当读取结束时,会得到 -1,以标志数据流的结束。
-
-
于BufferedInputStream流相关
-
void close()
- 关闭数据流
-
int available ()
- 返回目前可以从数据流中读取的字节数。
-
long skip(long l)
- 跳过数据流中指定数量的字节不读取,返回值表示实际跳过的字节数。
-
-
回推数据流的方法
-
boolean markSupported()
- 用语测试数据流是否支持回推操作,当一个数据流支持mark()和reset()方法时返回true。否则返回false。
-
void mark(intmarkarea)
- 用于标记数据流的当前位置,并划出一个缓冲区,其大小至少为指定参数的大小
-
void reset()
- 将输入流重新定位到对此流最后调用mark方法时的位置
-
输出流
-
概念
- 只写,用语从计算机中输出数据
-
主要的输出方法
-
void write(int i)
- 将字节i写入到数据流中,它只输入所读参数的最低8位。该方法是抽象方法,需要在其输出流子类中加以实现,然后才使用。
-
void write(byte b [ ])
- 将数组b中的全部b.length个字节写入数据流。
-
void write(byte b [ ],int off, int len)
- 将数据b[]中从下标off开始的len个字节写入数据流。元素 b [off]是此操作写入的第一个字节,b[off+len-1] 是此操作写入的最后一个字节。
-
void close()
- 当结束对输出数据流的操作时应该将其关闭。
-
void flush()
- 刷新此输出流并强制写出所有缓冲的输出字节。
- 为加快数据传输速度,提高输出效率,输出数据流会在提交数据之前把所有要输出的数据先赞数保存在内存缓冲区,然后成批输出。
每次输出的过程都以特定数据长度为单位进行传输。
数据的末尾一般都有一部分数据由于数量不够一个批次,而存留在缓冲区里,调用方法flush()可以将这部分数据强制提交。
-
从数据流中读出数据时,必须有一个数据源与该数据流相连
java数据流4个基本抽象类
用于字节传输(如二进制)
-
接口
- InputStream
- OutputStream
-
文件数据流
-
类
- FileInputStream
- FileOutputStream
-
其数据源或者数据终点都应该是文件
-
构造文件数据流时,可以直接给出文件名
-
-
过滤器数据流
-
一个过滤器数据流在创建时与一个已经存在的数据流相连,这样在从这样的数据流中读取数据时,它提供的是对一个原始输入数据流的内容进行了特定处理的数据。
-
缓冲数据流
- BufferedInputStream
- BufferedOutputStream
- 在数据流上增加一个缓冲区,都属于过滤器数据流。读写数据时,数据以块为单位先进入缓冲区(块的大小可设置),其后的读写操作用用于缓冲区。
此法可以降低不通硬件设别之间速度的差异,提高I/O的操作效率 - 此流还提供了对mark(),reset(),skip()方法的支持
- 一般关闭一个缓冲区输入输出流之前,先用flush()方法,强制输出剩余数据,以确保缓冲区内的所有数据全部写入输出流。
-
数据数据流
-
DataInputStream
- byte readByte()
- long readLong()
- double readDouble()
- boolean readBoolean()
- String readUTF()
- int readInt()
-
DataOutputStream
- void writeByte(int abyte)
- void writeLong(long aLong)
- void writeUTF(String aString)
-
允许通过数据流来读写java基本类型,包括boolean,float ,long, byte , double等。
-
-
对象流
-
作用:把对象写入文件数据流或者从文件数据流中读出
-
类
- ObjectInoutStream
- ObjectOutputStream
-
-
用于字符传输(如文本活ASCII)
-
Reader
-
Writer
-
用在字节流和字符流之间做中介
-
InputStreamReader
-
方法
- InputStreamReader(InputStreamReaderin)–默认规范
- InputStreamReader(InputStreamReader in,String enc)–制定规范
- void colose()
- void mark(intreadAheadLimit)
- boolean markSupported()
- int read()
- int read(char[] cbuf)
- boolean ready()
- void reset()
- long skip(long n)
-
-
OutputStreamWriter
-
方法
- OutputStreamWriter(OutputStreamWriter out) —默认规范
- OutputStreamWriter(OutputStreamWriter out,String enc) —指定规范
- void clost()
- void flush()
- void write(char[] cbuf)
- void write(int c)
- void write(String str)
- void write (String str, int off , it len)
-
-
-
缓冲区
-
BufferedReader
-
方法
- read()
- String readLine()
-
-
BufferedWriter
-
方法
- write()
- void newLine()
-
-
如果格式转换以较大数据块为单位,会提高效率
-
以字节流为基础的用于对象的永久化保存状态的机制
- ObjectInput
- ObjectOutput
序列化
对象的持久化:能记录自己的状态以便将来得到复原的能力。
- 意味着,可以吧这个对象存入磁盘,磁带
定义
- 对象通过数值来描述自己的状态,记录对象也就是记录下这些数值。
把对象转换成字节序列的过程叫对象的序列化。把字节序列恢复为对象的过程成为对象的反序列化。
任务
- 写出对象实例变量的数值
解释
- 同时一种用来处理对象流的机制,就是将对象的内容进行流化
解决问题
- 解决了在对对象流进行读写操作时引发的问题。
java中实现‘
- 只有实现Serializable接口的类才能被序列化,
允许可序列化对象通过对象流进行传输。
对象结构表
-
可序列化的变量类型
-
非静态成员变量
- 只能保存变量的值
-
-
transient关键词
-
作用
- 贝茨==被此关键词修饰的成员变量不会被保存
-
使用场景
- Tread对象或者流对象,不适合保存
- 保密字段
-
如果一个对象结构表中包含了一个对不可持久化对象的引用,而这个引用已用关键词transient加以标记,则这个对象仍可以被持久化。
-
字节于字符
字节
- ascII字符集以一个字节表示字符
- java中 ,两个字节表示一个字符
文件处理
File类
-
作用
- 获得文件基本信息及操作文件的一些方法
-
方法
-
与文件名相关
- String getName()
- String getPath()
- String getSbsolutePath()–绝对路径
- String getParent()
- boolean renameTo(File newName) --更改文件名,成功返回true,否则返回false
-
文件测定方法
- Boolean exists()
- Boolean canWrite()
- boolean canRead()
- boolean isFile()
- boolean isDirectory()
- boolean isAbsolute() --是否是绝对路径
-
常用文件信息和方法
- long lastModified()–获取文件最后一次修改时间
- long length()
- boolean delete()
-
目录工具
- Boolean mkdir() 创建目录
- boolean madirs()
- String [] list() – 列出符合模式的文件名
-
随机访问文件
-
作用
- 随意读取任意位置的记录
-
RandomAccessFile类
-
创建
-
使用文件名
- new RandomAccessFile(String name,String mode)
-
使用文件对象
- new RandomAccessFile(File file,String mode)
-
参数mode 决定以何种方式访问文件(只读/读写)
-
-
方法
-
long getFilePointer()
- 返回文件指针的当前位置
-
void seek(long pos)
- 将文件指针置于指定的绝对位置,位置值以文件开始处的字节偏移量pos计算,为0是从开始计算
-
long length()
- 长度
-
-
课后习题
简答
- 完成所有输入输出操作所需的类包含在那个软件包中?
- 什么叫做流?输入输出流分别对应那两个抽象类?
- InputStream有那些直接子类?其功能是什么?
- OutputStream有那些直接子类?其功能是?
- 使用缓冲区输出流的好处?为什么关闭一个缓冲区输出流之前,应该使用flush()方法?
- 读者和写者的作用是?
- 什么叫对象的序列化?如何实现对象序列化?