字节流与字符流的区别

1. 输入流

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


该类中所有方法遇到错误时都会引发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类的具体层次结构如下所示。

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

2. 输出流

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

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类的层次结构如下图所示


下面给出两个实例看一下

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

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);

}

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值