由于Unicode每个字符使用了多个字节来存储信息,面向单个字节的原始流类 InputStream、OutputStream不便处理,所以抽象继承出来的Reader和Writer类专门处理基于两字节码元的Unicode字节流
available方法检查当前可用于读入的字节数量,因为流的读写可能被阻塞。
DataInputStream和DataOutputStream 可以以二进制形式读写所有基本Java类型。
FileInputStream fin = new FileInputStream("a.txt"); 某些流,如 FileInputStream从文件或 外部的位置上获取字节
DataInputStream din = new DataInputStream(fin); 其他流,如DataInputStream、PrintWriter能够将字节组封装在更有用的数据类型中。
double s = din.readDouble();
嵌套过滤器来添加多重功能。请求一个数据块并将其置于缓冲区中会显得更高效。
DataInputStream din = new DataInputStream(new BufferedInputStream(new FileInputStream("er.doc")));
FileOutputStream(File file,boolean append)
append true, 追加输出到文件末尾,原文件内容不被删除
append false, 删除原文件后重新输出
InputStreamReader类将包含字节(用某种字符编码方式表示的字符)的输入流转换成可以产生Unicode字符的读取器。
InputStreamReder in = New InputStreamReader(new FileInputStream("fef.txt"),"GBK");
PrintWriter 以文本格式打印字符串和数字。
Scanner 以文本格式读入数据
字符集
Charset cset=Charset.forName("ISO-8859-1"): //获取指定名称(不分大小写)的字符集
Set<String> aliaes = cset.alises(); //返回由别名构成的Set对象
如何编码Unicode 字符串的代码:
String str ="fefe";
ByteBuffer buffer = cset.encode(str);
byte[] bytes=buffer.array();
解码字节序列,需要有字节缓冲区:
byte[] bytes = ...;
ByteBuffer bbuf = ByteBuffer.wrap(bytes,offset,length);
CharBuffer cbuf=cset.decode(bbuf);
String str = cbuf.toString();