博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DataInput与DataOutput
阅读量:6573 次
发布时间:2019-06-24

本文共 3658 字,大约阅读时间需要 12 分钟。

hot3.png

习惯了读写字符串时用PrintWriter和BufferedReader

PrintWriter(BufferedWriter(OutputStreamWriter(OutputStream)))

BufferedReader(InputStreamReader(InputStream))

这两天给别人看项目代码的时候看到程序里用了readUTF和writeUTF这两个方法,顿时从尘封的记忆中唤起DataInput和DataOutput这两个接口。很久不用,我都快把它俩给忘了。

项目运行的时候总是会抛出EOFException,不明白怎么回事,于是看了看JDK文档,自己写了一段小程序测试了一下,猜测readUTF方法似乎是通过抛出EOFException来表明到达数据的末尾,如同bufferedReader.readLine()通过返回null表明到达数据的结尾一样,只是表达的方式不同而已。因此只需要通过检查EOFException异常来结束程序即可。

EOFException文档中提到:

    此异常主要被数据输入流用来表明到达流的末尾。注意,其他许多输入操作返回一个特殊值表示到达流的末尾,而不是抛出异常。

以下是我写的测试代码:(Java6)

服务端:

import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import java.net.Socket;public class Client {	/**	 * @param args	 */	public static void main(String[] args) {		Socket socket = null;		DataInputStream in = null;		DataOutputStream out = null;		try {			socket = new Socket("localhost", 10011);			out = new DataOutputStream(socket.getOutputStream());			in = new DataInputStream(socket.getInputStream());			for (int i = 0; i < 100; i++) {				out.writeUTF("aaa1");				out.flush();				System.out.println(in.readUTF());			}			in.close();			out.close();			socket.close();		} catch (Exception e) {			e.printStackTrace();		} finally {			if (in != null) {				try {					in.close();				} catch (IOException e) {					e.printStackTrace();				}			}			if (out != null) {				try {					out.close();				} catch (IOException e) {					e.printStackTrace();				}			}			if (socket != null) {				try {					socket.close();				} catch (IOException e) {					e.printStackTrace();				}			}		}	}}

客户端:

import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.EOFException;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;public class Server {	static class ReadTask implements Runnable {		private final Socket so;		public ReadTask(Socket so) {			this.so = so;		}		@Override		public void run() {			DataInputStream in = null;			DataOutputStream out = null;			try {				in = new DataInputStream(this.so.getInputStream());				out = new DataOutputStream(this.so.getOutputStream());				System.out.println("开始处理");				while (true) {					String cmd = in.readUTF();					// do some work					TimeUnit.MILLISECONDS.sleep(10);					out.writeUTF("result -- " + cmd);				}			} catch (EOFException e) {				System.out.println("处理完成");			} catch (IOException e1) {				e1.printStackTrace();			} catch (InterruptedException e) {				Thread.currentThread().interrupt();			} finally {				if (in != null) {					try {						in.close();					} catch (IOException e) {						e.printStackTrace();					}				}				if (out != null) {					try {						out.close();					} catch (IOException e) {						e.printStackTrace();					}				}				if (this.so != null) {					try {						this.so.close();					} catch (IOException e) {						e.printStackTrace();					}				}			}		}	}	/**	 * @param args	 * @throws InterruptedException	 */	public static void main(String[] args) throws InterruptedException {		ExecutorService exec = Executors.newCachedThreadPool();		ServerSocket server = null;		try {			server = new ServerSocket(10011);			System.out.println("server started");			while (true) {				Socket socket = server.accept();				ReadTask task = new ReadTask(socket);				exec.execute(task);			}		} catch (IOException e) {			e.printStackTrace();		} finally {			exec.shutdown();			exec.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);			if (server != null) {				try {					server.close();				} catch (IOException e) {					e.printStackTrace();				}			}		}	}}

转载于:https://my.oschina.net/u/580483/blog/76091

你可能感兴趣的文章
mysql允许远程登录
查看>>
js判断undefined类型
查看>>
问题账户需求分析
查看>>
你可能不知道的技术细节:存储过程参数传递的影响
查看>>
u3d移动游戏优化规范
查看>>
POJ1703 Find them, Catch them
查看>>
Eclipse Java注释模板设置
查看>>
Docker网络的基本功能操作示例
查看>>
自适应备忘录 demo
查看>>
HTML转义字符大全(转)
查看>>
Optimizing Oracle RAC
查看>>
[Javascript] Add a browser build to an npm module
查看>>
线程安全的atomic wrapper classes例子
查看>>
[摘录]调动员工积极性的七个关键
查看>>
Linux getcwd()的实现【转】
查看>>
Backup Volume 操作 - 每天5分钟玩转 OpenStack(59)
查看>>
.htaccess 基础教程(四)Apache RewriteCond 规则参数
查看>>
转: maven进阶:一个多模块项目
查看>>
Android控件之HorizontalScrollView 去掉滚动条
查看>>
UVM中的class--2
查看>>