Java IO操作与字节流

本文介绍了Java中的文件操作及输入输出流的基本概念,包括File类的使用、不同类型的流(如节点流、过滤流等)、字符集编码、RandomAccessFile的应用、对象序列化的过程及注意事项,并探讨了文件锁的实现。

一:File类:一个File类的对象表示了磁盘上的文件或目录;File类提供了与平台无关的方法来对磁盘上的文件或目录来进行操作。

二:流的分类:

      节点流:从特定的地方读写的流类,例如:磁盘或一块内存荡然区域.

      过滤流: 使用节点流作为输入输出.过滤流是使用一个已经存在的输入流或输出流连接创建的.

三:基本的流类:

  (1) FileInputStream和FileOutputStream:节点流,用于从文件中读取或往文件中写入字节流。若在构造FileOutputStream时文件已经存在,则覆盖这个文件。

  (2)BufferedInputStream和BufferedOutputStream:过滤流,需要使用已经存在的节点流来构造,提供带缓冲的读写,提高读写的效率。

 (3)DataInputStream和DataOutputStream:过滤流,需要使用已经存在的节点流来构造,提供了读写Java中的基本数据类型的功能。

(4)PipedInputStream和PipedOutputStream:管道流,用于纯种间的通信。一个线程的PipedInputStream对象从另一个线程的PipedOutputStream对象读取输入。要使用管道流有用,必须同时构造管道输入流和管道输出流。

四:Reader和Writer:

(1)Java程序语言使用Unicode来表示字符串和字符。

(2)Reader和Writer这两个抽象类主要用来读写字符流。

(3)Java.io包中的Reader的类层次参见JDK.

五:字符集的编码

(1)ASCII(American Standard Code for Information Interchange,美国信息互换标准代码),是基于常用的英文字符的一套电脑编码系统。英文中经常使用的字符,数字符号被计算机处理时都是以二进制码的形式出现的。这种二进制码的信号就是ASCII码。每一个ASCII码与一个8位(bit)二进制数对应。其最高位是0,相应的十进制数是0-127。如数字“0”的编码用十进制表示就是48,另有128个扩展的ASCII码,最高位都是1,由一些制表符和其他符号组成。ASCII码是现今最通用的单字节编码系统。

(2)GB2312:GB2312码是中华人民共和国国家汉字信息交换用的编码,全称《信息交换用汉字编码字符集——基本集》。主要用于给每一个中文字符指定相应的数字,即进行编码。一个中文字符用两个字节的数字来表示, 为了和ASCII码有所区别,将中文字符每一个字节的最高位置都用1来表示。

(3)GBK:为了对更多的字符进行编码,又制定了新的编码系统GBK。它除了完全兼容GB2312外,还对繁体中文,一些不常用的汉字和许多符号进行编码。

(4)ISO—8859—1:是西方国家所使用的字符编码集,是一种单字节的字符集,而英文实际上只用了其中数字小于128的部分。

(5)Unicode:通用字符集,每个字符用2个字节表示。

(6)UTF—8:一个7位的ASCII码值对应的UTF码是一个字节。也是一通字符集。

六:RandomAccessFile

(1):RandomAccessFile类同时实现了DataInputStream和DataOutputStram接口,提供了对文件随机存取的功能,得胜这个类可以在文件的任何位置读取或写入数据。

(2):RandomAccessFile类提供了一个文件指针,用来标志要进行读写操作的下一数据的位置。

七:对象的序列化:

(1)将对象转换为字节流保存起来,并且在日后还原这个对象,这种机制叫做对象的序列化。

(2)将一个对象保存到永久存储设备上称为持续性。

(3)一个对象要想能够实现序列化,必须实现Serializable接口或Externalizable接口。

(4)当一个对象被序列化时,只保存对象的非静态成员变量,不能保存任何的成员方法和静态的成员变量。

(5)如果一个对象的成员变量是一个对象,那么这个对象的数据成员会被保存起来。

(6)如何一个可序列化的对象包含对某个不可序列化的对象的引用,那么整个序列化操作将会失败,并且会抛出一个NotSerializableException.我们可以将这个引用标记为transient,那么对象仍然可以序列化。(transient为关键字)

八:文件锁FilelLock

在程序中经常可能出现几个线程来处理同一个文件,如更新或读取文件,应对这样的问题作出处理,否则可能发生混乱。尽管可以使用多线程的同步来处理这样的问题,但将增加问题的复杂性和难度。FileLock,FileChannel类分别在java.nio和java.nio,channels包中。输入,输出流读写文件时可以使用文件锁。在流操作的时候创建的文件锁,只要不解除该锁,其他的线程无法操作被锁定的文件。下面以RandomAccessFile类例来说明使用文件锁的步骤:

(1)首先使用RandomAccessFile流建立指向文件的流对象,该对象的读写属性必须是rw,如:RandomAccessFile input=new RandomAccessFile("Example.java","rw");

(2)流对象input调用方法getChannel()获得一个连接到底层文件的FileChannel对象(信道),如:FileChannel channel=input.getChannel();

(3)信道调用tryLock()或lock()方法获得一个FileLock(文件锁)对象,这一过程也称做对文件加锁,如:FileLock lock=channel.tryLock();   文件加锁对象产生后,将禁止任何程序对文件进行操作或再进行加锁。对一个文件加锁之后,如果想读写文件必须让FileLock对象调用release()方法释放文件锁,如:lock.release();

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值