1 I/O
1.1 File类
1.1.1 构造方法
1.File(String pathname) 通过将给定路径名字符串转换为抽象路径名来创建一个新的File实例。
File file=new File("D:\\a\\1.txt");
2.File(String parent,String child) 根据指定的父路径和文件名创建File对象
File file=new File("D:\\a","1.txt");
3.File(File parent,String child) 根据指定的父文件对象和文件名创建FIle对象
File parentFile=new File("D:\\a");
File file=new File(parentFile,"1.txt");
1.1.2 创建与删除
1.boolean createNewFile();指定目录不存在该文件时创建文件并返回true,否则返回false
try {
File file=new File("a.txt");
System.out.println(file.createNewFile());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
tip:不使用绝对路径指定时,会在当前项目下创建该文件。
2.boolean mkdir() 当指定的单级文件夹不存在时创建文件夹并返回true,否则返回false
File file2=new File("F://IOTest");
System.out.println(file2.mkdir());
3.boolean mkdirs() 当指定的多级文件夹在某一级不存在时,创建多级文件夹并返回true,否则false
File file3=new File("F://IOTest");
System.out.println(file3.mkdirs()); //前面创建过了 false
File file4=new File("F://IOTest//a//b");
System.out.println(file4.mkdirs());// 前面没创建过 true
4.boolean delete() 删除文件或者单级文件夹,删除文件夹时下面不能用有其它的文件和文件夹
File file3=new File("F://IOTest");
System.out.println(file3.delete()); //还有子目录 false
File file4=new File("F://IOTest//a//b");
System.out.println(file4.delete());//无子目录子文件夹 true
1.1.3 判断
1.boolean exists() 判断指定路径的文件或文件夹是否为空
File file3=new File("F://IOTest");
System.out.println(file3.exists()); //存在 true
File file4=new File("F://IOTest//a//b");
System.out.println(file4.exists());//已删除 false
2.boolean isAbsolute() 判断当前路径是否是绝对路径
File file=new File("a.txt");
System.out.println(file.isAbsolute());// false
3.boolean isDirectory() 判断当前目录是否存在
File file=new File("a.txt");
System.out.println(file.isDirectory());//false
File file2=new File("F://IOTest//a");
System.out.println(file2.isDirectory());//true
File file3=new File("F://IOTest//a//b");
System.out.println(file3.isDirectory());//false
4.boolean isFile() 判断当前的目录是否一个文件
File file=new File("a.txt");
System.out.println(file.isFile());//true
File file2=new File("F://IOTest//a");
System.out.println(file2.isFile());//false
File file3=new File("F://IOTest//a//b");
System.out.println(file3.isFile());//false
tip:只会检测当前目录,子目录中的文件不检测。
1.1.4 获取和修改
1.File getAbsoluteFile() 获取文件的绝对路径,返回File对象。
File file=new File("a.txt");
File absoluteFile = file.getAbsoluteFile();
2.String getAbsolutePath() 获取文件的绝对路径,返回路径的字符串
File file=new File("a.txt");
System.out.println(file.getAbsolutePath());
System.out.println(new File("").getAbsolutePath());
3.String getParent() 获取当前路径的父级路径,以字符串的形式返回该父级路径
File file=new File("a.txt");
System.out.println(file.getParent()); //null
File file2=new File("F://IOTest//a");
System.out.println(file2.getParent());//F:\IOTest
4.String getName() 获取文件或文件夹的名称
File file=new File("a.txt");
System.out.println(file.getName()); //a.txt
File file2=new File("F://IOTest//a");
System.out.println(file2.getName());//a
5.String getPath() 获取File对象中封装的路径
File file=new File("a.txt");
System.out.println(file.getPath()); //a.txt
File file2=new File("F://IOTest//a");
System.out.println(file2.getPath());//F:\IOTest\a
6.long lastModified() 以毫秒值返回最后修改时间
File file=new File("a.txt");
System.out.println(file.lastModified());
7.long length() 返回文件的字节数
File file=new File("a.txt");
System.out.println(file.length()); //
File file2=new File("F://IOTest//a");
System.out.println(file2.length());//0
tip:目录和空文件都会返回0
8.boolean renameTo(File dest) 将当前File对象所指向的路径修改为指定File所指向的路径
File file=new File("F://IOTest//a//new.txt");
// file.createNewFile();
System.out.println(file.renameTo(new File("F://IOTest//new.txt")));
9.String[] list() 以字符串数组返回当前路径下所有的文件和文件夹的名称
File file=new File("F://IOTest");
String[] list = file.list();
for(String s:list) {
System.out.println(s);
}
10.File[] listFiles() 以File对象的形式返回当前路径下所有文件和文件夹的名称
File file=new File("F://IOTest");
File[] listFiles = file.listFiles();
for(File file2:listFiles) {
System.out.println(file2);
}
tip:listFiles输出结果包含路径,list输出结果仅包含名称
11.static File[] listRoots() 获取计算机中的所有盘符
File[] listRoots = File.listRoots();
for(File file:listRoots) {
System.out.println(file);
}
1.2 NIO
1.2.1 阻塞和同步
1.阻塞和非阻塞
阻塞和非阻塞是进程访问数据,数据未准备就绪时的处理方式,阻塞会停在那里一直等待直到数据准备好,非阻塞则直接返回。
2.同步和异步
同步:处理IO事件的时候,应用程序直接参与IO读写,阻塞在某个方法上等待IO事件完成。
异步:处理IO事件的时候,所有的IO读写交给操作系统去处理,应用程序可以去做别的事情,当IO完成后,操作系统会给程序一个通知。
1.2.2 NIO与IO的区别
IO是面向流的,NIO是面向缓冲区的,IO是阻塞的,NIO是非阻塞的。
1.2.3 NIO的三大核心部分
Channel(通道)、Buffer(缓冲区)、Selector。
Channel是双向的,既可以读也可以写。
Buffer是一个对象,它包含一些要写入或读出的数据。在NIO中,应用程序不能直接对Channel进行操作,而必须通过Buffer来进行。
Selector是一个对象,它可以接收多个Channel注册,监听各个Channel,并根据事件情况决定Channel读写。
1.2.4 Channel的主要类型
1.FileChannel:处理文件的
2.DatagramChannel:处理UDP网络的
3.SocketChannel:处理TCP网络的
4.ServerSocketChannel:处理TCP网络的
1.2.5 Buffer
1、Buffer的主要属性
capacity:缓冲区的容量,在缓冲区创建时被设定,永远不能改变。
limit:缓冲区的第一个不能被读或者写的元素的索引。
position:下一个要被读或者写的元素的索引。
mark:下一个要被读或写的元素的索引。
2.常见方法
filp():将写模式转换成读模式。
rewind():将position置为0,一遍用于重复度。
clear():清空缓冲区。
compact():清除已经读过的数据。
get():读取数据
put():写入数据
3.存取流程
存数据时position++,调用filp()时,limit=position,position=0,读取时position++
4.直接缓冲区和间接缓冲区
ByteBuffer.allocate(1024)创建间接缓冲区,间接缓冲区在堆中开辟,易于管理,垃圾回收器可以回收,空间有限,读取速度较慢。
ByteBuffer.allocateDirect(1024)创建直接缓冲区,直接缓冲区在物理内存中开辟空间,读写快,但是不受垃圾回收器控制,创建和销毁耗性能。
1.2.6 使用NIO读取数据
public class FileInputProgram {
static public void main( String args[] ) throws Exception {
FileInputStream fin = new FileInputStream("c:\\test.txt");
// 获取通道
FileChannel fc = fin.getChannel();
// 创建缓冲区
ByteBuffer buffer = ByteBuffer.allocate(1024);
// 读取数据到缓冲区
fc.read(buffer);
buffer.flip();
while (buffer.remaining() > 0) {
byte b = buffer.get();
System.out.print(((char)b));
}
fin.close();
}
}
1.2.7 使用NIO写入数据
public class FileOutputProgram {
static private final byte message[] = { 83, 111, 109, 101, 32,
98, 121, 116, 101, 115, 46 };
static public void main( String args[] ) throws Exception {
FileOutputStream fout = new FileOutputStream( "e:\\test.txt" );
FileChannel fc = fout.getChannel();
ByteBuffer buffer = ByteBuffer.allocate( 1024 );
for (int i=0; i<message.length; ++i) {
buffer.put( message[i] );
}
buffer.flip();
fc.write( buffer );
fout.close();
}
}
参考连接
1.java中File类方法详解
2.NIO中Buffer的各种方法详解及其作用
3.NIO原理详解
4.JAVA NIO详解
5.Java NIO?看这一篇就够了!