博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
thingking in Java I/O系统
阅读量:4151 次
发布时间:2019-05-25

本文共 4550 字,大约阅读时间需要 15 分钟。

2014.10.20-2014.10.23

10.22晚上blog登陆不上,没有写入英文句子与新闻,23早登陆发现22白天写的笔记不见了。特此说明。

Celebrate your gifts, enjoy them, but don' t take pride in them, take pride in your decision and hardwork.

庆幸你的天赋并好好利用吧,但不要因为天赋而沾沾自喜,应该为自己的勤奋和决断而自豪。

It's one of the things about God: he knows good and evil and has chosen the good.

这就是上帝的一个特别之处:他能够分辨善恶并且择善而从。

Is Milton powerful for the very straightforward reason that he's in possession of this tremendous literary strength, this unimaginable talent?

弥尔顿如此强大的直接原因,是否因为他拥有无穷的文学力量这一难以想象的天赋?

  由于上周工作任务完成没有bug,今天花了很多时间看完了容器深入研究。剩下的时间来学习第18章java I/O系统。

  要有看待历史的眼光。

File类名字既能代表一个特定文件的名称,又能代表一个目录下的一组文件的名称。

假设我们想查看一个目录列表,可以用两种两种方法来使用File对象。如果我们调用不带参数的list()方法,便可以获得此File对象包含的全部列表。然而如果我们想获得一个受限列表,例如,想得到所有扩展名为.java的文件,那么我们就要用到“目录过滤器”,这个类会告诉我们怎样显示符合条件的File对象。

File类不仅仅只代表存在的文件或目录。也可以用File对象来创建新的目录或尚不存在的整个目录路径。我们还可以查看文件的特性(如大小,最后修改日期,读/写),检查某个File对象代表的是一个文件还是目录,并可以删除文件。

流代表任何有能力产出数据的数据源对象或者有能力接收数据的接收端对象。“流”屏蔽了实际的I/O设备中处理数据的细节。

java中的流有两种,一种是字节流,另一种是字符流。

InputStream的作用是用来表示那些从不同数据源产生输入的类。这些数据源包括:字节数组、String对象、文件、“管道”、一个由其他种类的流组成的序列,以便我们可以将它们收集合并到一个流内。

OutputStream类型的类决定了输出所要去往的目标:字节数组、文件或管道。

FilterInputStream和FilterOutputStream是用来提供装饰器类接口以控制特定输入流(InputStream)和输出流(OutputStream)的两个类。

DataInputStream允许我们读取不同的基本类型数据以及Stream对象。其他FilterInputStream类则在内部修改InputStream的行为方式:是否缓冲,是否保留它所读过的行,以及是否把单一字符推回输入流等等。

以字节为导向的 stream , 表示以字节为单位从 stream中读取或往stream中写入

包括下面几种类型:
1. InputStream : 

1) ByteArrayInputStream :把内存中的一个缓冲区作为 InputStream 使用 

2) StringBufferInputStream :把一个 String 对象作为InputStream 

3) FileInputStream : 把一个文件作为 InputStream ,实现对文件的读取操作 

4) PipedInputStream : 实现了 pipe 的概念, 主要在线程中使用 

5) SequenceInputStream :把多个 InputStream 合并为一个InputStream

 6) FilterInputStream : 抽象类, 作为 ” 修饰器 ” 与其他对象相连以提供有用接口 

2.OutputStream : 

1) ByteArrayOutputStream :把信息存入内存中的一个缓冲区中

2) FileOutputStream : 把信息存入文件中

3) PipedOutputStream :实现了 pipe 的概念,主要在线程中使用

4) SequenceOutputStream :把多个 OutStream 合并为一个 OutStream  

5) FilterOutputStream : 抽象类, 作为 ” 修饰器 ” 与其他对象相连以提供有用接口

为了把来自于字节层次结构中的类和字符层次结构中的类结合起来使用,要用到适配器类:InputStreamReader可以把InputStream转换为Reader,而OutputStreamWriter可以把OutputStream转换为Writer。设计Reader和Writer继承层次结构主要是为了国际化。

无论何时使用readLine(),都不应该使用DataInputStream,而应该使用BufferdReader。

RandomAccessFile在任何情况下都是自我独立的,直接从Object派生而来。RandomAccessFile的工作方式类似于DataInputStream和DataOutputStream组合起来使用,还添加了一些方法。getFilePointer()用于查找当前所处的文件位置,seek()用于在文件内移至新的位置,length()用于判断文件的最大尺寸。只有RandomAccessFile支持搜寻方法,并且只适用于文件。

程序的所有输入都可以来自于标准输入,它的所有输出也都可以发送到标准输出,以及所有的错误信息都可以发送到标准错误,我们可以很容易的把程序串联起来,一个程序的标准输出可以成为另一程序的标准输入。

System.out和System.err事先被包装成了printStream对象,但System.in却是一个没有被包装过的未经加工的InputStream。这意味着尽管我们可以立即使用System.out和System.err,但是在读取System.in之前必须对其进行包装。System.in和大多数流一样,通常应该对它进行缓冲。

标准I/O重定向:

setIn(InputStream) setOut(PrintStream)setErr(PrintStream) 

I/O重定向操纵的是字节流而不是字符流;因此我们要使用的是InputStream和OutputStream,而不是Reader和Writer。

视图缓冲器(view buffer)可以让我们通过某个特定的基本数据类型的视窗查看其底层的ByteBuffer。ByteBuffer依然是实际存储数据的地方,“支持”着前面的视图。因此对视图的任何修改都会映射成为对ByteBuffer中数据的修改。

不同的机器可能会使用不同的字节排序方法来存储数据。“big endian”(高位优先)将最重要的字节存放在地址最低的存储器单元。而“little endian”(低位优先)则是将最重要的字节放在地址最高的存储器单元。ByteBuffer是以高位优先的形式存储数据的。并且数据在网上传送时也常常使用高位优先的形式。

ByteBuffer是将数据移进移出通道的唯一方式,并且我们只能创建一个独立的基本类型缓冲器。我们不能把基本类型的缓冲器转换成ByteBuffer。然而由于我们可以经由视图缓冲器将基本类型数据移进移出ByteBuffer,所以这也就不是什么真正的限制了。

Buffer由数据和可以高效地访问及操纵这些数据的四个索引组成,这四个索引是:mark(标记),position(位置),limit(界限)和capacity(容量)。

内存映射文件允许我们创建和修改那些因为太大而不能放入内存的文件。有了内存映射文件,我们就可以假定整个文件都放在内存中,而且可以完全把它当作非常大的数组来访问。建设映射文件花费很大,但整体受益比起I/O流还是很显著的。映射文件中的所有输出必须使用RandomAccessFile。

文件加锁机制允许我们同步访问某个作为共享资源的文件。文件锁对其他的操作系统进程是可见的,因为java的文件加锁机制直接映射到了本地操作系统的加锁工具。通过对FileChannel调用tryLock()或lock(),就可以获得整个文件的FileLock()。(SocketChannel、DatagramChannel和ServerSocketChannel不需要加锁,因为它们是从单进程实体继承而来;我们通常不在两个进程之间共享网络Socket。)tryLock()是非阻塞式的,它设法获取锁,但是如果不能获得,它将直接从方法调用返回。lock()则是阻塞式的,它要阻塞进程直至锁可以获得,或调用lock()的线程中断,或调用lock()的通道关闭。使用FileLock.release()可以释放锁。

文件映射通常应用于极大的文件。我们可能需要对这种巨大的文件进行部分加锁,以便其他进程可以修改文件中未被加锁的部分。例如数据库就是这样,因此多个用户可以同时访问到它。

Java I/O类库中的类支持读写压缩格式的数据流。可以用它们对其他的I/O类进行封装,以提供压缩功能。压缩类库是按字节方式而不是字符方式处理的。压缩类的使用非常直观--直接将输出流封装成GZIPOutputStream或ZipOutputStream,并将输入流封装成GZIPInputStream或ZipInputStream即可。其他全部操作就是通常的I/O读写。

JAR(Java档案文件):这种文件格式就像Zip一样,可以将一组文件压缩到单个压缩文件中。同java中其他任何东西一样,JAR文件也是跨平台的,所以不必担心跨平台的问题。声音和图像文件可以像类文件一样被包含在其中。一个JAR文件由一组压缩文件构成,同时还有一张描述了所有这些文件的“文件清单”(可自行创建文件清单,也可以由jar程序自动生成。)

Java的对象序列化将那些实现了Serializable接口的对象转换成一个字节序列,并能够在以后将这个字节序列完全恢复为原来的对象。这一过程甚至可通过网络进行;这意味着序列化机制能自动弥补不同操作系统之间的差异。

“持久性”意味着一个对象的生存周期并不取决于程序是否正在执行;它可以生存于程序的调用之间。

对象序列化的概念加入到语言中是为了支持两种主要特性。一是Java的远程方法调用(RMI),它使存活在其他计算机上的对象使用起来就像是存活于本机上一样。当向远程对象发送消息时,需要通过对象序列化来传输参数和返回值。

只要对象实现了Serializable接口,对象的序列化处理就会非常简单。

transient关键字可对序列化予以控制。

转载地址:http://miqti.baihongyu.com/

你可能感兴趣的文章
JSP的内置对象及方法
查看>>
android中SharedPreferences的简单例子
查看>>
android中使用TextView来显示某个网址的内容,使用<ScrollView>来生成下拉列表框
查看>>
andorid里关于wifi的分析
查看>>
Spring MVC和Struts2的比较
查看>>
Hibernate和IBatis对比
查看>>
Spring MVC 教程,快速入门,深入分析
查看>>
Android 的source (需安装 git repo)
查看>>
Commit our mod to our own repo server
查看>>
LOCAL_PRELINK_MODULE和prelink-linux-arm.map
查看>>
Simple Guide to use the gdb tool in Android environment
查看>>
Netconsole to capture the log
查看>>
Build GingerBread on 32 bit machine.
查看>>
How to make SD Card world wide writable
查看>>
Detecting Memory Leaks in Kernel
查看>>
Linux initial RAM disk (initrd) overview
查看>>
Timestamping Linux kernel printk output in dmesg for fun and profit
查看>>
There's Much More than Intel/AMD Inside
查看>>
CentOS7 安装MySQL 5.6.43
查看>>
使用Java 导入/导出 Excel ----Jakarta POI
查看>>