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

首頁 > 學院 > 開發設計 > 正文

java文件系統中的的NIO與IO

2019-11-14 21:13:43
字體:
來源:轉載
供稿:網友
java文件系統中的的NIO與IO

java從jdk1.4后就引入了java NIO機制:

NIO的顯著特點就是通道(channel)、緩沖(buffer)、選擇器(selector),NIO機制中添加了傳統I/O機制中沒有的非阻塞調用(這對于網絡通信很有用,可以有效利用CPU),但是這個只能對于網絡通道(Socketchannel)才適用,filechannel還是阻塞調用。

我們現在專門分析的是java中的文件I/O機制,而不管網絡的socket通信機制。

Java中傳統的文件系統I/O機制是Filesystem和File,java中的Filesystem是java中的內部類,不提供對外的顯示特性,File類中的包含了Filesystem的對象,從而對于File的操作,比如rename、create etc 都轉成成java中的內部類Filesystem的操作。下面的是java中的Filesystem的抽象類:

abstract class FileSystem { /** * Return the FileSystem object rePResenting this platform's local * filesystem. */ public static native FileSystem getFileSystem(); /* -- Normalization and construction -- */ /** * Return the local filesystem's name-separator character. */ public abstract char getSeparator(); /** * Return the local filesystem's path-separator character. */ public abstract char getPathSeparator(); 。。。。。。

}

每個操作系統中都有一個具體的文件系統,而在windows下,通過Filesystem的getFilesystem()操作獲取本地文件系統,win32Filesystem; 而對于linux系統下,獲取的是unixFilesystem;

而java中傳統的I/O機制中的File對象,通過包含Filesystem對象,來達到對于文件系統下文件的管理操作create、delete、rename等。而關于文件的I/O數據流,輸入和輸出,采用的是Fileinputstream和Fileoutputstream。下面以Fileinputstream為例,Fileinputstream中的文件操作函數包括如下:

private native void open(String name) throws FileNotFoundException;

/** * Reads a byte of data from this input stream. This method blocks * if no input is yet available. * * @return the next byte of data, or <code>-1</code> if the end of the * file is reached. * @exception IOException if an I/O error occurs. */ public int read() throws IOException { Object traceContext = IoTrace.fileReadBegin(path); int b = 0; try { b = read0(); } finally { IoTrace.fileReadEnd(traceContext, b == -1 ? 0 : 1); } return b; } private native int read0() throws IOException;

/** * Reads a subarray as a sequence of bytes. * @param b the data to be written * @param off the start offset in the data * @param len the number of bytes that are written * @exception IOException If an I/O error has occurred. */ private native int readBytes(byte b[], int off, int len) throws IOException; public native long skip(long n) throws IOException;

等,上面是幾個重要的函數,每次File讀取操作的時候都有個文件讀取位置,在linux文件系統下是文件描述符FileDescriptor,而windows系統下是handler,讀取位置是通過FileDescriptor或者Handler來完成的,每次只能從上一次的位置讀取文件操作。

但是Java中的NIO(New I/O)中引入了FileChannel,在FileChannel中有如下新特性:

  1. 字節讀取可以以相對位置讀取,也可以以絕對位置讀取
  2. 一個文件的區域可以直接映射進入到內存中去
  3. 字節可以從一個文件傳送到另外一個文件,通過transferto方法,直接在內核空間進行文件傳輸,而不用在用戶態和內核態之間來回切換,有效減少了文件傳輸時間(在linux下有個相應的函數是sendfile,直接是在內核態進行文件傳輸,而無須在用戶態和內核態之間來回進行數據切換)

相應的Filechannel是一個抽象類:

public abstract class FileChannel extends AbstractInterruptibleChannel implements SeekableByteChannel, GatheringByteChannel, ScatteringByteChannel {。。。}

新增加的方法是: /** * Reads a sequence of bytes from this channel into the given buffer, * starting at the given file position. * * <p> This method works in the same manner as the {@link * #read(ByteBuffer)} method, except that bytes are read starting at the * given file position rather than at the channel's current position. This * method does not modify this channel's position. If the given position * is greater than the file's current size then no bytes are read. </p> public abstract int read(ByteBuffer dst, long position) throws IOException; /** * Writes a sequence of bytes to this channel from the given buffer, * starting at the given file position. * * <p> This method works in the same manner as the {@link * #write(ByteBuffer)} method, except that bytes are written starting at * the given file position rather than at the channel's current position. * This method does not modify this channel's position. If the given * position is greater than the file's current size then the file will be * grown to accommodate the new bytes; the values of any bytes between the * previous end-of-file and the newly-written bytes are unspecified. </p> public abstract int write(ByteBuffer src, long position) throws IOException; /** * Acquires a lock on the given region of this channel's file. public abstract FileLock lock(long position, long size, boolean shared) throws IOException; /** * Forces any updates to this channel's file to be written to the storage * device that contains it. public abstract void force(boolean metaData) throws IOException; /** * Transfers bytes from this channel's file to the given writable byte * channel. * <p> This method is potentially much more efficient than a simple loop * that reads from this channel and writes to the target channel. Many * Operating systems can transfer bytes directly from the filesystem cache * to the target channel without actually copying them. </p> public abstract long transferTo(long position, long count, WritableByteChannel target) throws IOException; 上述是FileChannel新增的方法。

傳統的Java中的I/O機制中的FileInputStream的成員變量:

private final FileDescriptor fd; 即傳統的java文件系統采用的是通過文件描述符的形式來記住文件的存取位置

而java中的NIO機制也是采用類似的機制:

// Used to make native read and write calls private static NativeDispatcher nd; // Memory allocation size for mapping buffers private static long allocationGranularity; // Cached field for MappedByteBuffer.isAMappedBuffer private static Field isAMappedBufferField; // File descriptor private FileDescriptor fd; 上面是一個具體的Filechannel類,FilechannelImpl部分成員變量。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩性视频| 亚洲高清久久久久久| 国产亚洲欧美aaaa| 欧美视频二区36p| 青青草原成人在线视频| 日韩中文字幕在线看| 欧美精品亚州精品| 国产主播喷水一区二区| 久久人人爽人人爽人人片av高请| 亚洲欧美一区二区三区在线| 色综合久久悠悠| 91精品久久久久久久久中文字幕| 夜色77av精品影院| 亚洲二区在线播放视频| 国产在线视频欧美| 国产成人精品在线播放| 欧美日本啪啪无遮挡网站| 欧美国产日韩一区二区三区| 国产免费一区二区三区在线观看| 欧美成人激情视频免费观看| 中文字幕综合一区| 欧美成人免费网| 欧美性猛交xxxxx免费看| 中文字幕亚洲欧美一区二区三区| 亚洲午夜未满十八勿入免费观看全集| 亚洲字幕一区二区| 国产成人精品午夜| 日韩最新在线视频| 国自在线精品视频| 久久中国妇女中文字幕| 国产成人在线视频| 欧美日韩免费网站| 亚洲国产第一页| 欧美天堂在线观看| 日韩电影中文字幕在线观看| 国产精品私拍pans大尺度在线| 日韩最新av在线| 欧美激情xxxxx| 91产国在线观看动作片喷水| 欧美日韩国产一区中文午夜| 美女国内精品自产拍在线播放| 亚洲成人网av| 在线观看欧美视频| 欧美日本高清视频| 亚洲欧美在线免费| 超碰日本道色综合久久综合| 91国偷自产一区二区三区的观看方式| 九色91av视频| 亚洲成人黄色在线观看| 日韩在线视频线视频免费网站| 日韩精品欧美激情| 亚洲国产成人久久综合| 日本精品一区二区三区在线播放视频| 日韩精品亚洲精品| 亚洲人成电影网站| 久久久久中文字幕2018| 超薄丝袜一区二区| 亚洲欧洲在线观看| 久久99久久久久久久噜噜| 日韩欧美中文字幕在线观看| 久久九九精品99国产精品| 亚洲第一av在线| 国产精品主播视频| 91国产视频在线| 在线不卡国产精品| 国产欧洲精品视频| 在线电影欧美日韩一区二区私密| 日韩激情视频在线| 成人黄色中文字幕| 欧美激情中文字幕在线| 成人乱色短篇合集| 国产欧美久久久久久| 亚洲成av人乱码色午夜| 理论片在线不卡免费观看| 欧美性受xxx| 成人在线精品视频| 久久人人爽人人爽人人片亚洲| 国产v综合ⅴ日韩v欧美大片| 久久久久久久91| 国产精品福利在线观看网址| 日韩av黄色在线观看| 亚洲激情视频在线观看| 久久精品成人欧美大片古装| 色综合久综合久久综合久鬼88| 69久久夜色精品国产69| 国产精品久久久久久久美男| 亚洲第一区中文字幕| 国产成人亚洲综合青青| 在线观看视频亚洲| 亚洲欧洲日本专区| 91嫩草在线视频| 国产精品九九九| 精品一区精品二区| 精品视频在线播放| 欧美另类老肥妇| 精品亚洲va在线va天堂资源站| 欧美乱人伦中文字幕在线| 亚洲一区二区三区四区在线播放| 国产成人精品日本亚洲| 国产日韩欧美成人| 久久久久久九九九| 九九热r在线视频精品| 亚洲精品720p| 国内精久久久久久久久久人| 国产精品免费看久久久香蕉| 欧美在线视频观看免费网站| 欧美日韩国产一区二区| 中文字幕欧美日韩va免费视频| 国产精品美乳在线观看| 欧美极品第一页| 久久精品国产清自在天天线| 最近免费中文字幕视频2019| 久久精品亚洲热| 中文字幕精品一区二区精品| 亚洲精品一区在线观看香蕉| 中文字幕日韩精品在线观看| 亚洲福利视频在线| 国产女人精品视频| 久久精品成人欧美大片古装| 福利一区视频在线观看| 亚洲精品欧美一区二区三区| 日韩在线免费视频观看| 永久免费毛片在线播放不卡| 亚洲第一网站男人都懂| 日韩在线观看网站| 国产亚洲视频在线| 亚洲国产免费av| 国产精品一区二区久久久久| 亚洲成色777777在线观看影院| 中文字幕亚洲情99在线| 久久久精品中文字幕| 丝袜美腿亚洲一区二区| 欧美日韩中文字幕在线| 日韩在线观看免费全集电视剧网站| 91在线免费观看网站| 91九色综合久久| 九九久久久久久久久激情| 日韩欧美亚洲综合| 亚洲第一视频网| 日韩欧美亚洲一二三区| 亚洲欧美中文在线视频| 中文字幕一区二区精品| 久久精品99国产精品酒店日本| 97久久精品人人澡人人爽缅北| 国产亚洲精品久久久久久777| 欧美激情久久久久久| 日韩一区av在线| 亚洲欧美另类国产| 欧美激情在线狂野欧美精品| 亚洲视频日韩精品| 日韩精品在线免费观看视频| 成人免费淫片aa视频免费| 夜夜狂射影院欧美极品| 8090成年在线看片午夜| 久久久久久久久亚洲| 最近日韩中文字幕中文| 久久久久久久久国产精品| 国产视频精品va久久久久久| 91在线免费看网站| 亚洲精品suv精品一区二区| 日韩在线观看高清| 中文字幕视频一区二区在线有码| 一二美女精品欧洲| 成人激情视频在线观看|