I/O体系中的类

I----->input   O---->output  ,I/O直接从字面上理解,就是我们所说的输入输出接口,I/O接口的功能是负责实现CPU通过系统总线把I/O电路和外围设备联系在一起。而我们今天要谈到的java中的I/O系统与I/O接口在功能上有着异曲同工之妙,它使java程序与外部得以交流、沟通。举个例子:

       private BufferedReader br;
    private BufferedWriter bw;
    private List sts;


public ServerThread(Socket accept, List sts) {
		// 将当前与服务端连接的所有的通信线程传进来
		this.sts = sts;
		try {
			InputStream inputStream = accept.getInputStream();
			OutputStream outputStream = accept.getOutputStream();

			// 包装成缓冲流
			br = new BufferedReader(new InputStreamReader(inputStream));
			bw = new BufferedWriter(new OutputStreamWriter(outputStream));

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

在以上代码中,服务端读取与服务端连接的客户端发出的信息就用到了I/O体系中的四个类:inputStream,outputStream,BufferedReader,BufferedWriter。那么这四个类又有什么区别呢?或者说各自起到什么样的作用呢?

从总体上来看,java的I/O体系根据数据类型的不同可以分为字节流和字符流,而根据流向的不同又分为输入流和输出流。

用一张图来表示:

I/O体系中的类_第1张图片


由图很容易看出,I/O体系中的类很多,知识也非常丰富,这次我们只讲以下几点:

1> 字符流与字符流之间的区别

字节流与和字符流的使用非常相似,但是既然要作为两个大类区分开,必然有他们之间的差异:字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件。但只是这样说并不鲜明生动,我从网上找到几段代码:

import java.io.File;    
import java.io.FileOutputStream;    
import java.io.OutputStream;    
public class OutputStreamDemo05 {    
public static void main(String[] args) throws Exception {   // 异常抛出,  不处理    
// 第1步:使用File类找到一个文件    
     File f = new File("d:" + File.separator + "test.txt"); // 声明File  对象    
// 第2步:通过子类实例化父类对象    
     OutputStream out = null;            
// 准备好一个输出的对象    
     out = new FileOutputStream(f);      
// 通过对象多态性进行实例化    
// 第3步:进行写操作    
     String str = "Hello World!!!";      
// 准备一个字符串    
     byte b[] = str.getBytes();          
// 字符串转byte数组    
     out.write(b);                      
// 将内容输出    
 // 第4步:关闭输出流    
    // out.close();                  
// 此时没有关闭    
        }    
    }

运行以上代码,打开文件后会发现,此时没有关闭字节流操作,但是文件中也依然存在了输出的内容,证明字节流是直接操作文件本身的。而下面的代码使用字符流完成:

package org.lxh.demo12.chariodemo;    
    import java.io.File;    
    import java.io.FileWriter;    
    import java.io.Writer;    
    public class WriterDemo03 {    
        public static void main(String[] args) throws Exception { // 异常抛出,  不处理    
            // 第1步:使用File类找到一个文件    
            File f = new File("d:" + File.separator + "test.txt");// 声明File 对象    
            // 第2步:通过子类实例化父类对象    
            Writer out = null;                 
    // 准备好一个输出的对象    
            out = new FileWriter(f);            
    // 通过对象多态性进行实例化    
            // 第3步:进行写操作    
            String str = "Hello World!!!";      
    // 准备一个字符串    
            out.write(str);                    
    // 将内容输出    
            // 第4步:关闭输出流    
            // out.close();                   
    // 此时没有关闭    
        }    
    }

程序运行后会发现文件中没有任何内容,这是因为字符流操作时使用了缓冲区,而在关闭字符流时会强制性地将缓冲区中的内容进行输出,但是如果程序没有关闭,则缓冲区中的内容是无法输出的,所以得出结论:字符流使用了缓冲区,而字节流没有使用缓冲区。


2>BufferedReader与BufferedWriter 的使用

BufferedReader与BufferedWriter更多的时候是作为缓冲流优化程序而使用。因为CPU与IO界面之间存在速度上的差异,当进行大量的数据读取/写出即有可能影响到程序的性能,这种时候使用缓冲流就能对程序起到优化的作用。有兴趣的同学可以尝试用或者不用缓冲流的读写,小的文件是没有什么差别的,如果是大的文件就会体现出差异。在看到我最开始给出的示例:

    private BufferedReader br;
    private BufferedWriter bw;
    private List sts;


public ServerThread(Socket accept, List sts) {
		// 将当前与服务端连接的所有的通信线程传进来
		this.sts = sts;
		try {
			InputStream inputStream = accept.getInputStream();
			OutputStream outputStream = accept.getOutputStream();

			// 包装成缓冲流
			br = new BufferedReader(new InputStreamReader(inputStream));
			bw = new BufferedWriter(new OutputStreamWriter(outputStream));

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}


很明显,使用缓冲流对输入输出流进行了包装。





你可能感兴趣的:(java学习)