Операция записи Java io_append io_write

Я пытаюсь выяснить, как Java записывает байты на диск.

Если я посмотрю на реализацию 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 на самом деле? Я не могу найти, как они реализованы.

1 ответ

Решение

Похоже, что 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;
}
Другие вопросы по тегам