Java 写操作 io_append io_write

标签 java randomaccessfile hard-drive

我正在尝试弄清楚java如何将字节写入磁盘。

如果我查看 Randomaccesfile 实现,它有 声明一个本地方法,并在调用 write(byte[]) 时调用该本地方法写入磁盘。

randomaccesss文件的源代码: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); 被调用。

这些函数可以在 JDK 的 io_util_md.h 中找到(适用于 Windows 和 Solaris)

/*
* 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实际上吗?我找不到它们是如何实现的。

最佳答案

似乎 Solaris 和 Linux 共享以下所有内容的 native 代码库 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;
}

关于Java 写操作 io_append io_write,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32923184/

相关文章:

java - 从库加载库

java - 播放不间断的声音声音池

hard-drive - 硬盘分区的标签是大写还是小写? (c:\or c:\)

javascript - 如何将js变量发送到Spring Controller ?

java - 修改 ArrayList 内数组中的单个元素

Java 随机文件访问 : Get byte offset of line start

java - RandomAccessFile setLength(0) 将空字符字符串添加到文件中

java - 如何正确关闭 MappedByteBuffer?

java - 挂载和卸载硬盘

c++ - 错误的函数调用 "IOCTL_DISK_GET_DRIVE_LAYOUT_EX"