熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Javascript >> 正文

Merlin 的魔力:Merlin 的新 I/O 緩沖區的輸入和輸出

2013-11-23 17:53:23  來源: Javascript 

  Merlin 的魔力Merlin 的新 I/O 緩沖區的輸入和輸出
  
  作者:
  
  
  
  Merlin 的魔力
  
  Merlin 的新 I/O 緩沖區的輸入和輸出
  
  英文原文
  
  內容:
  
  緩沖區基礎
  
  緩沖區類型
  
  直接 vs 間接
  
  內存映射文件
  
  結束語
  
  參考資料
  
  關於作者
  
  對本文的評價
  
  相關內容
  
  Merlin 給 Java 平台帶來了非阻塞 I/O
  
  Working XML: Wrestling with Java NIO
  
  T徹底轉變流 部分優化 Java 內部 I/O
  
  Merlin的魔力
  
  developerWorks Toolbox subscription
  
  在 Java 專區還有
  
  工具與產品
  
  代碼與組件
  
  所有文章
  
  實用技巧
  
  了解如何操作 JSE 的新 I/O 包
  
  級別初級
  
  John Zukowski
  
  
  
  總裁JZ Ventures 公司
  
  
  
  Merlin 的魔力
  
  中常駐 Java 編程專家 John Zukowski 展示了如何操作那些數據緩沖區來執行如讀/寫原語這樣的任務以及如何使用內存映射文件在以後的文章裡他將把這裡所提到的概念擴展到套接字通道的使用
  
  Java 平台標准版(Java Platform Standard EditionJSE) 對 Java 平台的 I/O 處理能力做了大量更改它不僅用流到流的鏈接方式繼續支持以前
  
  JSE 發行版的基於流的 I/O 操作而且 Merlin 還添加了新的功能 — 稱之為新 I/O
  
  類(NIO)現在這些類位於
  
  javanio
  
  包中
  
  I/O 執行輸入和輸出操作將數據從文件或系統控制台等傳送至或傳送出應用程序(有關
  
  Java I/O 的其它信息請參閱
  
  參考資料
  
  緩沖區基礎
  
  抽象的
  
  Buffer
  
  javanio
  
  包支持緩沖區的基礎
  
  Buffer
  
  的工作方式就象內存中用於讀寫基本數據類型的
  
  RandomAccessFile
  
  RandomAccessFile
  
  一樣使用
  
  Buffer
  
  所執行的下一個操作(讀/寫)在當前某個位置發生執行這兩個操作中的任一個都會改變那個位置所以在寫操作之後進行讀操作不會讀到剛才所寫的內容而會讀到剛才所寫內容之後的數據
  
  Buffer
  
  提供了四個指示方法用於訪問線姓結構(從最高值到最低值)
  
  capacity()
  
  表明緩沖區的大小
  
  limit()
  
  告訴您到目前為止已經往緩沖區填了多少字節或者讓您用
  
  :limit(int newLimit)
  
  來改變這個限制
  
  position()
  
  告訴您當前的位置以執行下一個讀/寫操作
  
  mark()
  
  為了稍後用
  
  reset()
  
  進行重新設置而記住某個位置
  
  緩沖區的基本操作是
  
  get()
  
  put()
  
  然而這些方法在子類中都是針對每種數據類型的特定方法為了說明這一情況讓我們研究一個簡單示例該示例演示了從同一個緩沖區讀和寫一個字符在清單
  
  
  
  flip()
  
  方法交換限制和位置然後將位置置為 並廢棄標記讓您讀剛才所寫的數據
  
  清單 讀/寫示例
  
  
  
  import javanio*;
  
  
  
  CharBuffer buff = ;
  
  buffput(A);
  
  buffflip();
  
  char c = buffget();
  
  Systemoutprintln(An A: + c);
  
  
  
  現在讓我們研究一些具體的
  
  Buffer
  
  子類
  
  緩沖區類型
  
  Merlin 具有 種特定的
  
  Buffer
  
  類型每種類型對應著一個基本數據類型(不包括
  
  boolean)
  
  ByteBuffer
  
  CharBuffer
  
  DoubleBuffer
  
  FloatBuffer
  
  IntBuffer
  
  LongBuffer
  
  ShortBuffer
  
  在本文後面我將討論第 種類型
  
  MappedByteBuffer
  
  它用於內存映射文件如果您必須使用的類型不是這些基本類型則可以先從
  
  ByteBuffer
  
  獲得字節類型然後將其轉換成
  
  Object
  
  或其它任何類型
  
  正如前面所提到的每個緩沖區包含
  
  get()
  
  put()
  
  方法它們可以提供類型安全的版本通常需要重載這些
  
  get()
  
  put()
  
  方法例如有了
  
  CharBuffer
  
  可以用
  
  get()
  
  獲得下一個字符
  
  get(int index)
  
  獲得某個特定位置的字符或者用
  
  get(char[] destination)
  
  獲得一串字符靜態方法也可以創建緩沖區因為不存在構造函數那麼仍以
  
  CharBuffer
  
  為例
  
  CharBufferwrap(aString)
  
  可以將
  
  String
  
  對象轉換成
  
  CharBuffer
  
  為了演示清單 接受第一個命令行參數將它轉換成
  
  CharBuffer
  
  並顯示參數中的每個字符
  
  清單 CharBuffer 演示
  
  
  
  import javanio*;
  
  public class ReadBuff {
  
  public static void main(String args[]) {
  
  if (argslength != ) {
  
  CharBuffer buff = CharBufferwrap(args[]);
  
  for (int i= n=bufflength(); i
  
  
  
  請注意這裡我使用了
  
  get()
  
  而沒有使用
  
  get(index)
  
  我這樣做的原因是在每次執行
  
  get()
  
  操作之後位置都會移動所以不需要手工來聲明要檢索的位置
  
  直接 vs 間接
  
  既然已經了解了典型的緩沖區那麼讓我們研究直接緩沖區與間接緩沖區之間的差別在創建緩沖區時可以要求創建直接緩沖區創建直接緩沖區的成本要比創建間接緩沖區高但這可以使運行時環境直接在該緩沖區上進行較快的本機 I/O 操作因為創建直接緩沖區所增加的成本所以直接緩沖區只用於長生存期的緩沖區而不用於短生存期一次姓且用完就丟棄的緩沖區而且只能在
  
  ByteBuffer
  
  這個級別上創建直接緩沖區如果希望使用其它類型則必須將
  
  Buffer
  
  轉換成更具體的類型為了演示清單
  
   中代碼的行為與清單 的行為一樣但清單 使用直接緩沖區
  
  清單 列出網絡接口
  
  
  
  import javanio*;
  
  public class ReadDirectBuff {
  
  public static void main(String args[]) {
  
  if (argslength != ) {
  
  String arg = args[];
  
  int size = arglength();
  
  ByteBuffer byteBuffer = ByteBufferallocateDirect(size*);
  
  CharBuffer buff = byteBufferasCharBuffer();
  
  buffput(arg);
  
  buffrewind();
  
  for (int i= n=bufflength(); i
  
  
  
  在上面的代碼中請注意不能只是將
  
  String
  
  包裝在直接
  
  ByteBuffer
  
  中必須首先創建一個緩沖區先填充它然後將位置倒回起始點這樣才能從頭讀還要記住字符長度是字節長度的兩倍因此示例中會有
  
  size*
  
  內存映射文件
  
  第
  
  Buffer
  
  MappedByteBuffer
  
  只是一種特殊的
  
  ByteBuffer
  
  MappedByteBuffer
  
  將文件所在區域直接映射到內存通常該區域包含整個文件但也可以只映射部分文件所以必須指定要映射文件的哪部分而且與其它
  
  Buffer
  
  對象一樣這裡沒有構造函數必須讓
  
  javaniochannelsFileChannel
  
  map()
  
  方法來獲取
  
  MappedByteBuffer
  
  此外無需過多涉及通道就可以用
  
  getChannel()
  
  方法從
  
  FileInputStream
  
  FileOutputStream
  
  FileChannel
  
  通過從命令行傳入文件名來讀取文本文件的內容清單 顯示了
  
  MappedByteBuffer
  
  清
From:http://tw.wingwit.com/Article/program/Java/Javascript/201311/25294.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.