以BIO形式的文件读取和复制:
public class MyReadFile {
public static void main(String[] args){
try{
//第一步,定位数据源
File f=new File("c:/work/test.txt");
//第二布,建立管道,FileInputStream文件输入流类用于读文件
FileInputStream fis=new FileInputStream(f);
//FileOutputStream文件输出流类用于写文件
File outFile=new File("c:/work/test1.txt");
FileOutputStream fos=new FileOutputStream(outFile);
//第三步,操作管道
int length=fis.available();
for(int i=0;i<length;i++)
System.out.print((char)fis.read());
//将test中的文件读出来-->再写入到test1中,实现文件复制
for(int i=0;i<length;i++)
fos.write(fis.read());
}catch(Exception e){} //IO异常
}
}
NIO读取过程:
NIO形式的读取和复制
//以NIO的形式读取需要建立通道
public class CopyBytesWithChannel {
private static final int BSIZE = 1024;// 定义缓冲区大小
public static void main(String[] args) throws IOException {
FileInputStream ins = new FileInputStream("c:/work/test.txt");
FileOutputStream fos = new FileOutputStream("c:/work/test2.txt");
FileChannel inChannel = ins.getChannel();// 获取该文件输入流的通道
FileChannel outChannel = fos.getChannel();// 获取该文件输出流的通道
// System.out.println(ins.read());
ByteBuffer buffer = ByteBuffer.allocate(BSIZE);// 创建缓冲区
while (inChannel.read(buffer) != -1) {
buffer.flip(); // 使缓冲区准备好写操作
outChannel.write(buffer);
buffer.clear();
}
ins.close();
fos.close();
//System.out.println("read end");
}
}
同步阻塞IO(JAVA BIO):
服务器实现模式为一个连接一个线程,每当客户端有连接请求时服务器端就需要启动一个线程进行处理。而且服务器需要一直处于等待状态,一直在 accept();。如果这个连接不做任何事会造成不必要的开销。
同步非阻塞IO(Java NIO) :
服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。用户进程也需要时不时的询问IO操作是否就绪,这就要求用户进程不停的去询问。
异步阻塞IO(Java NIO):
此种方式下是指应用发起一个IO操作以后,不等待内核IO操作的完成,等内核完成IO操作以后会通知应用程序,这其实就是同步和异步最关键的区别,同步必须等待或者主动的去询问IO是否完成。(比如你买了一份快递,你不需要一天二十四小时去关注快递的状态,而是当快递到了或丢了等特殊情况下会通知你。)
阻塞是因为此时是通过select系统调用来完成的,而select函数本身的实现方式是阻塞的,而采用select函数有个好处就是它可以同时监听多个文件句柄从而提高系统的并发性!
还有更强的异步非阻塞(AIO)。