输入输出流 InputStream/OutputStream InputStreamReader/ OutputStreamWriter BufferedReader/Printwriter

最近写服务端Socket通信,遇到 

BufferedReader in = new BufferedReader(new InputStreamReader(this.socket.getInputStream()))

又想起来以前文件操作是遇到的 FileInputStream等类,read(),  readLine(), write(String) ,write(buf)等方法。感觉需要做个总结归纳一下。

字节流和字符流

 对文件直接进行操作都属于字节流(byte Stream)

 程序可以处理单个字节,但更多时候用到更多的是字符和字符串

字节流--------字符流之间可以进行转换。

InputStream OutputStream

输入输出流的最基础父类,本身为Abstract 基类,不单独使用

使用时往往是集成二者之后的子类,全部带有InputStream OutputStream 的类都是如此,这些应是字节流,如

FileInputStream

FileOutputStream

使用:FileInputStream 内容是一个个字节,最后一位是 -1  根据此判断读完(伪代码)

(-1 的原因: 因为inputStream.read()源码本质是读取,byte[]数组里的一个byte,byte 8个二进制位,有符号【-128,127】,read()处理按照无符号处理,【0,255】,如果数组内还有字节读取,返回【0,255】值,如果数组为空返回-1约定为数组为空;注意:此处是返回处理为-1,而不是真实值为-1)

                       in = new FileInputStream(path);

                       while( int a = in.read()!=-1)

                       {System.out.println( a);//字节
 
                       }
 File file=new File("d:\\d.text");
        
        try {
            //创建文件字节输出流对象,准备向d.txt文件中写出数据,true表示在原有的基础上增加内容
            FileOutputStream fout=new FileOutputStream(file,true);
            Scanner sc=new Scanner(System.in);
            
            System.out.println("请写出一段字符串:");
            String msg=sc.next()+"\r\n";;
            
            /******************(方法一)按字节数组写入**********************/
            //byte[] bytes = msg.getBytes();//msg.getBytes()将字符串转为字节数组
            
            //fout.write(bytes);//使用字节数组输出到文件
            /******************(方法一)逐字节写入**********************/
            byte[] bytes = msg.getBytes();
            for (int i = 0; i < bytes.length; i++) {
                fout.write(bytes[i]);//逐字节写文件
            }
            fout.flush();//强制刷新输出流
            fout.close();//关闭输出流
            System.out.println("写入完成!");
}

 

InputStreamReader/OutputStreamWriter

处理字符流的抽象类,可以对InputStream OutputStream进行转换

InputStreamReader 是字节流通向字符流的桥梁,它将字节流转换为字符流.InputStream对象是一个个字节;

 

                FileInputStream fis=new FileInputStream("d://desktop//test.txt");     
                InputStreamReader isr=new InputStreamReader(fis,"utf8");     
                int i;     
                while((i=isr.read()) != -1){     
                    System.out.println((char)i);  //操作对象为字符char    
  

 

	public void Test20() throws Exception {		
		OutputStream out = System.err;// 打印到控制台,也可以输出到文件
		OutputStreamWriter osr = new OutputStreamWriter(out);//输出 往out里面准备写内容,内容在下面
		String str = "Hello World!";
		osr.write(str);//写字符串
		//osr.flush();//如果用于网络传输,记得强制刷新缓冲区,否则输出的数据只停留在缓冲区中,而无法进行网络传输
		osr.close();//关闭资源

OutputStreamWriter是字符流通向字节流的桥梁,它将字符流转换为字节流. 

此处参照 https://blog.csdn.net/pkx1993/article/details/80991812 

               https://blog.csdn.net/Appleyk/article/details/79639444 

 BufferedReader/Printwriter

对 InputStreamReader进一步封装,传入InputStream构造,可以一次读取一行,更加灵活,readLine(),判断文件结尾是根据readLine()是否==null

原始问题

BufferedReader in = new BufferedReader(new InputStreamReader(this.socket.getInputStream()))
                     //字符流进一步封装     //单个字符流                   //字节流

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值