非阻塞IO初探

RandomAccessFile 隨機讀取文件內(nèi)容

  • 構造方法 RandomAccessiFile raf=new RandomAccessFile("filename",mode);

  • 讀取任意位置的文件內(nèi)容

  • 兩個方法
    獲得文件指針當前指向的位置: raf.getfilepoint();

    設置文件指針的位置: raf.seek(int position);
    
  • RandomAccessFile和輸入輸出流類似使用Read()和Write()方法

  • 在指定位置進行內(nèi)容的插入內(nèi)容,需要將指針位置以后內(nèi)容放在另外的文件進行保存或者 寫入到Buffer中進行保存,否則插入的內(nèi)容會覆蓋之前的

Buffer

  • 多種進本數(shù)據(jù)類型的實現(xiàn)類,主要的實現(xiàn)類ByteBuffer,CharBuffer

  • 主要方法put(),get()

  • 構造方法
    通過allocate(int capacity)方法獲得
    ByteBuffer bytebuffer=ByteBuffer.allocate(10);初始化容量為10

  • 主要參數(shù)
    position,limit,capacity

  • 讀取和輸出

    輸入
    positon初始值是0,limit進行數(shù)據(jù)的封裝
    添加數(shù)據(jù)完畢以后調(diào)用byteBufer.flip()方法,為輸出做準備

    輸出
    byteBuffer.clear()調(diào)用進行數(shù)據(jù)讀入做準備

  • 簡單例子
    public class BufferTest {
    @Test
    public void initTest(){
    CharBuffer buffer=CharBuffer.allocate(8);
    System.out.println("capacity="+buffer.capacity());
    System.out.println("position="+buffer.position());
    System.out.println("limit="+buffer.limit());

      System.out.println("\n 添加元素以后.....");
      buffer.put('s');
      buffer.put('h');
      buffer.put('f');
      System.out.println("position="+buffer.position());
      System.out.println("capacity="+buffer.capacity());
      System.out.println("limit="+buffer.limit());
              System.out.println("\n 添加元素結束以后準備取出元素....");
      buffer.flip();
      System.out.println("position="+buffer.position());
      System.out.println("limit="+buffer.limit());
      System.out.println("capacity="+buffer.capacity());  
      System.out.println("\n 取出元素以后......");
      System.out.println("取出第一個元素buffer[0]="+buffer.get());
      System.out.println("position="+buffer.position());
      System.out.println("capacity="+buffer.capacity());
      System.out.println("limit="+buffer.limit());
    
      System.out.println("\n 取出元素以后為添加元素做準備....");
      buffer.clear();
      System.out.println("position="+buffer.position());
      System.out.println("limit="+buffer.limit());
      System.out.println("capacity="+buffer.capacity());
              }
    

Channel

  • 主要的實現(xiàn)類FileChannel等

  • 類似于輸入輸出流

  • 指定文件中的內(nèi)容映射到buffer中
    FileChannel進行映射
    ** 映射成ByteBuffer **
    MapedByBuffer bytebuffer=FileChannel.map()

  • 不能直接對Channel進行讀取和寫入, 必須Buffer

  • 構造方法,通過文件流進行獲得
    FileChannel in=Fileinputstream(new File()).getChannel();
    FileChannel out=FileoutputStream(new File()).getChannel();

  • 讀取
    MapedBybyteBuffer bytebuffer=in.map(FileChannel.mapmodel.read_only,0,file.length);

  • 文件復制
    public class ChannelTest {
    @Test
    public void changeTest() throws IOException{
    /*
    * 獲取類似文件流的通道channel
    */

      File file=new File("E:/javaFile/shf.txt");
      FileChannel inChannel=new FileInputStream(file).getChannel();
      FileChannel outChannel=new FileOutputStream(new File("E:/javaFile/haifeng.txt")).getChannel();
      /*
       * 將Channel數(shù)據(jù)映射到byteBuffer中
       */
      
      MappedByteBuffer buffer=inChannel.map(FileChannel.MapMode.READ_ONLY, 0,file.length());
      
      /*
       * 將buffer中的數(shù)據(jù)直接輸出到文件中
       */
      outChannel.write(buffer);
      /*
       * 不能講buffer內(nèi)容直接輸出
       * 需要進行解碼器進行解碼
       * 轉(zhuǎn)換成charBuffer
       * 進行輸出
       */
      //System.out.println(buffer);
      
      /*
       * 必須將buffer進行清空
       * 為取出內(nèi)容做準備
       * buffer.clear()
       */
      buffer.clear();
      Charset charset=Charset.forName("utf-8");
    
      CharsetDecoder decoder=charset.newDecoder();
      CharBuffer charBuffer=decoder.decode(buffer);
      System.out.println(charBuffer);
      
    }
    }
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末爹耗,一起剝皮案震驚了整個濱河市襟衰,隨后出現(xiàn)的幾起案子翼虫,更是在濱河造成了極大的恐慌煤傍,老刑警劉巖穿铆,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機嗽桩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凄敢,“玉大人碌冶,你說我怎么就攤上這事±苑欤” “怎么了扑庞?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長拒逮。 經(jīng)常有香客問我罐氨,道長,這世上最難降的妖魔是什么滩援? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任栅隐,我火速辦了婚禮,結果婚禮上玩徊,老公的妹妹穿的比我還像新娘约啊。我一直安慰自己,他們只是感情好佣赖,可當我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著记盒,像睡著了一般憎蛤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上纪吮,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天俩檬,我揣著相機與錄音,去河邊找鬼碾盟。 笑死棚辽,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的冰肴。 我是一名探鬼主播屈藐,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼榔组,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了联逻?” 一聲冷哼從身側響起搓扯,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎包归,沒想到半個月后锨推,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡公壤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年换可,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片厦幅。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡沾鳄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出慨削,到底是詐尸還是另有隱情洞渔,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布缚态,位于F島的核電站磁椒,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏玫芦。R本人自食惡果不足惜浆熔,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望桥帆。 院中可真熱鬧医增,春花似錦、人聲如沸老虫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽祈匙。三九已至忽刽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間夺欲,已是汗流浹背跪帝。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留些阅,地道東北人伞剑。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像市埋,于是被迫代替她去往敵國和親黎泣。 傳聞我的和親對象是個殘疾皇子恕刘,可洞房花燭夜當晚...
    茶點故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)自 http://www.ibm.com/developerworks/cn/education/java/j-...
    抓兔子的貓閱讀 2,304評論 0 22
  • 前言: 之前的文章《Java文件IO常用歸納》主要寫了Java 標準IO要注意的細節(jié)和技巧,由于網(wǎng)上各種學習途徑聘裁,...
    androidjp閱讀 2,903評論 0 22
  • 傳統(tǒng)IO和普通IO的區(qū)別 傳統(tǒng)IO:面向流雪营,阻塞IO(Blocking), selector NIO:面向緩沖區(qū),...
    he_321閱讀 599評論 0 4
  • 已經(jīng)是晚上10點衡便,林小欣匆匆忙忙整理好桌上的東西献起,準備下班。最近天天加班镣陕,事情多谴餐,還得忍受脾氣暴躁的老板,每天上班...
    知言春秋閱讀 337評論 0 1
  • 喜歡你 我喜歡草莓呆抑,但草莓汁不行岂嗓,草莓糖也不行。 就像我喜歡你時鹊碍,長得像你不行厌殉,脾氣像你也不行,因為我喜歡的是你侈咕。...
    我最愛胡歌閱讀 1,519評論 0 0