继续总结。
java 高级视频教程02——03.swf
1、在读取和写入数据时,需注意数据类型的转换
2、注意字节和字符之间的内存占用
java 高级视频教程 02——03.swf
节点流
一、理解流的概念
流是字节序列的抽象概念
数据的传输序列
文件是数据的静态存储形式——一些具有永久存储及特定顺序的有名称的字节有序字节的集合
流是数据传输时的形态——从IO设备写入和读取设备的方式
流的分类:节点流、过滤流类(处理流类)
InputStream类
程序可以从中连续读取字节的对象叫输入流,在java中,用InputStream类来描述所有流的抽象概念。
描述了各种流类读取数据的通用方法。
InputStream类的方法:
int read() ——用于获取读到的字节数
遇到流的结束,返回值-1,如果读不到数据会发生阻塞
int read(byte[] b)
int read(byte[] b,int off,int len)
long skip(long n)——用于包装类的流的跳转
int available()——返回当前输入流中可读的字节数,一般用于检查流中是否有数据可以读取,同时也可以避免流发生阻塞(read()方法入果未读到数据则会发生阻塞)。
void mark(int readlimit)——在输入流中建立标记,在建立标记的位置开始计算最多还能读取多少字节的内容。
void reset()——和mark()方法配合使用,让其指针回到以前的标记处
boolean markSupported()—— 返回当前的流对象是否支持mark()和reset()操作
void close()——关闭流,释放与流相关的资源
InputStream类是抽象类,实际使用的都是InputStream类的子类对象,不是所有子类都支持InputStream类定义的方法。
有了垃圾回收器,为什么还要调用close方法。
垃圾回收期只能产生类对象,而InputStream在实例化后多产生系统的类。
OutputStream类
程序可以想起连续写入字节的对象叫输出流,在java中,用OutputStream类来描述所有输出流的抽象概念。
OutputStream类也是抽象类,也没有对应到具体的流设备,只是描述流设备输出时的共性。描述了流类写入数据时的通用方法。
OutputStream类的方法:
void write(int b)——将整数字节最低字节流的内容写到数据当中
void write(byte[] b)
void write(byte[] b.int off,int len)
void flush()——用于将内存缓冲器的内容彻底的清空,并输出到目标IO设备当中
void close()——关闭输出流对象
java 高级视频教程 02——05.swf
FileInputStream类——指定文件应该是可读的。
创建的两种方式:
FileInputStream inOne = new FileInputStream("路径")
File f=new File("路径");
FileInputStream inTwo = new FileInputStream(f);
FielOutputStream类——若文件已存在,则内容会覆盖。
附:输入类和输出类是相对于程序而言。
Reader类和write类
是所有字符流类的抽象基类,用于简化字符串的输入输出的便曾,即用于读写文本数据。
二进制文件和文本文件的区别。
如果一个文件专用于存储文本字符,并不包含文本字符之外的其他数据,称之为文本文件。除此之外的文件称之为二进制文件。
java 高级视频教程 02——06.swf
PipedInputStream类PipedOutputStream类
用于在应用程序中创建通信管道通信。
主要完成线程之间的通信。
常用方法:
connect(链接对象); 进行通信链接
start(); 启动链接
PipedWrite类和PipedReader类
用户处理字符文本的管道通信。
使用管道流类可以实践各个程序模块之间的松耦合通信。
ByteArrayInputStream类和ByteArrayOutputStream
用户IO流的方式来完成对字节数组内容的读写,从而实现内存虚拟文件或内存映像文件的功能。
ByteArrayInputStream两个构造函数:
ByteArrayInputStream(byte[] buf)
ByteArrayInputStream(byte[] buf,int offset,int length)
ByteArrayOutputStream两个构造函数:
ByteArrayOutputStream()
ByteArrayOutputStream(int)
用户创建缓冲区。
StringReader类和StringWriter类
以字符IO的方式处理字符串,分别对应ByteArrayInputStream类和ByteArrayOutputStream类。
重视IO程序代码的可复用性
1、Sytstem.in 链接到键盘,是InputStream类型的实例对象。System.out 链接到显示器,是PrintStream类的实例对象。
2、不管各种底层屋里设备用什么方式实现数据的终止点,InputStream的read方法总是返回-1来表述输入流的结束
3、在window下ctrl+z组合、linux下ctrl+d 产生键盘输入流的结束标记。
经验总结:
如果编写从键盘上读取一大段数据的时候,应尽量读取的过程放到函数中完成,使用-1来作为键盘输入的结束点。
在该函数中编写的程序代码不应直接使用System.in读取数据,
而是用一个InputStream类型的形式参数对象来读取数据,
然后将System.in作为实参数传递给InputStream类型的形式参数来调用该函数。
java 高级视频教程 02——07.swf
字符编码:
计算机里只有数字,计算机软件里的一切都是用数字来表示的,屏幕上显示的一个个字符也不例外。
ascii最高bit位都为0,也就是说这些数字都在0-127之间。
GB2312可以理解为GBK的子集
Unicode编码
Unicode是在ascii原来占用的一个字节前面,增加一个bit为0的字节。
unicode只占用2个字节。
utf-8编码
ascii码保持原样,仍然只占用一个字节,对于其他国家的字符,utf-8使用两个或三个字节来表示。
使用utf-8编码的文件,通常都要用EE BB BF作为文件开头的三个字节数据
utf-8优点:
不出现内容为0x00字节
便于应用程序监测数据在传输过程中是否发生了错误
直接处理ascii码得英文文档。
utf-8缺点:
某些字符需要使用三个字节。
utf-16编码
utf-16编码在unicode基础上进行了细节的扩充,增加了对unicode编码没有包括的字符的表示方式。
utf-16对unicode的扩充没有影响unicode编码所包括的那些字符,只是增加了对unicode编码没有包括的那些字符的表示方式,一个使用unicode编码的字符就是utf-16格式的。
0xD800-0xDFFF区间的数值保留出来,utf-16扩充的字节,占用四个字节,前面两个字节的数值为0xD800-0xD8FF之间,后面两个字节的数值为0xDC00-0xDFFF之间。
为什么不让前面和后面两个字节的数值都位于0xD800-0xDFFF之间呢?
容易确定一个字符和下一个字符之间的边界。
在不同体系结构的计算机中,utf-16编码在unicode字符在内存中存储的顺序是不同的。
两种存储的格式:Little-Endian和Big-Endian
JAVA高级视频_IO输入与输出_收获二
最新推荐文章于 2024-08-10 16:13:20 发布