1、java中io和nio的區別個人理解,主要在於io是面向流,而nio是面向緩衝區的,io(bio)同步阻塞式的輸入輸出,而nio是同步非阻塞式的輸出輸出。
2、io複製文件代碼
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class IoTest {
public static void main(String[] args) {
//創建一個輸入流和輸出流的引用
InputStream inputStream = null;
OutputStream outputStream = null;
try {
//初始化輸入流和輸出流
inputStream = new FileInputStream("D:\\text.txt");
outputStream = new FileOutputStream("D:\\text3.txt");
//每次讀取的字節流數組大小設置爲1024
byte bytes[] = new byte[1024];
//讀取到的長度
int len = -1;
//長度爲-1則表示讀到了文件的末尾
while((len = inputStream.read(bytes))!=-1){
//輸出到指定文件中
outputStream.write(bytes,0,len);
//刷新緩存區
outputStream.flush();
}
} catch (Exception e) {
e.printStackTrace();
} finally{
//關閉流
try {
if(outputStream!=null){
outputStream.close();
}
if(inputStream!=null){
inputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
3、nio複製文件的代碼
public class NioTest {
public static void main(String[] args) throws Exception{
//得到文件輸入流
FileInputStream fileInputStream = new FileInputStream(new File("D:\\text.txt"));
//得到輸入Channel通道
FileChannel inChannel = fileInputStream.getChannel();
//得到bytebuffer緩衝區
ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
//得到輸出流
FileOutputStream fileOutputStream = new FileOutputStream("D:\\text3.txt");
//得到輸出通道
FileChannel outChanner = fileOutputStream.getChannel();
int eof = -1;
//如果讀取到的長度不爲-1則緩衝區有數據
while((eof=inChannel.read(byteBuffer))!=-1){
//從讀模式切換到寫模式
byteBuffer.flip();
//寫入到指定文件
outChanner.write(byteBuffer);
//清空緩衝區
byteBuffer.clear();
}
//關閉通道和輸入輸出流
outChanner.close();
fileOutputStream.close();
inChannel.close();
fileInputStream.close();
}
}
4、nio的好處在於nio是同步非阻塞式的,具體實現在於一個線程可以管理一個selector,然後可以有多個channel通道註冊到該selector上,相當於一個線程控制一個selector選擇器可以同時監聽多個channel通道,一旦該通道的緩衝區有新的io請求,可以對該請求進行處理,而io流是同步阻塞式的,一個請求必須處理完成才能處理下一個請求,傳統的tomcat就是使用的bio同步阻塞流方式處理客戶端的請求,效率相對nio要低一些。 下面是nio的請求模型: