ByteArrayInputStream and ByteArrayOutputStream classes:
用于以IO流的方式完成对字节数组内容的读写,来支持类似内存虚拟文件或者内存映像文件的功能。
两个构造函数:
ByteArrayInputStream (byte[] buf)
ByteArrayInputStream(byte[] buf, int offset, int length)
ByteOutputStream class:
Constructor:
ByteOutputStream ()
ByteArrayOutputStream(int)
重视IO程序代码的复用
System.in 连接硬盘,是inputstream类型的实例对象,system.out连接显示器,是printStream类得实例对象。
不管各种底层物理设备用什么方式实现数据的终止点,inputstream的read总是返回-1来表示输入流的结束。
字符编码:(需要了解更多)
计算机里面之哟数字,计算机软件里面的一切都是用数字来表示的;
ASCII—美国标准信息交换码,ASCII最搞bit位为0,????
GB2312—国标码,中国简体,最高bit位是1????
GBK—包括繁体
BIG5—太晚编码
Unicode编码—全球的,占用两个字节,保留2000+数值没有用于字符编码。
Java字符使用都是用unicode编码,java在通过unicode保证跨平台特性的前提下,也支持本地平台字符集。
UTF-8编码--/u0001~/u007f, UTF-8占用一个字节保持 begins with 0
/u0000 && /u0080 ~ /u07ff两个字节 begins with 110 or 10
其他三个字节 begins with 1110
UTF-16编码:
在unicode基础上进行了一些细节上的扩充,增加了对unicode编码没有包括的那些字符的表示方式。
Unicoe讲0Xd800~0xDfff的数值保留下来,UTF-16扩充的字符,占用四个字节;前两个字节为0Xd800~0xDfff,后面两个字节的数值为0XDC00~0XDFFF之间。
字符编码(有点搞不清楚)
字符编码应用的一个奇怪现象
用notepad分别打“联通”“联想”“联”保存,只有联想有正常的保存效果。哈哈哈,果然有奸情。
不是有奸情,呵呵,那是因为文本保存的时候,对于UTF-8,在保存的时候前面应该有一个头部,但是之前都是没有的,所以在实际应用中,保存的时候是根据文本内容的特征去保存。就好像“联”,因为二进制是1100 0001 1010 1010,跟UTF-8的保存特征一样,优先保存为UTF-8,“通”也是UTF-8的特征,保存“联”跟“联通”都是UTF-8特征,所以保存为UTF-8。“联想”的“想”字是1100 1111 1110 1011与UTF-8保存特征不一样,所以用国标保存。
字符编码的编程体验:
打印中文字符的unicode码
打印中文字符的GB2312码
验证写入到屏幕输出流的中文字符所采用的编码
查看系统的缺省编码
修改系统的缺省编码
验证从键盘输入流仲读取的中文字符所采用的编码
研究GB2312码到unicode码得解码过程
GB2312的中文字符被按照ISO8859-1字符集解码生成了unicoe字符串后,如何将这个字符串转换成正确unicode编码字符串。
视频第七八再看。
System.getProperities().list(System.out); list all the default configurations
视频9和10是字节码编程
视频11—过滤流和包装流
包装类的概念与作用
BufferedInputStream and BufferedOutputStream class
缓冲区为I/O流增加了内存缓冲区,增加缓冲区有两个基本目的:
1. 允许java程序依次不只操作一个字节,这样提高了程序的性能
2. 由于缓冲区,是的在流上执行skip,mark和reset方法都成为可能。
BufferedInputStream and BufferedOutputStream class是java提供的两个缓冲区包装类,不管底层系统是否使用了缓冲区,这两个类在自己的实例对象中创建缓冲区。
底层缓冲区是一下读取很多,java缓冲区是一下读取一个直到程序limit
BufferedInputStream constructor:
BufferedInputStream(InputStream in) //32 bytes
BufferedInputStream(InputStream in, int size) 4的整数倍,自己定义大小
BufferedOutputStream constructors:
BufferedOutputStream(OutputStream out)
BufferedOutputStream(OutputStream int size)
通过flush写入系统缓冲区;
BufferedReader and BufferedWriter classes
BufferedReader的readLine可以读取一行文本
视频12—DataInputStream and DataOutputStream class
DataOutputStream class provide three methods for inputing string
Public final void writeBytes(String s)
Public final void writeChars(String s)
Public final void writeUTF(String str)
Why DataInputStream has only readUTF method but “readBytes” and “readChars”?
DataOutputStream 包装BufferedOutputStream, BufferedOutputStream 包装FileOutputStream,记得关闭DataOutputStream.但是结果跟老师不一样。
PrintStream class
提供一系列得print安顿pirntln方法,可以将基本数据类型的数据格式化成字符串输出。
格式化输出是什么意思:譬如97被格式化输出的实际字节数据为0x39 和0x37。
PrintStream has three constructors:
PirntStream(outputstream out)
PirntStream(outputstream out, Boolean autoflush)出现/n,自动刷新缓冲区
PirntStream(outputstream out, Boolean autoflush, string encoding)还会指定字符集编码。
与printstream想对应printwriter,几时遇到文本换行标志/n,printwriter也不会自动刷新缓冲区。
Video13—objectinputstream and objectoutputstream
Objectinputstream与objectoutputstream
用于从底层输入流中读取对象类型的数据和将对象类型的数据写入到底层输出流
所读写的对象必须实现了serializable interface,对象中的transient and static类型的成员变量不会被读取和写入。
字节流与字符流的转换
Inputstreamreader and outputstreamwriter,是用于将字节流中的字节解码成字符后读取,outputstreamwriter将字符编码成字节后写入字节流中。
Inputstreamreader的两个主要构造函数:
Inputstreamreader(inputstream in)
Inputstreamreader(inputsstream in, String CharsetName)
Outputstreamwriter 的两个主要构造函数()
Outputstreamwriter(outputstream in)
Outputstreamwriter(outputstream in,Strng charsetName)
不要直接用inputstreamreader和outputstreamwriter类来读写数据,应尽量使用bufferedwriter包装outputstreamwriter,用bufferedreader包装inputstreamreader
Video 14—java程序与其他进程的数据通信
在java程序中可以用process类的实例对象来表示子进程,子进程的标准输入和输出不在连接到键盘和显示器,而是以管道流的形式连接到父进程的一个输出流和输入流对象上。
调用process类得getoutputstream和getinputstream方法可以获得连接到子进程的输出流和输入流对象。
Video 15—字节输入流
Decorator设计模型:用一个对象包装另外一个对象,这个一种被称为decorator的设计模式
如果要设计自己的IO包装类,这个需要继承以FilterXXX命名的类;
这样囫囵吞枣看了,然后跟住张老师写code,虽然当时看懂了,但是我觉得不会深刻,最后他流的作业我也没做,因为根本就不够时间,唉,觉得这个IO还是挺有难度,特别是那些一个类包装一个类的时候,一定要在看完的时候好好把课后作业做了才行,后则,追不上老师学习的进度啊。。