java io流就字节流与字符流两种,而InputStreamReader与OutputStreamWriter就是字节流与字符流之间转换的桥梁类。平常项目中用到的不多,但是如果与前台交互或者系统间通信可能会用到,最常用到的系统应该是聊天系统。
一、InputStreamReader:
是Reader的子类,将输入的字节流变为字符流,将一个字节流的输入对象变为字符流的输入对象。是字节流通向字符流的桥梁,如果不指定字符集编码,该解码过程将使用平台默认的字符编码。
从源码可以看到其构造方法有四种:
其中必要的参数为InputStream(字节流输入流的父类),另外的参数则是通过不同的方式设置字符编码。
二、OutputStreamWriter:
是Writer的子类,将输出的字符流变为字节流,将一个字符流的输出对象变为字节流的输出对象。是字符流通向字节流的桥梁,如果不指定字符集编码,该解码过程将使用平台默认的字符编码。
其构造方法与InputStreamReader类似:
其中必要的参数为OutputStream(字节流输出流的父类),另外的参数则是通过不同的方式设置字符编码。
三、具体使用
比较简单的实例化,然后在输入输出就不写例子的,比较常用的一个小程序,应该能在实际中更好的理解这两个类的应用。就是基于Socket的聊天系统,抛开业务不讲,单说socket通信传输的是字节流,然而客户端输入的肯定是字符串,而服务端也是要显示为字符串的,并且两者的编码必须一致,要不然解码之后都看不懂了,以为乱码了。那么客户端其实需要的就是将字符流转换为字节流传输,而服务端则是接收字节流,转换为字符流显示。
1.客户端:
public class Client {
private Socket socket;
public Client() {
try {
socket = new Socket("localhost", 9909);
} catch (Exception e) {
e.printStackTrace();
}
}
@SuppressWarnings("resource")
public void start() {
try {
//获取socket通信的输出流对象
OutputStream out = socket.getOutputStream();
//新建字符转字节的OutputStreamWriter,将输入的字符流转为字节流,方便传输
OutputStreamWriter osw = new OutputStreamWriter(out, "UTF-8");
PrintWriter pw = new PrintWriter(osw, true);
Scanner scanner = new Scanner(System.in);
while (true) {
pw.println(scanner.nextLine());
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (socket != null) {
try {
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
Client client = new Client();
client.start();
}
}
2.服务端:
public class Server {
private ServerSocket serverSocket;
public Server(){
try{
serverSocket = new ServerSocket(9909);
}catch(Exception e){
e.printStackTrace();
}
}
public void start(){
try{
System.out.println("等待客户端连接。。。");
//方法会产生阻塞,直到某个Socket连接,返回请求连接的Socket
Socket socket = serverSocket.accept();
System.out.println("客户端已连接!");
//获取socket通信的输入流对象
InputStream in = socket.getInputStream();
//将输入的字节流转换为字符流方便打印
InputStreamReader isr = new InputStreamReader(in, "UTF-8");
BufferedReader br = new BufferedReader(isr);
//不断读取客户端数据
while(true){
System.out.println("客户端说:" + br.readLine());
}
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] args) {
Server server = new Server();
server.start();
}
}
自己能想到的用法就这个比较合适了,可能实际应用中应该有更好的用法,到时候再更新吧,先将自己的一点理解记录下来。