java io 详解 下
??6,内存操作流
之前讲解流 目标都是文件,现在如果有临时的信息要通过io操作的话如果这些临时的内容保存在文件之中就很不合理了
因为操作完还要将文件删除,所以此时在io中提供内存操作流,通过内存提供输出和输入的目标是内存。
使用ByteArrayOutputStream和ByteArrayInputStream完成内存的操作流
ByteArrayOutputStream :内存向程序输出
ByteArrayInputStream :程序向内存写入
?
?
?
?
?
?
?
使用PrintStream格式化输出
?
?
?
?
?
9,System类 对IO的支持
System类中存在三个常量:
public static PrintStream out?? 表示一个标准的输出,输出的位置是显示器
public static PrintStream err????? 表示错误,错误的输出
public static PrintStream in??? 表示键盘的输入,标准输入,
9.1 System.out
? System.out是PrintStream的实例化,常用的方法就是向屏幕打印信息,当然如果使用System.out的话也可以直接为OutputStream实例化。?
?
?
?
?
此时已经实现了键盘输入功能但是回收长度限制,而且在输入中文时会出问题。
?
?
?
?
?
此时长度没有限制了。但是在输入中文是就无法正确读取了 用之后讲解的BufferedReader完成
9.4输出输入重定向
System.out,System.in 都有固定的输出目标,都是屏幕
System.in 有固定的输入目标,都是键盘
但是在System类中提供了一系列的输入输出重定向的方法,可以改变System.out,System.err,System.in 的输入输出位置
System.out 重定向:public static void setOut(PrintStream out)
System.err 重定向:public static void setErr(PrintStream out)
System.in 重定向:public static void setIn(PrintStream out)?
?
?
?
?
?
之前说过System.err是不希望用户看到的 所以一般不建议改变它的重定向而是改变System.out的重定向。
??
?
10,BufferReader
实际上表示缓冲区读取,可以一次性把内容全读取进来
public BufferedReader(Reader in)
那么,如果使用BufferReader接收键盘输入的内容的话,则此时就无法直接实例化了,那么System.in属于InputStream类型的。
java中提供了两个专门的类,字节-字符流的转化类:
InputStreamReader:表示两字节的输入变为字节流
OutputStreamWriter:表示将字符的输出变为字节流
直接使用以上的类就可以完成转换功能,使用以下的方法可以读取数据:
public String readLine() throws IOException
表示一次性读取一行数据,而且一定要记住的是,如果返回的内容是String 是为好操作的,
范例 使用BufferReader完成输入?
如果想完成键盘的输入功能,以上的操作是最合适的,也是键盘输入数据的标准格式。
11,Scanner
Scaner 是一个新的操作类,是在java.util 包中提供的一个操作类,使用此类可以方便完成输入流的输入操作。?下面再看一个可以接受字符串的例子
?此类也可以用于正则匹配
?因为此类接受的是输入流的操作类,所以也可以完成文件的读取
?
12,字符编码
在程序中 如果编码没有处理完整,呢会造成乱码,常见的编码有以下几种:
UTF: 包含了以下的编码
ISO 8859-1 :包含全部的英文编码
GBK/GBK2312 :GBK包含全部简体和繁体,GB2312 只包含简体
观察本机系统编码:?
?
使用ObjectOutputStream完成序列化操作?
?
使用ObjectIntputStream完成反序列化操作?
?
以上操作实际上是将整个对象进行了序列化操作,如果现在假设类中某个属性不希望被序列化的话,则使用transient关键字声明。