传智播客的JAVA SE高级视频2 IO 自学笔记:
File类:
1.IO包中唯一代表磁盘文件本身信息的类,而不是文件中内容。
2.创建、删除、重命名文件等方法。
3.Java中目录被当作一种特殊文件使用,list方法返回所有子目录和文件。
4.Unix下路径分隔符'/',windows下分隔符为'/'。
RandomAccessFile类
支持随机访问方式。
RandomAccessFile类在随机(相对顺序而言)读写等长记录格式文件时有很大优势。可以将记录当成一个整体来读取。
RandomAccessFile类仅限于操作文件,不能访问其他IO设备,如网络、内存映像。
writeChars();
readChar();
流:字节序列的抽象概念
文件是数据的静态存储形式,而流是数据传输时的形态。
InputStream
int read() 读取一字节。为什么不返回byte呢?
因为二进制形式为11111111的数,以byte表示为-1,以int表示为255。返回-1表示读到文件尾。
int available();
OutputStream
void write(int b); // byte运算时自动提升为int
flush();
FileInputStream、FileOutputStream
PipedInputStream、PipedOutputStream
使用管道流类,可以实现各个程序模块间的松耦合通信。
ByteArrayInputStream、ByteArrayOutputStream
用于以IO流方式来完成对字节数据内容读写类似内存虚拟文件或内存映像文件功能。
System.in是InputStream类型
System.out是PrintStream类型
不管各种底层物理设备用什么方式实现数据终止点,InputStream的read方法总以-1表示结束。
windows下:Ctrl+Z表示键盘输入结束,Ctrl+C表示强制结束。
Unix/Linux下:Ctrl+D表示输入结束
建议:要编程从键盘上连续读取一大段数据时,应尽量将读取数据的过程放在函数中,使用-1作为输入结束。在函数中编写代码不应直接使用System.in读取,而应用一个InputStream类型的形参,然后将System.in作为实参传递给函数。
字符编码:
1.计算机里只有数字,计算机里一切都是用数字来表示的。
2.字符a对应数字97,b对应98,这种字符与数字对象的编码规则称为ASCII。ASCII最高位都为0,能标售0~127.
3.中文字符,用两个字节表示,每个字节最高位为1,编码为GB231(国标码)。
4.在GB2312上,对更多中文字符(繁体)进行了编码,新的编码规则称为GBK。
5.中国的"中"字,在大陆编码为D6D0,在台湾是A4A4,台湾地区对中文字符集的编码规则称为BIG5(大五码)。
6.在一个国家的本地化系统中出现的一个字符,通过网络传送到另一个国家的本地化系统中,看到的就不是原始字符了,而是另一个国家的一个字符或乱码。
Unicode编码:
1.ISO组织将全世界所有字符统一编码,称为Unicode编码。
2."中"字,在Unicode中对应的是4E2D。
3.Unicode占2字节,ASCII中字符只是简单地增加一个字节(0),Unicode中有63000多个字符,2000多个未使用。
4.未包括藏文、一些古字、满文等。
5.在相当长的一段时间内,本地化字符编码将与Unicode编码共存。
6.Java中字符使用Unicode编码。
UTF-8编码:
ASCII码字符保持原样,仍占1字节,对其他国家字符,UTF-8使用2或3个字节表示。使用UTF-8的文件,通常都要用EF BB BF作为文件开头的3个字节数据。
优点:不出现0x00字节,便于应用程序检测数据在传输中是否发生了错误。
缺点:有的字符占太多字节。
UTF-16编码(2字节):
在Unicode上扩充,增加了藏文、满文、古字、阿拉伯问等。
Unicode编码将0xD800-0xDFFF区间的数据保留处理,UTF-16扩充的字符,占用4字节。
String str="中国"; // Unicode
str.getBytes("GBK");
包装类:
DataOuputStream:写入各种类型数据,float、int...
PipedOutputStream
BufferedOutputStream
PrintStream:遇到换行,自动刷新,清空缓冲区。
PrintWriter:println方法会根据操作系统的不同而生成相应的文本换行符,windows下:"/r/n",Linux下:"/n"。遇到换行,不会自动刷新。
ObjectInputStream和ObjectOutputStream:所读写对象必须实现了Serializable接口,对象中static和transient不会被读写。
InputStreamReader和OutputStreamWriter
Java程序与其他进程数据通信(常用)
使用Process类表示子进程,子进程的标准输入和输出不是再连接到键盘和显示器,而以管道流的形式连到父进程的一个输出和输入流上。
Decorator设计模式(装饰者模式)
1.用一个对象(the Decorator)包装另一个对象,称为Decorator模式。
2.需要设计自己的IO包装类时,需要继承以FilterXXX命名的类。