如果缺乏历史的眼光,很快我们就会对什么时候该使用哪些类,以及什么时候不该使用它们而感到困惑。
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)
对象序列化: