字节流与字符流的区别

怼烎@ 2023-01-11 13:02 252阅读 0赞
  1. 输入流

InputStream类是字节输入流的抽象类,是所有字节输入流的父类。InputStream类的具体层次结构如下图所示。

![Image 1][]

该类中所有方法遇到错误时都会引发IOException异常。下面是该类中一些常用方法的简要说明。

read()方法:从输入流中读取数据的下一个字节。返回0到255范围内的int字节值。如果因为已经到达流末尾而没有可用的字节,则返回值-1。

read(byte[] b):从输入流中读入一定长度的字节,并以整数的形式返回字节数。

mark(int readlimit)方法:在输入流的当前位置放置一个标记,readlimit 参数告知此输入流在标记位置失效之前允许读取的字节数。

reset()方法:将输入指针返回到当前所做的标记处。

skip(long n)方法:跳过输入流上的n个字节并返回实际跳过的字节数。

markSupported()方法:如果当前流支持mark()/reset()操作就返回true.

close方法:关闭此输入流并释放与该流关联的所有系统资源。

并不是所有的InputStream类的子类都支持InputStream中定义的所有方法。例如skip()、mark()和reset()等方法,这些方法就只对某些子类有用。

由于Java中的字符是Unicode编码,是双字节的,而InputStream是用来处理字节的,在处理字符文本时不是很方便。为此Java为字符文本的输入提供了一套专门的Reader类。

但Reader类并不是InputStream类的替换者,只是在处理字符串时简化了编程。Java中的字符流是用于对文本文件进行读写操作的流,不能对图片、声音等二进制文件进行读写操作。Java中的字节流则可以对图片、声音等二进制文件进行读写操作;因为Java中的字符使用的是Unicode编码,是双字节的,而字节流是用来处理字节的,因此对文本文件的操作不是挺好。Reader类是字符输入流的抽象类,所有字符输入流的实现都是它的子类,Reader类的具体层次结构如下所示。

![Image 1][]

Reader类中的方法与InputStream类中的方法类似,在需要时可查看JDK的API文档。

  1. 输出流

OutputStream类是字节输出流的抽象类,是表示输出字节流的所有类的超类。OutputStream类的具体层次如下图所示

![Image 1][]

OutputStream类中的所有方法均返回void,在遇到错误时会引发IOException异常。下面是对OutputStream类中常用方法的简单介绍。

write(int b)方法:将指定的字节写入此输出流。

write(byte[] b)方法:将b.length个字节从指定的byte数组写入此输出流。

write(byte[] b , int off , int len)方法:将指定byte数组中从偏移量off开始的len个字节写入此输出流。

flush()方法:彻底完成输出并清空缓存区。

close()方法:关闭输出流。

Writer类是字符输出流的抽象类,所有字符输出流类的实现都是它的子类,Writer类的层次结构如下图所示

![Image 1][]

下面给出两个实例看一下

使用字符流对文件进行读写操作:

public class ReaderAndWriterDemo {

public static void main(String[] args) throws Exception {

String value = “中国人”;

// 向文件中写入内容

PrintWriter pw = new PrintWriter(“temp.txt”, “UTF-8”);

pw.write(value);

pw.close();

// 从文件中读取内容

BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(“temp.txt”), “UTF-8”));

String myStr = br.readLine();

br.close();

System.out.println(myStr);

}

}

使用字节流对文件进行读写操作:

public class ByteStreamDemo {

public static void main(String[] args) throws Exception {

String value = “中国人”;

// 向文件中写入内容

FileOutputStream fos = new FileOutputStream(“temp.txt”);

fos.write(value.getBytes(“UTF-8”));

fos.close();

// 从文件中读取内容

FileInputStream fis = new FileInputStream(“temp.txt”);

byte[] buf = new byte[1024];

int len = fis.read(buf);

String myStr = new String(buf, 0, len, “UTF-8”);

System.out.println(myStr);

}

}

[Image 1]:

发表评论

表情:
评论列表 (有 0 条评论,252人围观)

还没有评论,来说两句吧...

相关阅读

    相关 java 节流字符区别

    字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢? 实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在

    相关 java 节流字符区别

    字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢? 实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在

    相关 Java 节流字符区别

    字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢? 实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在