Java
里的流有两大类:字节流 和 字符流。
Java
的字节流:InputStream
是所有字节输入流的祖先,而OutputStream
是所有字节输出流的祖先。Java
的字符流:Reader
是所有读取字符串输入流的祖先,而writer
是所有输出字符串的祖先。
InputStream
,OutputStream
,Reader
,writer
都是抽象类。所以不能直接new
。那它们之间有没有配合使用的时候?或者说它们的具体使用场景是怎样的?
我们这里一个Java
爬虫为例子来分析一下。
URL url = new URL(address); InputStream in = url.openStream(); InputStreamReader isr = new InputStreamReader(in); BufferedReader br = new BufferedReader(isr); String line; StringBuffer sb = new StringBuffer(); while ((line = br.readLine()) != null) { sb.append(line, 0, line.length()); sb.append('\n'); }
我们在用Java
做爬虫的时候经常会使用URL
类,当使用url
类的openStream()
方法时,会返回一个InputStream
类型的对象,但是我们在使用IO
流是往往使用缓冲流因为它具有更强的读写能力,同时能够节约资源和时间。但是BufferedReader
和BufferedWriter
二者的源和目的地必须是字符输入流和字符输出流。所以我们这时候就必须将字节流转换为字符流。所以我们在工程中往往同时使用字节流,字符流以及缓冲流,我们在学习和记忆是也应该把他们结合起来,这时候只要有一个简单的例子就能很好的理解和记忆以及使用它们。
字节流和字符流区别:
- 数据单位:字节流以8位字节为单位进行操作,而字符流以16位Unicode字符为单位进行操作。这意味着字节流可以用于任何类型的对象(包括文本和二进制数据),而字符流主要用于处理字符数据。
- 处理方式:字节流在处理输入和输出时,直接与底层操作系统交互,数据不经过任何处理直接读写。而字符流在处理输入和输出时,会对数据进行缓冲,即数据会被存储在内部缓冲区中,当缓冲区满时才会进行物理磁盘操作。
- 编码处理:字节流在读取或写入数据时,不会处理任何字符编码(如UTF-8,GBK等),它们只是简单地读取或写入二进制数据。而字符流在读取或写入数据时,会自动处理字符编码和解码。
- 使用场景:由于字节流可以处理任何类型的数据,所以它常常用于处理二进制数据,如图片,音频,视频等。而字符流由于可以自动处理字符编码,所以它更适合处理文本数据。
字节流和字符流各有优势,选择使用哪种流取决于你的具体需求。如果你需要处理二进制数据,或者需要直接处理字节,那么字节流可能是更好的选择。如果你正在处理字符数据,并且希望自动处理字符编码和解码,那么字符流可能是更好的选择。