2015-10-03 16 views
1

我想知道java如何將字節寫入磁盤。Java寫操作io_append io_write

如果我查看Randomaccesfile實現,它會聲明一個本地方法 ,並在調用write(byte [])時調用所述本機方法寫入磁盤。對於randomaccesfile

源代碼:http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b27/java/io/RandomAccessFile.java#RandomAccessFile.writeBytes%28byte%5B%5D%2Cint%2Cint%29

​​

我搜索了OpenJDK內的writeBytes,發現它裏面io_util.c 這裏的功能IO_Append(fd, buf+off, len);IO_Write(fd, buf+off, len); 被調用。

這些功能可以針對Windows和Solaris的JDK裏面io_util_md.h找到

/* 
* Route the routines 
*/ 
#define IO_Sync fsync 
#define IO_Read handleRead 
#define IO_Write handleWrite 
#define IO_Append handleWrite 
#define IO_Available handleAvailable 
#define IO_SetLength handleSetLength 

爲什麼我無法找到爲Linux一樣的嗎?什麼都io_appendio_write實際上呢?我可以」找出他們如何實施。

回答

2

似乎Solaris和Linux共享下面 http://hg.openjdk.java.net/jdk7/jdk7/jdk/

io_util_md.h定義(Solaris和Linux)

#define IO_Append JVM_Write 
#define IO_Write JVM_Write 

現在JVM_Write在熱點的代碼庫被定義,在jvm.cpp一切本機代碼基礎:

JVM_LEAF(jint, JVM_Write(jint fd, char *buf, jint nbytes)) 
    JVMWrapper2("JVM_Write (0x%x)", fd); 
    //%note jvm_r6 
    return (jint)os::write(fd, buf, nbytes); 
JVM_END 

調用操作系統依賴寫功能。 Linux實現在os_linux.inline.hpp

inline size_t os::write(int fd, const void *buf, unsigned int nBytes) { 
    size_t res; 
    RESTARTABLE((size_t) ::write(fd, buf, (size_t) nBytes), res); 
    return res; 
}