JVM-FileOutputStream 소스

2360 단어
OutPutStream의 write 방법의 반환값은 Void이지만 운영체제의 write 인터페이스 반환값은 int입니다. 다음은 File OutputStream의 예를 들어 어떻게 봉인되었는지 보십시오.1.FileOutputStream.write
public void write(byte b[]) throws IOException {
        writeBytes(b, 0, b.length, append);
    }
  • FileOutputStream.writeBytes
  •  /**
         * Writes a sub array as a sequence of bytes.
         * @param b the data to be written
         * @param off the start offset in the data
         * @param len the number of bytes that are written
         * @param append {@code true} to first advance the position to the
         *     end of file
         * @exception IOException If an I/O error has occurred.
         */
        private native void writeBytes(byte b[], int off, int len, boolean append)
            throws IOException;
    

    4
  • 마지막으로 호출된native 방법 파일 이름:/jdk/src/share/native/java/io/ioutil.c
  • void
    writeBytes(JNIEnv *env, jobject this, jbyteArray bytes,
               jint off, jint len, jboolean append, jfieldID fid)
    {
        jint n;
        char stackBuf[BUF_SIZE];
        char *buf = NULL;
        FD fd;
    
        if (IS_NULL(bytes)) {
            JNU_ThrowNullPointerException(env, NULL);
            return;
        }
    
        if (outOfBounds(env, off, len, bytes)) {
            JNU_ThrowByName(env, "java/lang/IndexOutOfBoundsException", NULL);
            return;
        }
    
        if (len == 0) {
            return;
        } else if (len > BUF_SIZE) {
            buf = malloc(len);
            if (buf == NULL) {
                JNU_ThrowOutOfMemoryError(env, NULL);
                return;
            }
        } else {
            buf = stackBuf;
        }
    
        (*env)->GetByteArrayRegion(env, bytes, off, len, (jbyte *)buf);
    
        if (!(*env)->ExceptionOccurred(env)) {
            off = 0;
            while (len > 0) {
                fd = GET_FD(this, fid);
                if (fd == -1) {
                    JNU_ThrowIOException(env, "Stream Closed");
                    break;
                }
                if (append == JNI_TRUE) {
                    n = IO_Append(fd, buf+off, len);
                } else {
                    n = IO_Write(fd, buf+off, len);
                }
                if (n == -1) {
                    JNU_ThrowIOExceptionWithLastError(env, "Write error");
                    break;
                }
                off += n;
                len -= n;
            }
        }
        if (buf != stackBuf) {
            free(buf);
        }
    }
    

    좋은 웹페이지 즐겨찾기