您的位置:首页 > 理论基础 > 计算机网络

Java网络编程学习笔记(二)流

2016-07-24 18:32 441 查看

输入输出(I/O)

输入输出(I/O)是指程序与外部设备或其他计算机进行交互的操作。几乎所有的程序都具有输入与输出操作,如从键盘上读取数据,从本地或网络上的文件读取数据或写入数据等。通过输入和输出操作可以从外界接收信息,或者是把信息传递给外界。Java把这些输入与输出操作用流来实现,通过统一的接口来表示,从而使程序设计更为简单。

流(Stream)是指在计算机的输入输出操作中各部件之间的数据流动。按照数据的传输方向,流可分为输入流与输出流。Java语言里的流序列中的数据既可以是未经加工的原始二进制数据,也可以是经过一定编码处理后符合某种特定格式的数据。

输入流

1.Java的基本输入流类(java.io.InputStream)及其基本方法

public abstract int read()throws IOException

public int read (byte[] input)throws IOException

public int read (byte[] input, int offset, int length)throws IOException

public long skip(long n)throws IOException

public int available()throws IOException

public void close()throws IOException



InputStream的子类


2.注意事项:

①InputStream的基本方法是没有参数的read()方法。该方法从输入流的源中读取1字节数据,作为一个0到255的int返回。流的结束通过返回-1来表示。read()方法会等待并阻塞其后任何代码的执行,直到有1字节的数据可供读取。输入和输出可能很慢,所以如果程序在做其他重要的工作,要尽量将I/O放在单独的线程中。

②一旦结束对输入流的操作,应当调用它的close()方法将其关闭,这会释放与这个流关联的所有资源,如句柄或端口。

③如果不想等待所需的全部字节都立即返回,可以使用available()方法来确定不阻塞的情况下有字节可以读取。在流的最后,available()会返回0。

④PrintStream类是大多数程序员都会遇到的第一个过滤器输出流,因为System.out就是一个PrintStream。PrintStream是有害的,网络程序员应当像躲避瘟疫一样避开它。

⑤在少数情况下,你可能希望跳过数据不进行读取。skip()方法会完成这项任务。与读取文件相比,在网络连接中它的用处不大。网络连接是顺序的,一般情况下很慢,所以与跳过数据(不读取)相比,读取数据并不会耗费太长时间。

⑥可以从流中读取的多字节的数据填充一个指定的数组:

read(byte[] input);

read(byte[] input, int offset, int length);

第一个方法尝试填充指定的数组input。

第二个方法尝试填充指定的input中从offset开始连续length字节的子数组。

读取多字节的方法返回实际读取的字节数(而不会马上阻塞等待后面的字节),而流的结束也通过返回-1来表示。但如果length为0,那么它不会注意到流的结束,而是返回0。

输出流

1.Java的基本输出流类(java.io.OutputStream)及其基本方法

public abstract void write(int b)throws IOException

public void write (byte[] data)throws IOException

public void write (byte[] data, int offset, int length)throws IOException

public void flush()throws IOException

public void close()throws IOException



OutputStream的子类


2.注意事项:

①刷新输出流是低成本的操作,应当在关闭流之前立即刷新输出所有流。

②一旦结束对输出流的操作,应当调用它的close()方法将其关闭,这会释放与这个流关联的所有资源,如句柄或端口。

如果有多字节要发送,则一次全部发送不失为一个好主意。使用write(byte[] data)或write(byte[] data, int offset, int length)通常比一次写入data数组中的1字节要快得多。

③如果有多字节要发送,则一次全部发送不失为一个好主意。使用write(byte[] data)或write(byte[] data, int offset, int length)通常比一次写入data数组中的1字节要快得多。

④Java7引入了“带资源的try”构造(try with resources),不需要在try块之外声明流变量,完全可以在try块的一个参数表中声明。现在不再需要finally子句。Java会对try块参数表中声明的所有AutoCloseable对象自动调用close(),例如:

try (OutputStream out = new FileOutputStream("/tmp/data.txt")) {
//处理输出流
} catch (IOException ex) {
System.err.println(ex.getMessage());
}


标记和重置

InputStream类还有3个不太常用的方法,允许程序备份和重新读取已经读取的数据。这些方法是:

public void mark(int readAdeadLimit)

public void reset() throws IOException

public boolean markSupported()

为了重新读取数据,要用mark()方法标记流的当前位置。在以后某个时刻,可以用reset()方法把流重置到之前标记的位置。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  网络编程 java