JAVA高级视频_IO输入与输出_收获二

继续总结。


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










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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值