快速业务通道

java源码FileInputStream - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23
negative, * <code>len</code> is negative, or <code>len</code> is greater than * <code>b.length - off</code> * @exception IOException if an I/O error occurs. */ public int read(byte b[], int off, int len) throws IOException { return readBytes(b, off, len); }

看出readBytes是关键的所在,windows的native code中只有

JNIEXPORT void JNICALL Java_java_io_FileInputStream_close0(JNIEnv *env, jobject this) { handleClose(env, this, fis_fd); }

是平台相关的。

其他的在share中

FileInputStream.c代码

jfieldID fis_fd; /* id for jobject ''fd'' in java.io.FileInputStream */

/**************************************************************

* static methods to store field ID''s in initializers

*/

java源码FileInputStream(3)

时间:2010-12-14

得到fd的值,这个很重要

JNIEXPORT void JNICALL Java_java_io_FileInputStream_initIDs(JNIEnv *env, jclass fdClass) { fis_fd = (*env)->GetFieldID(env, fdClass, "fd", "Ljava/io/FileDescriptor;"); }

/**************************************************************

* Input stream

*/

JNIEXPORT void JNICALL Java_java_io_FileInputStream_open(JNIEnv *env, jobject this, jstring path) { fileOpen(env, this, path, fis_fd, O_RDONLY); } JNIEXPORT jint JNICALL Java_java_io_FileInputStream_read(JNIEnv *env, jobject this) { return readSingle(env, this, fis_fd); } JNIEXPORT jint JNICALL Java_java_io_FileInputStream_readBytes(JNIEnv *env, jobject this, jbyteArray bytes, jint off, jint len) { return readBytes(env, this, bytes, off, len, fis_fd); } JNIEXPORT jlong JNICALL Java_java_io_FileInputStream_skip(JNIEnv *env, jobject this, jlong toSkip) { jlong cur = jlong_zero; jlong end = jlong_zero; FD fd = GET_FD(this, fis_fd); if ((cur = IO_Lseek(fd, (jlong)0, (jint)SEEK_CUR)) == -1) { JNU_ThrowIOExceptionWithLastError(env, "Seek error"); } else if ((end = IO_Lseek(fd, toSkip, (jint)SEEK_CUR)) == -1) { JNU_ThrowIOExceptionWithLastError(env, "Seek error"); } return (end - cur); } JNIEXPORT jint JNICALL Java_java_io_FileInputStream_available(JNIEnv *env, jobject this) { jlong ret; FD fd = GET_FD(this, fis_fd); if (IO_Available(fd, &ret)) { if (ret > INT_MAX) { ret = (jlong) INT_MAX; } return jlong_to_jint(ret); } JNU_ThrowIOExceptionWithLastError(env, NULL); return 0; }

java源码FileInputStream(4)

时间:2010-12-14

主要是readBytes的实现,打开io_util.c文件

/* IO helper functions */

int readSingle(JNIEnv *env, jobject this, jfieldID fid) { int nread; char ret; FD fd = GET_FD(this, fid); nread = IO_Read(fd, &ret, 1); if (nread == 0) { /* EOF */ return -1; } else if (nread == JVM_IO_ERR) { /* error */ JNU_ThrowIOExceptionWithLastError(env, "Read error"); } else if (nread == JVM_IO_INTR) { JNU_ThrowByName(env, "java/io/InterruptedIOException", 0); } return ret & 0xFF; }

/* The maximum size of a stack-allocated buffer.

*/

#define BUF_SIZE 8192

int readBytes(JNIEnv *env, jobject this, jbyteArray bytes, jint off, jint len, jfieldID fid

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号