07 JAVA IO流

来源:互联网 发布:mac邮件设置qq邮箱 编辑:程序博客网 时间:2024/05/17 09:16

还是我大中国的民谣好听~啦啦啦~

   10.......

文件,网络等《-------------》程序

各种各样的流类用来获取不同种类的数据(自我提醒:文章中的缓存就是缓冲区,*_* ,懒得改了,我的blog我做主)

  • java.io包里定义了多种流类型:

- 输入流,输出流(站在程序的角度

- 字节流(一个字节),字符流(两个字节,JAVA采用UTF-16)

- 节点流(数据源《-》程序),处理流(嵌套流,处理流连接在已存在的流上面,通过对数据处理为程序提供更强大的读写功能)

java.io所有类型都分别继承4个抽象流类型(4种管道):


构造流的时候,可以指定编码集合,比如“ISO8859-1”(西欧语言,Latine-1);输出流指定的文件不存在的时候,会自动创建一个,但不能自动创建目录哦~

  • InputStream,向程序输入数据(其实是某块内存),数据单位为一个字节
- int read() 读取一个字节(返回整数,范围为0~255,如果-1则表示输入流已经到了末尾)
- int read(byte[] buffer) 读取一组字节存储到一个数组buffer中,返回实际读取到的字节数,如果读取前已经到了输入流的末尾返回-1
- int read(byte[] buffer, int offset, int length) 第一个字节被存储在buffer[offset]中
- int close() 关闭流释放内存资源
- long skip(long n) 跳过n个字节不读(记住long是8个字节哦),返回实际跳过的字节数
  • OutputStream,用于程序输出数据,单位同样是字节
- void write(byte[] b) 将一个字节类型的数组写入输出流
- void write(byte[] b, int offset, int length)
- void close()
- void flush() 一般buffer被填满之后才被进行处理,close不管缓存是否已经都写入就直接关闭管道,太暴力了,我们一般我们会在write之后或者close之前加上flush方法
  • Reader,向程序中输入字符(字符是两个字节的,有时我们需要以字符为单位传送,比如中文一般都是两个字节来表示,如果只传送了一个字节,那么,呃呃呃,半个字?)
- int read(char[] cbuf) 去一些列字符存储到一个数组buffer中,并且返回实际读取的字符数,如果读取前已经到达了输入流的末尾则返回-1
- 其他方法与InputStream类似
  • Writer,输出数据,以字符为单位
- void write(char c) 写入一个字符
- void write(char[] cbuf) 写入一个字符数组
- void write(String string) 写入一个字符串(String->char[] toCharArray)
  • 节点流(File, Memory ByteArray, Memory String, Pipe)

  • 处理流,提供对数据更好的读写方式(字节-》字符,数据/对象的读写,缓存流[newLine, readLine, mark, reset],输出流)
- 缓存流,套接到其他的输入、输出流之上,对读写的数据提供了缓存功能,提高了读写的效率,同时增加了一些新的方法
1. mark(int readlimit) 为某个位置做标记
2. reset() 回到刚才标记的位置
3. readLine()读取一行字符串,以\r或\n分隔
4. newLine() 写入一个行分隔符
5. flush() 写出的数据会先在内存中缓存,使用flush方法将会使内存中的对应数据立刻写出



- 转换流(字节-》字符)
- 数据流,提供了存取JAVA原始基本数据的方法
- Print流,它只有输出流,PrintWriter和PrintStream分别针对字符和字节,连个类不抛出异常(被定义抛出异常的方法都需要捕获想要的异常),并且提供了重载的print和println,用户检测错误状态获取错误信息,What's more,他们都有自动flush功能~



- Object流,直接将Object写入或读出硬盘,实现持久化(将整个对象写进去,而不是一小块一小块属性的存储)
将Object->字节流
1. Serializable接口,没有重写,标记接口,因为没有定义方法,只是为了告诉别人说这个类是可以序列化的
2. transient,透明,就是序列化的时候不予考虑,不写入硬盘,此时会存储初始默认的值,比如0,null等
3. externalizable接口,我们可以通过实现它来自己控制对象序列化的实现

Something else:

StringBuilder:可变字符序列,与StringBuffer没什么区别

StringBuilderStringBuffer

线程不安全,效率高线程安全,效率低


Reference:

1、马士兵JAVA基础视频

0 0
原创粉丝点击