黑马程序员技术交流社区

标题: 关于FileInputStream.write方法的一个问题 [打印本页]

作者: 戴振良    时间: 2012-3-31 23:05
标题: 关于FileInputStream.write方法的一个问题
本帖最后由 戴振良 于 2012-3-31 23:09 编辑

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

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

上面这两个方法的代码是从FileInputStream类的源文件里复制过来的

在张孝详老师的视频里说,使用FileInputStream.write(byte b[])方法后,即使没有调用该类的flush()或者close()方法,bytep字节一样会写到文件去,这是因为在write方法里面调用了flush。

于是我找到源文件,想看看源代码中的write(byte b[])方法是不是真的调用了flush()方法和它是怎么把字节写到缓冲区的。我找到了write(byte b[])方法,它里面就调用了writeBytes(b, 0, b.length);这个方法,于是我找到了  private native void writeBytes(byte b[], int off, int len) throws IOException;这个,这里什么代码体都没有啊,它是怎么一回事呢?这代码有什么用啊,就抛出了个异常,还有这里的native是什么修饰符,干什么用的?

其实我最想知道的就是writeBytes(b, 0, b.length)方法里面的代码体,我想看看它里面有没有调用flush方法,希望大家先回答这个最主要的问题,谢谢!!!!!!!!{:soso_e183:} {:soso_e183:} {:soso_e183:} {:soso_e183:} {:soso_e183:}

作者: 贠(yun)靖    时间: 2012-3-31 23:26
private native void writeBytes(byte b[], int off, int len) throws IOException;  
  这是本地方放  native修饰的  调用windows系统的东西   具体怎么实现的 就不知道了
作者: 张明星    时间: 2012-4-1 08:47
native是方法修饰符。Native方法是由另外一种语言(如c/c++,FORTRAN,汇编)实现的本地方法。因为在外部实现了方法,所以在java代码中,就不需要声明了,有点类似于借口方法。Native可以和其他一些修饰符连用,但是abstract方法和Interface方法不能用native来修饰。

当在方法中调用一些不是由java语言写的代码或者在方法中用java语言直接操纵计算机硬件时要声明为native方法。

java中,通过JNI(Java Native Interface,java本地接口)来实现本地化。在java\include\jni.h目录中,由虚拟机来实现,没法知道具体细节


作者: 戴振良    时间: 2012-4-1 10:54
张明星 发表于 2012-4-1 08:47
native是方法修饰符。Native方法是由另外一种语言(如c/c++,FORTRAN,汇编)实现的本地方法。因为在外部实 ...

回答很详细,谢谢!!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2