java IO 字符流(二)InputStreamReader与OutputStreamWriter

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();  
    }

}

自己能想到的用法就这个比较合适了,可能实际应用中应该有更好的用法,到时候再更新吧,先将自己的一点理解记录下来。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值