“文件描述符”,可以被用來表示開放文件、開放套接字等。實例用作與基礎機器有關的某種結構的不透明句柄,該結構表示開放文件、開放套接字或者字節的另一個源或接收者。文件描述符的主要實際用途是創建一個包含該結構的 FileInputStream 或 FileOutputStream。
in, out, errFileOutputStream out = new FileOutputStream(FileDescriptor.out); out.write('A'); out.close();執行上面的程序,會在屏幕上輸出字母'A'。等價于:
System.out.OutputStream 的 flush大部分人都認為flush后,其他用戶應該立即可見,但是在一些極端的情況下也需調用后還是無法看見以寫入的數據。刷新此輸出流并強制寫出所有緩沖的輸出字節。flush 的常規協定是:如果此輸出流的實現已經緩沖了以前寫入的任何字節,則調用此方法指示應將這些字節立即寫入它們預期的目標。
如果此流的預期目標是由基礎操作系統提供的一個抽象(如一個文件),則刷新此流只能保證將以前寫入到流的字節傳遞給操作系統進行寫入,但不保證能將這些字節實際寫入到物理設備(如磁盤驅動器)。OutputStream 的 flush 方法不執行任何操作。為什么會這樣? 原因是,這個緩沖我們java自己實現的。flush保證的是內部的緩沖寫入到系統中。但是系統中文件也可能有緩沖,所以并不一定flush后立即可見。
那么如何解決這個問題?在文件流或數據流中均可以看見getFD()這個方法, 它返回的是與此流有關的文件描述符。所以調用文件描述符的sync的方法即可讓實際文件強制同步了。
sync強制所有系統緩沖區與基礎設備同步。該方法在此 FileDescriptor 的所有修改數據和屬性都寫入相關設備后返回。特別是,如果此 FileDescriptor 引用物理存儲介質,比如文件系統中的文件,則一直要等到將與此 FileDesecriptor 有關的緩沖區的所有內存中修改副本寫入物理介質中,sync 方法才會返回。 sync 方法由要求物理存儲(比例文件)處于某種已知狀態下的代碼使用。例如,提供簡單事務處理設施的類可以使用 sync 來確保某個文件所有由給定事務造成的更改都記錄在存儲介質上。 sync 只影響此 FileDescriptor 的緩沖區下游。如果正通過應用程序(例如,通過一個 BufferedOutputStream 對象)實現內存緩沖,那么必須在數據受 sync 影響之前將這些緩沖區刷新,并轉到 FileDescriptor 中(例如,通過調用 OutputStream.flush)。
我是天王蓋地虎的分割線
新聞熱點
疑難解答