亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 網站 > WEB開發 > 正文

Java RandomAccessFile用法

2024-04-27 15:11:00
字體:
來源:轉載
供稿:網友

RandomaccessFile

RandomAccessFile是用來訪問那些保存數據記錄的文件的,你就可以用seek( )方法來訪問記錄,并進行讀寫了。這些記錄的大小不必相同;但是其大小和位置必須是可知的。但是該類僅限于操作文件。RandomAccessFile不屬于InputStream和OutputStream類系的。實際上,除了實現DataInput和DataOutput接口之外(DataInputStream和DataOutputStream也實現了這兩個接口),它和這兩個類系毫不相干,甚至不使用InputStream和OutputStream類中已經存在的任何功能;它是一個完全獨立的類,所有方法(絕大多數都只屬于它自己)都是從零開始寫的。這可能是因為RandomAccessFile能在文件里面前后移動,所以它的行為與其它的I/O類有些根本性的不同??偠灾?,它是一個直接繼承Object的,獨立的類?;旧希琑andomAccessFile的工作方式是,把DataInputStream和DataOutputStream結合起來,再加上它自己的一些方法,比如定位用的getFilePointer( ),在文件里移動用的seek( ),以及判斷文件大小的length( )、skipBytes()跳過多少字節數。此外,它的構造函數還要一個表示以只讀方式("r"),還是以讀寫方式("rw")打開文件的參數 (和C的fopen( )一模一樣)。它不支持只寫文件。只有RandomAccessFile才有seek搜尋方法,而這個方法也只適用于文件。BufferedInputStream有一個mark( )方法,你可以用它來設定標記(把結果保存在一個內部變量里),然后再調用reset( )返回這個位置,但是它的功能太弱了,而且也不怎么實用。

RandomAccessFile的絕大多數功能,但不是全部,已經被JDK 1.4的nio的"內存映射文件(memory-mapped files)"給取代了,你該考慮一下是不是用"內存映射文件"來代替RandomAccessFile了。

 

內存映射文件

內存映射文件能讓你創建和修改那些因為太大而無法放入內存的文件。有了內存映射文件,你就可以認為文件已經全部讀進了內存,然后把它當成一個非常大的數組來訪問。這種解決辦法能大大簡化修改文件的代碼。fileChannel.map(FileChannel.MapMode mode, long position, long size)將此通道的文件區域直接映射到內存中。注意,你必須指明,它是從文件的哪個位置開始映射的,映射的范圍又有多大;也就是說,它還可以映射一個大文件的某個小片斷。

MappedByteBuffer是ByteBuffer的子類,因此它具備了ByteBuffer的所有方法,但新添了force()將緩沖區的內容強制刷新到存儲設備中去、load()將存儲設備中的數據加載到內存中、isLoaded()位置內存中的數據是否與存儲設置上同步。這里只簡單地演示了一下put()和get()方法,除此之外,你還可以使用asCharBuffer( )之類的方法得到相應基本類型數據的緩沖視圖后,可以方便的讀寫基本類型數據。

[java] view plain copyimport java.io.RandomAccessFile;  import java.nio.MappedByteBuffer;  import java.nio.channels.FileChannel;    public class LargeMappedFiles {      static int length = 0x8000000; // 128 Mb        public static void main(String[] args) throws Exception {          // 為了以可讀可寫的方式打開文件,這里使用RandomAccessFile來創建文件。          FileChannel fc = new RandomAccessFile("test.dat", "rw").getChannel();          //注意,文件通道的可讀可寫要建立在文件流本身可讀寫的基礎之上          MappedByteBuffer out = fc.map(FileChannel.MapMode.READ_WRITE, 0, length);          //寫128M的內容          for (int i = 0; i < length; i++) {              out.put((byte) 'x');          }          System.out.PRintln("Finished writing");          //讀取文件中間6個字節內容          for (int i = length / 2; i < length / 2 + 6; i++) {              System.out.print((char) out.get(i));          }          fc.close();      }  }  

 

盡管映射寫似乎要用到FileOutputStream,但是映射文件中的所有輸出 必須使用RandomAccessFile,但如果只需要讀時可以使用FileInputStream,寫映射文件時一定要使用隨機訪問文件,可能寫時要讀的原因吧。

 

該程序創建了一個128Mb的文件,如果一次性讀到內存可能導致內存溢出,但這里訪問好像只是一瞬間的事,這是因為,真正調入內存的只是其中的一小部分,其余部分則被放在交換文件上。這樣你就可以很方便地修改超大型的文件了(最大可以到2 GB)。注意,Java是調用操作系統的"文件映射機制"來提升性能的。

 

RandomAccessFile類的應用:

[java] view plain copy/*  * 程序功能:演示了RandomAccessFile類的操作,同時實現了一個文件復制操作。  */  package com.lwj.demo;    import java.io.*;    public class RandomAccessFileDemo {   public static void main(String[] args) throws Exception {    RandomAccessFile file = new RandomAccessFile("file", "rw");    // 以下向file文件中寫數據    file.writeInt(20);// 占4個字節    file.writeDouble(8.236598);// 占8個字節    file.writeUTF("這是一個UTF字符串");// 這個長度寫在當前文件指針的前兩個字節處,可用readShort()讀取    file.writeBoolean(true);// 占1個字節    file.writeShort(395);// 占2個字節    file.writeLong(2325451l);// 占8個字節    file.writeUTF("又是一個UTF字符串");    file.writeFloat(35.5f);// 占4個字節    file.writeChar('a');// 占2個字節      file.seek(0);// 把文件指針位置設置到文件起始處      // 以下從file文件中讀數據,要注意文件指針的位置    System.out.println("——————從file文件指定位置讀數據——————");    System.out.println(file.readInt());    System.out.println(file.readDouble());    System.out.println(file.readUTF());      file.skipBytes(3);// 將文件指針跳過3個字節,本例中即跳過了一個boolean值和short值。    System.out.println(file.readLong());      file.skipBytes(file.readShort()); // 跳過文件中“又是一個UTF字符串”所占字節,注意readShort()方法會移動文件指針,所以不用加2。    System.out.println(file.readFloat());        //以下演示文件復制操作    System.out.println("——————文件復制(從file到fileCopy)——————");    file.seek(0);    RandomAccessFile fileCopy=new RandomAccessFile("fileCopy","rw");    int len=(int)file.length();//取得文件長度(字節數)    byte[] b=new byte[len];    file.readFully(b);    fileCopy.write(b);    System.out.println("復制完成!");   }  }  

RandomAccessFile 插入寫示例:

[java] view plain copy/**  *   * @param skip 跳過多少過字節進行插入數據  * @param str 要插入的字符串  * @param fileName 文件路徑  */  public static void beiju(long skip, String str, String fileName){      try {          RandomAccessFile raf = new RandomAccessFile(fileName,"rw");          if(skip <  0 || skip > raf.length()){              System.out.println("跳過字節數無效");              return;          }          byte[] b = str.getBytes();          raf.setLength(raf.length() + b.length);          for(long i = raf.length() - 1; i > b.length + skip - 1; i--){              raf.seek(i - b.length);              byte temp = raf.readByte();              raf.seek(i);              raf.writeByte(temp);          }          raf.seek(skip);          raf.write(b);          raf.close();      } catch (Exception e) {          e.printStackTrace();      }  }  

 

利用RandomAccessFile實現文件的多線程下載,即多線程下載一個文件時,將文件分成幾塊,每塊用不同的線程進行下載。下面是一個利用多線程在寫文件時的例子,其中預先分配文件所需要的空間,然后在所分配的空間中進行分塊,然后寫入:

[java] view plain copyimport java.io.FileNotFoundException;  import java.io.IOException;  import java.io.RandomAccessFile;    /**  * 測試利用多線程進行文件的寫操作  */  public class Test {        public static void main(String[] args) throws Exception {          // 預分配文件所占的磁盤空間,磁盤中會創建一個指定大小的文件          RandomAccessFile raf = new RandomAccessFile("D://abc.txt", "rw");          raf.setLength(1024*1024); // 預分配 1M 的文件空間          raf.close();                    // 所要寫入的文件內容          String s1 = "第一個字符串";          String s2 = "第二個字符串";          String s3 = "第三個字符串";          String s4 = "第四個字符串";          String s5 = "第五個字符串";                    // 利用多線程同時寫入一個文件          new FileWriteThread(1024*1,s1.getBytes()).start(); // 從文件的1024字節之后開始寫入數據          new FileWriteThread(1024*2,s2.getBytes()).start(); // 從文件的2048字節之后開始寫入數據          new FileWriteThread(1024*3,s3.getBytes()).start(); // 從文件的3072字節之后開始寫入數據          new FileWriteThread(1024*4,s4.getBytes()).start(); // 從文件的4096字節之后開始寫入數據          new FileWriteThread(1024*5,s5.getBytes()).start(); // 從文件的5120字節之后開始寫入數據      }            // 利用線程在文件的指定位置寫入指定數據      static class FileWriteThread extends Thread{          private int skip;          private byte[] content;                    public FileWriteThread(int skip,byte[] content){              this.skip = skip;              this.content = content;          }                    public void run(){              RandomAccessFile raf = null;              try {                  raf = new RandomAccessFile("D://abc.txt", "rw");                  raf.seek(skip);                  raf.write(content);              } catch (FileNotFoundException e) {                  e.printStackTrace();              } catch (IOException e) {                  // TODO Auto-generated catch block                  e.printStackTrace();              } finally {                  try {                      raf.close();                  } catch (Exception e) {                  }              }          }      }    }  
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人写真视频福利网| 亚洲japanese制服美女| 久久久久久久久中文字幕| 日韩在线观看精品| 在线免费看av不卡| 国产亚洲精品久久| 久久免费精品日本久久中文字幕| 亚洲福利在线播放| 欧美午夜激情在线| 欧美激情视频给我| 日韩在线视频中文字幕| 色偷偷偷亚洲综合网另类| 亚州av一区二区| 久久久视频精品| 亚洲欧美一区二区三区久久| 亚洲最新中文字幕| 精品久久久久国产| 欧美在线影院在线视频| 欧美视频不卡中文| 久久综合久久88| 91极品视频在线| 国产91网红主播在线观看| 久久99青青精品免费观看| 久久九九全国免费精品观看| 91精品国产高清自在线| 久久久久久久亚洲精品| 91香蕉嫩草神马影院在线观看| 久久久久久久国产精品视频| www.日韩av.com| 国产精品观看在线亚洲人成网| 亚洲第一区中文99精品| 国产成人精品视频在线| 俺去亚洲欧洲欧美日韩| 尤物yw午夜国产精品视频明星| 久久久这里只有精品视频| 久久成人av网站| 日本精品一区二区三区在线播放视频| 国产91精品久| 欧美激情视频一区二区| 日韩成人激情视频| 欧美精品在线观看91| 亚洲成人a级网| 北条麻妃久久精品| 538国产精品视频一区二区| 国产精品福利久久久| 国产婷婷色综合av蜜臀av| 国产欧美韩国高清| 国产一区二区三区精品久久久| 欧美在线视频a| 成人国产精品一区二区| 亚洲一区二区三区成人在线视频精品| 国产91ⅴ在线精品免费观看| 国模视频一区二区三区| 91网站免费观看| 欧美一级大片在线观看| 国产精品视频永久免费播放| 日韩免费在线视频| 欧美日本高清视频| 久久精品99无色码中文字幕| 亚洲精品免费av| 亚洲国产成人在线视频| 国产成人综合一区二区三区| 国产99久久精品一区二区| 欧美激情在线视频二区| 欧美巨猛xxxx猛交黑人97人| 一区二区三区黄色| 国产精品一区二区久久精品| 亚洲一区二区三区久久| 性欧美xxxx交| 国产精品免费久久久| 亚洲第一精品夜夜躁人人爽| 国语自产精品视频在线看| 成人国产精品色哟哟| 欧美电影免费在线观看| 日韩经典一区二区三区| 亚洲一区二区免费在线| 国产在线拍揄自揄视频不卡99| 亚洲高清一二三区| 欧美精品成人在线| 在线观看精品国产视频| 欧美日韩国产中字| 国产视频精品久久久| 国产日韩欧美91| 亚洲一区中文字幕| 在线观看久久av| 久久精品99久久香蕉国产色戒| 亚洲精品一区久久久久久| 亚洲天堂第二页| 国产99视频精品免视看7| 久久久久国产精品一区| 2021久久精品国产99国产精品| 亚洲欧美www| 欧美激情国产高清| 国产伦精品一区二区三区精品视频| 国内精品久久久久影院 日本资源| 欧美成年人视频| 人人爽久久涩噜噜噜网站| 亚洲综合中文字幕在线观看| 91wwwcom在线观看| 欧美成人免费一级人片100| 热久久99这里有精品| 国产精品久久久久久久电影| 国产精品日本精品| 欧美在线激情视频| 美女精品视频一区| 免费av一区二区| 欧美日韩在线第一页| 精品日本高清在线播放| 草民午夜欧美限制a级福利片| 亚洲精品xxxx| 国产精品视频26uuu| 亚洲跨种族黑人xxx| 日韩av在线一区二区| 欧美高清视频在线播放| 欧美成年人视频| 欧美一区二三区| 成人精品久久av网站| 欧美激情精品久久久久久| 日韩在线观看网址| 久久久久久久久久亚洲| 欧美电影免费观看高清完整| 欧美另类老肥妇| 韩剧1988在线观看免费完整版| 国产精品视频公开费视频| 日韩欧美精品网站| 狠狠躁夜夜躁久久躁别揉| 亚洲已满18点击进入在线看片| 久久中文字幕在线视频| 成人高清视频观看www| 国产欧美在线观看| 97在线视频精品| 韩国精品美女www爽爽爽视频| 日本中文字幕不卡免费| 性色av一区二区三区免费| 欧美大片免费观看| 91嫩草在线视频| 亚洲色图综合久久| 欧美又大又粗又长| 91在线精品视频| 国产精品第8页| 亚洲精品久久久久久久久久久久| 日韩精品免费综合视频在线播放| 欧美激情乱人伦一区| 日韩欧亚中文在线| 亚洲一区二区少妇| 91成人精品网站| 26uuu日韩精品一区二区| 色综合视频网站| 日韩精品视频三区| 午夜剧场成人观在线视频免费观看| 亚洲人成毛片在线播放| 成人免费淫片视频软件| 51色欧美片视频在线观看| 日韩电影中文 亚洲精品乱码| 国产精品揄拍一区二区| 亚洲精品黄网在线观看| 国产日韩欧美日韩| 色综合亚洲精品激情狠狠| 九九视频这里只有精品| 精品一区二区三区四区在线| 91麻豆国产语对白在线观看| 国产成人亚洲精品| 国产精品久久久久久久久久久久久久| 神马国产精品影院av|