副标题#e#
本章对FileDescriptor举办先容
FileDescriptor 先容
FileDescriptor 是“文件描写符”。
FileDescriptor 可以被用来暗示开放文件、开放套接字等。
以FileDescriptor暗示文件来说:当FileDescriptor暗示某文件时,我们可以通俗的将FileDescriptor当作是该文件。可是,我们不能直接通过FileDescriptor对该文件举办操纵;若需要通过FileDescriptor对该文件举办操纵,则需要新建设FileDescriptor对应的FileOutputStream,再对文件举办操纵。
in, out, err先容
(01) in — 尺度输入(键盘)的描写符
(02) out — 尺度输出(屏幕)的描写符
(03) err — 尺度错误输出(屏幕)的描写符
它们3个的道理和用法都雷同,下面我们通过out来举办深入研究。
out 的浸染和道理
out是尺度输出(屏幕)的描写符。可是它有什么浸染呢?
我们可以通俗领略,out就代表了尺度输出(屏幕)。若我们要输出信息到屏幕上,即可通过out来举办操纵;可是,out又没有提供输出信息到屏幕的接口(因为out本质是FileDescriptor工具,而FileDescriptor没有输出接口)。怎么办呢?
很简朴,我们建设out对应的“输出流工具”,然后通过“输出流”的write()等输出接口就可以将信息输出到屏幕上。如下代码:
try { FileOutputStream out = new FileOutputStream(FileDescriptor.out); out.write('A'); out.close(); } catch (IOException e) { }
执行上面的措施,会在屏幕上输出字母’A’。
为了利便我们操纵,java早已为我们封装好了“能利便的在屏幕上输出信息的接口”:通过System.out,我们能利便的输出信息到屏幕上。
因此,我们可以等价的将上面的措施转换为如下代码:
System.out.print(‘A’);
下面讲讲上面两段代码的道理
查察看out的界说。它的界说在FileDescriptor.java中,相关源码如下:
public final class FileDescriptor { private int fd; public static final FileDescriptor out = new FileDescriptor(1); private FileDescriptor(int fd) { this.fd = fd; useCount = new AtomicInteger(); } ... }
从中,可以看出
(01) out就是一个FileDescriptor工具。它是通过结构函数FileDescriptor(int fd)建设的。
(02) FileDescriptor(int fd)的操纵:就是给fd工具(int范例)赋值,并新建一个利用计数变量useCount。
fd工具长短常重要的一个变量,“fd=1”就代表了“尺度输出”,“fd=0”就代表了“尺度输入”,“fd=2”就代表了“尺度错误输出”。
FileOutputStream out = new FileOutputStream(FileDescriptor.out); 就是操作结构函数FileOutputStream(FileDescriptor fdObj)来建设“Filed.out对应的FileOutputStream工具”。
关于System.out是如何界说的。可以参考" 深入相识System.out.println("hello world"); "
TODO
通过上面的进修,我们知道,我们可以自界说尺度的文件描写符[即,in(尺度输入),out(尺度输出),err(尺度错误输出)]的流,从而完成输入/输出成果;可是,java已经为我们封装好了相应的接口,即我们可以更利便的System.in, System.out, System.err去利用它们。
别的,我们也可以自界说“文件”、“Socket”等的文件描写符,进而对它们举办操纵。参考下面示例代码中的testWrite(), testRead()等接口。
查察本栏目
#p#副标题#e#
示例代码
源码如下(FileDescriptorTest.java):
import java.io.PrintStream; import java.io.FileDescriptor; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; /** * FileDescriptor 测试措施 * * @author skywang */ public class FileDescriptorTest { private static final String FileName = "file.txt"; private static final String OutText = "Hi FileDescriptor"; public static void main(String[] args) { testWrite(); testRead(); testStandFD() ; //System.out.println(OutText); } /** * FileDescriptor.out 的测试措施 * * 该措施的结果 等价于 System.out.println(OutText); */ private static void testStandFD() { // 建设FileDescriptor.out 对应的PrintStream PrintStream out = new PrintStream( new FileOutputStream(FileDescriptor.out)); // 在屏幕上输出“Hi FileDescriptor” out.println(OutText); out.close(); } /** * FileDescriptor写入示例措施 * * (01) 为了说明,"通过文件名建设FileOutputStream"与“通过文件描写符建设FileOutputStream”工具是等效的 * (02) 该措施会在“该源文件”地址目次新建文件"file.txt",而且文件内容是"Aa"。 */ private static void testWrite() { try { // 新建文件“file.txt”对应的FileOutputStream工具 FileOutputStream out1 = new FileOutputStream(FileName); // 获取文件“file.txt”对应的“文件描写符” FileDescriptor fdout = out1.getFD(); // 按照“文件描写符”建设“FileOutputStream”工具 FileOutputStream out2 = new FileOutputStream(fdout); out1.write('A'); // 通过out1向“file.txt”中写入'A' out2.write('a'); // 通过out2向“file.txt”中写入'A' if (fdout!=null) System.out.printf("fdout(%s) is %s\n",fdout, fdout.valid()); out1.close(); out2.close(); } catch(IOException e) { e.printStackTrace(); } } /** * FileDescriptor读取示例措施 * * 为了说明,"通过文件名建设FileInputStream"与“通过文件描写符建设FileInputStream”工具是等效的 */ private static void testRead() { try { // 新建文件“file.txt”对应的FileInputStream工具 FileInputStream in1 = new FileInputStream(FileName); // 获取文件“file.txt”对应的“文件描写符” FileDescriptor fdin = in1.getFD(); // 按照“文件描写符”建设“FileInputStream”工具 FileInputStream in2 = new FileInputStream(fdin); System.out.println("in1.read():"+(char)in1.read()); System.out.println("in2.read():"+(char)in2.read()); if (fdin!=null) System.out.printf("fdin(%s) is %s\n", fdin, fdin.valid()); in1.close(); in2.close(); } catch(IOException e) { e.printStackTrace(); } } }
运行功效:
fdout(java.io.FileDescriptor@2b820dda) is true
in1.read():A
in2.read():a
fdin(java.io.FileDescriptor@675b7986) is true
Hi FileDescriptor
来历:http://www.cnblogs.com/skywang12345/p/io_09.html