2015-10-03 6 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

private native void writeBytes(byte b[], int off, int len) throws IOException; 

public void write(byte b[]) throws IOException { 
    writeBytes(b, 0, b.length); 
} 

Я искал внутри 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_append и io_write на самом деле? Я могу» t найти, как они реализованы.

ответ

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; 
}