
java中字符流与字撙节的区分:(引荐:java视频教程)
1、字撙节操纵的基础单元为字节;字符流操纵的基础单元为Unicode码元。
2、字撙节默许不运用缓冲区;字符流运用缓冲区。
3、字撙节一般用于处置惩罚二进制数据,实际上它可以处置惩罚恣意范例的数据,但它不支撑直接写入或读取Unicode码元;字符流畅常处置惩罚文本数据,它支撑写入及读取Unicode码元。
字撙节
Java中的字撙节处置惩罚的最基础单元为单个字节,它一般用来处置惩罚二进制数据。Java中最基础的两个字撙节类是InputStream和OutputStream,它们离别代表了组基础的输入字撙节和输出字撙节。
InputStream类与OutputStream类均为笼统类,我们在实际运用中一般运用Java类库中供应的它们的一系列子类。下面我们以InputStream类为例,来引见下Java中的字撙节。
InputStream类中定义了一个基础的用于从字撙节中读取字节的要领read,这个要领的定义以下:
public abstract int read() throws IOException;
这是一个笼统要领,也就是说任何派生自InputStream的输入字撙节类都须要完成这一要领,这一要领的功用是从字撙节中读取一个字节,若到了末端则返回-1,不然返回读入的字节。
关于这个要领我们须要注重的是,它会一向壅塞晓得返回一个读取到的字节或是-1。别的,字撙节在默许情况下是不支撑缓存的,这意味着每挪用一次read要领都邑要求操纵系统来读取一个字节,这往往会伴随着一次磁盘IO,因而效力会比较低。
有的小伙伴大概以为InputStream类中read的以字节数组为参数的重载要领,可以一次读入多个字节而不必频仍的举行磁盘IO。那末终究是否是如许呢?我们来看一下这个要领的源码:
public int read(byte b[]) throws IOException { return read(b, 0, b.length); }
它挪用了另一个版本的read重载要领,那我们就接着往下追:
public int read(byte b[], int off, int len) throws IOException { if (b == null) { throw new NullPointerException(); } else if (off < 0 || len < 0 || len > b.length - off) { throw new IndexOutOfBoundsException(); } else if (len == 0) { return 0; } int c = read(); if (c == -1) { return -1; } b[off] = (byte)c; int i = 1; try { for (; i < len ; i++) { c = read(); if (c == -1) { break; } b[off + i] = (byte)c; } } catch (IOException ee) { } return i; }
从以上的代码我们可以看到,实际上read(byte[])要领内部也是经由历程轮回挪用read()要领来完成“一次”读入一个字节数组的,因而实质来讲这个要领也未运用内存缓冲区。要运用内存缓冲区以进步读取的效力,我们应当运用BufferedInputStream。
字符流
Java中的字符流处置惩罚的最基础的单元是Unicode码元(大小2字节),它一般用来处置惩罚文本数据。所谓Unicode码元,也就是一个Unicode代码单元,局限是0x0000~0xFFFF。在以上局限内的每一个数字都与一个字符相对应,Java中的String范例默许就把字符以Unicode划定规矩编码然后存储在内存中。
然而与存储在内存中差别,存储在磁盘上的数据一般有着林林总总的编码体式格局。运用差别的编码体式格局,雷同的字符会有差别的二进制示意。实际上字符流是如许事情的:
输出字符流:把要写入文件的字符序列(实际上是Unicode码元序列)转为指定编码体式格局下的字节序列,然后再写入到文件中;
输入字符流:把要读取的字节序列按指定编码体式格局解码为响应字符序列(实际上是Unicode码元序列从)从而可以存在内存中。
我们经由历程一个demo来加深对这一历程的明白,示例代码以下:
import java.io.FileWriter; import java.io.IOException; public class FileWriterDemo { public static void main(String[] args) { FileWriter fileWriter = null; try { try { fileWriter = new FileWriter("demo.txt"); fileWriter.write("demo"); } finally { fileWriter.close(); } } catch (IOException e) { e.printStackTrace(); } } }
更多java学问请关注java基础教程栏目。
以上就是java字符流与字撙节的区分是什么的细致内容,更多请关注ki4网别的相干文章!