導航:首頁 > 編程語言 > javaniotutorial

javaniotutorial

發布時間:2023-08-30 08:36:07

1. 介紹一下java NIO,NIO讀取文件都有哪些方法

NIO也就是New I/O,是一組擴展Java IO操作的API集, 於Java 1.4起被引入,Java 7中NIO又提供了一些新的文件系統API,叫.
NIO2提供兩種主要的文件讀取方法:
使用buffer和channel類
使用Path 和 File 類
NIO讀取文件有以下三種方式:
1. 舊的NIO方式,使用BufferedReader
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class WithoutNIOExample
{
public static void main(String[] args)
{
BufferedReader br = null;
String sCurrentLine = null;
try
{
br = new BufferedReader(
new FileReader("test.txt"));
while ((sCurrentLine = br.readLine()) != null)
{
System.out.println(sCurrentLine);
}
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
try
{
if (br != null)
br.close();
} catch (IOException ex)
{
ex.printStackTrace();
}
}
}
}
2. 使用buffer讀取小文件
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
public class ReadFileWithFileSizeBuffer
{
public static void main(String args[])
{
try
{
RandomAccessFile aFile = new RandomAccessFile(
"test.txt","r");
FileChannel inChannel = aFile.getChannel();
long fileSize = inChannel.size();
ByteBuffer buffer = ByteBuffer.allocate((int) fileSize);
inChannel.read(buffer);
buffer.rewind();
buffer.flip();
for (int i = 0; i < fileSize; i++)
{
System.out.print((char) buffer.get());
}
inChannel.close();
aFile.close();
}
catch (IOException exc)
{
System.out.println(exc);
System.exit(1);
}
}
}
3. 分塊讀取大文件
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
public class ReadFileWithFixedSizeBuffer
{
public static void main(String[] args) throws IOException
{
RandomAccessFile aFile = new RandomAccessFile
("test.txt", "r");
FileChannel inChannel = aFile.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
while(inChannel.read(buffer) > 0)
{
buffer.flip();
for (int i = 0; i < buffer.limit(); i++)
{
System.out.print((char) buffer.get());
}
buffer.clear(); // do something with the data and clear/compact it.
}
inChannel.close();
aFile.close();
}
}
4. 使用MappedByteBuffer讀取文件
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
public class ReadFileWithMappedByteBuffer
{
public static void main(String[] args) throws IOException
{
RandomAccessFile aFile = new RandomAccessFile
("test.txt", "r");
FileChannel inChannel = aFile.getChannel();
MappedByteBuffer buffer = inChannel.map(FileChannel.MapMode.READ_ONLY, 0, inChannel.size());
buffer.load();?
for (int i = 0; i < buffer.limit(); i++)
{
System.out.print((char) buffer.get());
}
buffer.clear(); // do something with the data and clear/compact it.
inChannel.close();
aFile.close();
}
}

2. 怎樣學習JAVA,JAVA基礎教程之入門學習方法

入門要一步一步完成,需要在途中為自己確立一個一個的目標來完成。下面為大家介紹一下,依照這樣的目標完成,相信你一定會成為高手!

如何學習java,從易到難再到易的過程,一步一個腳印去學習,嚴格意義上說,java是一門較復雜的編程語言,沒有幾年時間的苦功,不可能學到非常好的層次。同樣,學習java為了最快的提升效率和保證你能夠學會。還是需要報個培訓班,或者聽一下網上的網路教程。

3. java nio 開發實例

首先了解下所謂的java nio是個什麼東西!

傳統的並發型伺服器設計是利用阻塞型網路I/O 以多線程的模式來實現的 然而由

於系統常常在進行網路讀寫時處於阻塞狀態 會大大影響系統的性能 自Java 開始引入

了NIO(新I/O) API 通過使用非阻塞型I/O 實現流暢的網路讀寫操作 為開發高性能並發

型伺服器程序提供了一個很好的解決方案 這就罩笑答是java nio

首先來看下傳統的阻塞型網路 I/O的不足

Java 平台傳統的I/O 系統都是基於Byte(位元組)和Stream(數據流)的 相應的I/O 操

作都是阻塞型的 所以伺服器程序也採用阻塞型I/O 進行數據的讀 寫操作 本文以TCP

長連接模式來討論並發型伺服器的相關設計 為了實現伺服器程序的並發性要求 系統由一

個單獨的主線程來監聽用戶發起的連接請求 一直處於阻塞狀態 當有用戶連接請求到來時

程序都會啟一個新的線程來統一處理用戶數據的讀 寫操作

這種模式的優點是簡單 實用 易管理 然而缺點也是顯而易見的 由於是為每一個客

戶端分配一個線程來處理輸入 輸出數據 其線程與客戶機的比例近似為 隨著線程

數量的不斷增加 伺服器啟動了大量的並發線程 會大大加大系統對線程的管理開銷 這將

成為吞吐量瓶頸的主要原因 其次由於底層的I/O 操作採用的同步模式 I/O 操作的阻塞管

理粒度是以服務於請求的線程為單位的 有可能大量的線程會閑置 處於盲等狀態升派 造成I/O

資源利用率不高 影響整個系統的性能

對於並發型伺服器 系統用在阻塞型I/O 等待和線程間切換的時間遠遠多於CPU 在內

存中處理數據的時間 因此傳統的阻塞型物慧I/O 已經成為制約系統性能的瓶頸 Java 版本

後推出的NIO 工具包 提供了非阻塞型I/O 的非同步輸入輸出機制 為提高系統的性能提供

了可實現的基礎機制

NIO 包及工作原理

針對傳統I/O 工作模式的不足 NIO 工具包提出了基於Buffer(緩沖區) Channel(通

道) Selector(選擇器)的新模式 Selector(選擇器) 可選擇的Channel(通道)和

SelectionKey(選擇鍵)配合起來使用 可以實現並發的非阻塞型I/O 能力

NIO 工具包的成員

Buffer(緩沖器)

Buffer 類是一個抽象類 它有 個子類分別對應於七種基本的數據類型 ByteBuffer

CharBuffer DoubleBuffer FloatBuffer IntBuffer LongBuffer 和ShortBuffer 每一個Buffer

對象相當於一個數據容器 可以把它看作內存中的一個大的數組 用來存儲和提取所有基本

類型(boolean 型除外)的數據 Buffer 類的核心是一塊內存區 可以直接對其執行與內存有關

的操作 利用操作系統特性和能力提高和改善Java 傳統I/O 的性能

Channel(通道)

Channel 被認為是NIO 工具包的一大創新點 是(Buffer)緩沖器和I/O 服務之間的通道

具有雙向性 既可以讀入也可以寫出 可以更高效的傳遞數據 我們這里主要討論

ServerSocketChannel 和SocketChannel 它們都繼承了SelectableChannel 是可選擇的通道

分別可以工作在同步和非同步兩種方式下(這里的可選擇不是指可以選擇兩種工作方式 而是

指可以有選擇的注冊自己感興趣的事件) 當通道工作在同步方式時 它的功能和編程方法

與傳統的ServerSocket Socket 對象相似 當通道工作在非同步工作方式時 進行輸入輸出處

理不必等到輸入輸出完畢才返回 並且可以將其感興趣的(如 接受操作 連接操作 讀出

操作 寫入操作)事件注冊到Selector 對象上 與Selector 對象協同工作可以更有效率的支

持和管理並發的網路套接字連接

Selector(選擇器)和SelectionKey(選擇鍵)

各類 Buffer 是數據的容器對象 各類Channel 實現在各類Buffer 與各類I/O 服務間傳輸

數據 Selector 是實現並發型非阻塞I/O 的核心 各種可選擇的通道將其感興趣的事件注冊

到Selector 對象上 Selector 在一個循環中不斷輪循監視這各些注冊在其上的Socket 通道

SelectionKey 類則封裝了SelectableChannel 對象在Selector 中的注冊信息 當Selector 監測

到在某個注冊的SelectableChannel 上發生了感興趣的事件時 自動激活產生一個SelectionKey

對象 在這個對象中記錄了哪一個SelectableChannel 上發生了哪種事件 通過對被激活的

SelectionKey 的分析 外界可以知道每個SelectableChannel 發生的具體事件類型 進行相應的

處理

NIO 工作原理

通過上面的討論 我們可以看出在並發型伺服器程序中使用NIO 實際上是通過網路事

件驅動模型實現的 我們應用Select 機制 不用為每一個客戶端連接新啟線程處理 而是將

其注冊到特定的Selector 對象上 這就可以在單線程中利用Selector 對象管理大量並發的網

絡連接 更好的利用了系統資源 採用非阻塞I/O 的通信方式 不要求阻塞等待I/O 操作完

成即可返回 從而減少了管理I/O 連接導致的系統開銷 大幅度提高了系統性能

當有讀或寫等任何注冊的事件發生時 可以從Selector 中獲得相應的

SelectionKey 從SelectionKey 中可以找到發生的事件和該事件所發生的具體的

SelectableChannel 以獲得客戶端發送過來的數據 由於在非阻塞網路I/O 中採用了事件觸

發機制 處理程序可以得到系統的主動通知 從而可以實現底層網路I/O 無阻塞 流暢地讀

寫 而不像在原來的阻塞模式下處理程序需要不斷循環等待 使用NIO 可以編寫出性能更

好 更易擴展的並發型伺服器程序

並發型伺服器程序的實現代碼

應用 NIO 工具包 基於非阻塞網路I/O 設計的並發型伺服器程序與以往基於阻塞I/O 的

實現程序有很大不同 在使用非阻塞網路I/O 的情況下 程序讀取數據和寫入數據的時機不

是由程序員控制的 而是Selector 決定的 下面便給出基於非阻塞網路I/O 的並發型伺服器

程序的核心代碼片段

import java io * //引入Java io包

import * //引入包

import java nio channels * //引入Java nio channels包

import java util * //引入Java util包

public class TestServer implements Runnable

{

/**

* 伺服器Channel對象 負責接受用戶連接

*/

private ServerSocketChannel server

/**

* Selector對象 負責監控所有的連接到伺服器的網路事件的發生

*/

private Selector selector

/**

* 總的活動連接數

*/

private int activeSockets

/**

* 伺服器Channel綁定的埠號

*/

private int port

/**

*

* 構造函數

*/

public TestServer()throws IOException

{

activeSockets=

port= //初始化伺服器Channel綁定的埠號為

selector= Selector open() //初始化Selector對象

server=ServerSocketChannel open() //初始化伺服器Channel對象

ServerSocket socket=server socket() //獲取伺服器Channel對應的//ServerSocket對象

socket bind(new InetSocketAddress(port)) //把Socket綁定到監聽埠 上

nfigureBlocking(false) //將伺服器Channel設置為非阻塞模式

server register(selector SelectionKey OP_ACCEPT) //將伺服器Channel注冊到

Selector對象 並指出伺服器Channel所感興趣的事件為可接受請求操作

}

public void run()

{

while(true)

{

try

{

/**

*應用Select機制輪循是否有用戶感興趣的新的網路事件發生 當沒有

* 新的網路事件發生時 此方法會阻塞 直到有新的網路事件發生為止

*/

selector select()

}

catch(IOException e)

{

continue //當有異常發生時 繼續進行循環操作

}

/**

* 得到活動的網路連接選擇鍵的集合

*/

Set<SelectionKey> keys=selector selectedKeys()

activeSockets=keys size() //獲取活動連接的數目

if(activeSockets== )

{

continue //如果連接數為 則繼續進行循環操作

}

/**

/**

* 應用For—Each循環遍歷整個選擇鍵集合

*/

for(SelectionKey key :keys)

{

/**

* 如果關鍵字狀態是為可接受 則接受連接 注冊通道 以接受更多的*

事件 進行相關的伺服器程序處理

*/

if(key isAcceptable())

{

doServerSocketEvent(key)

continue

}

/**

* 如果關鍵字狀態為可讀 則說明Channel是一個客戶端的連接通道

* 進行相應的讀取客戶端數據的操作

*/

if(key isReadable())

{

doClientReadEvent(key)

continue

}

/**

* 如果關鍵字狀態為可寫 則也說明Channel是一個客戶端的連接通道

* 進行相應的向客戶端寫數據的操作

*/

if(key isWritable())

{

doClinetWriteEvent(key)

continue

}

}

}

}

/**

* 處理伺服器事件操作

* @param key 伺服器選擇鍵對象

*/

private void doServerSocketEvent(SelectionKey key)

{

SocketChannel client=null

try

{

ServerSocketChannel server=(ServerSocketChannel)key channel()

client=server accept()

if(client==null)

{

return

}

nfigureBlocking(false) //將客戶端Channel設置為非阻塞型

/**

/**

* 將客戶端Channel注冊到Selector對象上 並且指出客戶端Channel所感

* 興趣的事件為可讀和可寫

*/

client register(selector SelectionKey OP_READ|SelectionKey OP_READ)

}catch(IOException e)

{

try

{

client close()

}catch(IOException e ){}

}

}

/**

* 進行向客戶端寫數據操作

* @param key 客戶端選擇鍵對象

*/

private void doClinetWriteEvent(SelectionKey key)

{

代碼實現略

}

/**

* 進行讀取客戶短數據操作

* @param key 客戶端選擇鍵對象

*/

private void doClientReadEvent(SelectionKey key)

{

代碼實現略

}

}

從上面對代碼可以看出 使用非阻塞性I/O進行並發型伺服器程序設計分三個部分

向Selector對象注冊感興趣的事件 從Selector中獲取所感興趣的事件 根據不同的事件進

行相應的處理

結語

通過使用NIO 工具包進行並發型伺服器程序設計 一個或者很少幾個Socket 線程就可

以處理成千上萬個活動的Socket 連接 大大降低了伺服器端程序的開銷 同時網路I/O 採取

非阻塞模式 線程不再在讀或寫時阻塞 操作系統可以更流暢的讀寫數據並可以更有效地向

CPU 傳遞數據進行處理 以便更有效地提高系統的性能

看到這里相信你看了不止 分鍾了吧 我說 分鍾其實就是想讓大家能夠輕松的讀下去(雞蛋 )

好了 到這里大家應該對java nio有個初步的了解了吧~~~

lishixin/Article/program/Java/hx/201311/27190

4. java裡面的NIO是什麼,有什麼用

NIO即New IO,這個庫是在JDK1.4中才引入的。NIO和IO有相同的作用和目的,但實現方式不同,NIO主要用到的是版塊,所以NIO的效率要權比IO高很多。
在Java API中提供了兩套NIO,一套是針對標准輸入輸出NIO,另一套就是網路編程NIO。

閱讀全文

與javaniotutorial相關的資料

熱點內容
90版本升級不送 瀏覽:186
工具箱英文 瀏覽:382
南翔嘉定編程課哪裡好 瀏覽:853
win10改變文件格式 瀏覽:475
linux中的物理地址和虛擬地址 瀏覽:493
有哪些app可以接游戲訂單 瀏覽:472
蘋果硬碟數據恢復要多少錢 瀏覽:394
js綁定下拉框資料庫數據 瀏覽:448
cad文件怎麼復制到另一個文件里邊 瀏覽:858
dxp鑽孔文件 瀏覽:631
iphone大悅城換機 瀏覽:538
找結婚對象上什麼網站 瀏覽:974
學生信息管理系統程序設計報告 瀏覽:640
微信文件怎麼刪除怎麼恢復 瀏覽:407
編程程序怎麼復制 瀏覽:467
文件更改 瀏覽:327
冰點文件路徑 瀏覽:730
軟體一點開文件就關閉 瀏覽:88
網路如何把人捧紅 瀏覽:961
軟體傳輸文件 瀏覽:184

友情鏈接