2014.3.4 Java I/O

如果缺乏历史的眼光,很快我们就会对什么时候该使用哪些类,以及什么时候不该使用它们而感到困惑。

File,java.io;

* java.util.Arrays.sort();

* FilenameFilter接口,File.list(FilenameFilter):

public interface FilenameFilter{
// list()方法会为此目录对象下的每个文件名调用accept(),来判断该文件是否包含在内
	boolean accept(File dir, String name);
}
通过匿名内部类实现:

public static FilenameFilter filter(final String regex){
	return new FilenameFilter(){
// 传向匿名内部类的参数应为final
		private Pattern p=Pattern.compile(regex);
		public boolean accept(File dir, String name){
			return p.matcher(name).matches();
		}
	};
}
匿名内部类改进:

list=path.list(new FilenameFilter(){
	private Pattern p=Pattern.compile(regex);
	public boolean accept(File dir, String name){
		return p.matcher(name).matches();
	}
});

输入和输出:

* InputStream子类:

  ByteArrayInputStream, StringBufferInputStream, FileInputStream, PipedInputStream, SequenceInputStream, FilterInputStream

* OutputStream子类:

  ByteArrayOutputStream, FileOutputStreamk, PipedOutputStream, FilterOutputStream

* 使用装饰器模式来控制特定输入流和输出流

* DataInputStream允许读取不同的基本类型数据以及String对象,DataOutputStream将数据元素置入流中,使得DataInputStream能够可移植的重构它们。

* PrintStream目的是为了以可视化格式打印所有的基本数据类型以及String对象。

  PrintStream捕捉了所有的IOExceptions,因此必须使用checkError()自行测试错误状态。

  未完全国际化,不能以平台无关的方式处理换行动作。

* BufferedStream对数据流使用缓冲技术,当每次向流写入时,不必每次都进行实际的物理写动作。

Reader和Writer:

* InputStream和OutputStream以面向字节形式的提供I/O,Reader和Writer提供兼容Unicode与面向字符形式的I/O功能。

* 适配器:InputStreamReader,InputStreamWriter。

* BufferedOutputStream是FilterOutputStream的子类,而BufferedWriter并不是FilterWriter的子类。

* PrintWriter具有一个既能接受Writer对象又能接受任何OutputStream对象的构造器。格式化接口实际上与PrintStream相同。“自动执行清空”选项。

RandomAcessFile:

I/O流典型使用方法:

* 缓冲输入文件

BufferedReader in=new BufferedReader(new FileReader(filename));
使用后记得in.close();

* 从内存输入

StringReader in=new StringReader(String);
//in.read()以int形式返回下一字节,必须类型转换为char才能正确打印

* 格式化的内存输入:

DataInputStream & DataOutputStream

DataInputStream in=new DataInputStream(new ByteArrayInputStream(String));
DataInputStream in=new DataInputStream(new BufferedInputStream(new FileInputStream(filename)));
readByte();
available();

也可以通过捕获一场来检测输入的末尾。

* 基本的文件输出:

PrintWriter out=new PrintWriter(new BufferedWriter(new FileWriter(filename)));
通过PrintWriter实现格式化机制。

* 存储和恢复数据

*DataInputStream & DataOutputStream。

跨平台

writeUTF()和readUTF()控制字符串;

标准I/O:

* System.out 和 System.err为PrintStream对象

* System.in为一个InputStream对象

// 等待用户输入
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
* PrintWriter有一个可以接受OutputStream作为参数的构造器

//开启自动清空功能
PrintWriter out=new PrintWriter(System.out, true);
* 标准I/O重定向

setIn(InputStream)

setOut(PrintStream)

setErr(PrintStream)

* 使用重定向之前,应该先备份,使用之后注意还原

* 重定向使用的是字节流而不是字符流

进程控制,java.lang.ProcessBuilder:

getInputStream()捕获程序执行时产生的标准输出流

getErrorStream()

新I/O,java.nio.* JDK1.4:

* 速度提高:通道和缓冲器,Channel和ByteBuffer

* 产生FileChannel的三个类:FileInputStream,FileOutputStream和RandomAccessFile

* java.nio.channel.Channels提供了在通道中产生Reader和Writer的方法

getChannel()

ByteBuffer.wrap(),把字节数组包装起来

String.getBytes()

FileChannel.write()

FileChannel.read()

ByteBuffer.asCharBuffer()

java.nio.charset.Charset设置编码方式

ByteBuffer.flip(),read()后为取走数据做好准备,将limit设为position,position归0

ByteBuffer.clear(),write()之后为下一次向缓冲区写入数据做好准备

ByteBuffer通过ByteBuffer.allocate()初始化

* 视图缓冲器

IntBuffer.put() 方法可以直接访问底层数据的某个位置

同一字节序列以不同viewBuffer翻译

hasRemaining()

ByteBuffer是将数据移近移出通道的唯一方式

mark position limit capacity

* 内存映射文件

允许我们创建和修改哪些因为太大而不能放入内存的文件

MappedByteBuffer out=new RandomAccessFile(filename).getChannel().map(FileChannel.MapMode.READ_WRITE, 0, length)
必须指定映射文件的初始位置和映射区域的长度

MappedByteBuffer具有ByteBuffer的所有方法

* 文件加锁

JDK 1.4引入了文件加锁机制,允许我们同步访问某个作为共享资源的文件

文件锁对其他的操作系统进程是可见的,因为Java的文件加锁直接映射到了本地操作系统的加锁工具

FileChannel.tryLock()和lock()可以获得整个文件的FileLock

SocketChannel,DatagramChannel和ServerSocketChannel不需要加锁,因为它们是从单进程实体继承而来

tryLock()是非阻塞式,设法获取锁,但是如果不能获得,将从方法调用返回

lock()是阻塞式的,阻塞进程直至锁可以获得,或者线程中断,或者通道关闭,FileLock.release()释放锁

对文件部分上锁

tryLock(long position, long size, boolean shared)
lock(long position, long size, boolean shared)
对象序列化:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值