java学习小笔记(二.i/o)

来源:互联网 发布:java封装 编辑:程序博客网 时间:2024/04/19 20:03

二,I/O
1. 主要分为字节流和字符流 两大类,字节流的根类型是inputstream和outputStream ,字符流的跟类型是reader和writer 。字节流是初期i/o的主要工具,是数据传输时常用到的主要流,但是他对文本的读写操作方法不太方便。对文本操作较突出的工具是字符流,特别是printWriter和BufferReader

2.字节流向字符流过渡的包装类是 inputstreamReader和bufferStreamWriter,实质上是byte[] 向String的转变,而String向byte[]的转变是“fakg”.getBytes(),java中的这种通过包装流而获得额外的处理方法叫做 “装饰器模式”

3.两种流都有使用到缓冲区,网上有些人认为只有字符流才有缓冲区那是错的,字节流的缓冲流是BufferinputStream和BufferoutputStream 

4.当我们使用到写操作时都需要显式调用close(),如果不为所有的输出文件调用close(),就会发现缓冲区内容不会被刷新清空,使用close()可以强制清空。当然也可以使用flush()刷新输出流。实际上,当我们使用到流时我们最好养成良好的习惯,调用close()释放系统资源,如果你忘记了关闭,系统将会在流被清空时调用finalized回收资源。例外的是,close()对ByteArrayOutputStream和ByteArrayOutputStreamCharArrayWriter无效,即即使关闭流也可以对他们进行读写操作不会报异常

5.RandomAccessFile是一个特殊的流,他不在字节流和字符流的继承结构中,他的特别之处在于可以对文件进行随机读写,通过getFilePointer获取当前文件指针,通过seek方法定位设置,这功能在多线程断点下载时相当有用。

6.pipedInputStream管道流会在多线程任务间通讯用到

7.一个常见的程序化任务就是读取文件到内存,修改,然后再写出。(很多时候我们直接创建一个封装类专门对文件进行读修改写操作,方便在其他代码中也用到)
读:BufferedReader in = new bufferedReader(new FileReader(filename)); 接着while((s = in.readLine()) != null)然后创建一个StringBuilder去append读到的s
写:比读方便的是可以直接PrintWriter(new file(fileName))来代替new BufferedWriter(new FileWriter(fileName));,同样是用到了缓冲区,只不过是一种简便的写法。printWriter还有个用处是:PrintWriter out = new PrintWriter(System.out, true);  out.println(..);把字节输出流直接包装成一个字符输出流。

8.有时会用到标准io的重定向,使用setIn(InputStream) 和setOut(PrintStream)和setErr(PrintStream)

9.一些nio的笔记:nio就是new io,从java1.4开始引入的,他是为了提高传输数据速度引入的。使用更接近操作系统执行到io方式:通道和缓冲,通道相当于煤矿,缓冲就是卡车,我们每次从缓冲中获取数据(而不是直接从通道),唯一月通道直接交互的缓冲器是byteBuffer,在nio中,主要修改了fileOutputStream和fileInputStream和RandomAssessFile。他的使用是fileChanel chanel = new fileInputStream(fileName).getChannel(); ByteBuffer buffer =  ByteBuffer.allocate(int size); 
while(in.read(buffer)! = -1){ buffer.flip();  out.write(buffer); buffer.clear();} 不得不说他的步骤烦得要死,但是据说他的速度是最快的,好吧,你有种。

10.数据持久化,java的数据持久化有好几种,值得一提的是对象序列化,一般来说,对象依赖于程序,当程序关闭后,关于对象的数据都不存在了,要想程序不运行也能得到对象数据,做法就是对象序列化,实质上就是把实现了Serializable接口的对象转换成一个字节序列,并能够在以后将这个字节序列完全恢复为原来的对象,是他能够在网络中传输,序列化机制能够弥补不同操作系统之间的差异。如果要实现跟严格的持久化,用hibernate和数据库或者文件保存的方式。

11.有时为了输出可供另一个流恢复的数据,我们需要用到dataoutputStream写入数据,并用datainputStream恢复数据,这些流可以是任何形式,注意
dataoutputStream和datainputStream是面向字节的,可以使用writeUTF和readUTF方法,此外还有writeDouble和writeINTEGER等,如果要读写结构更复杂的数据,建议使用序列化对象和preference等。