字节流和字符流

记录一个老是犯糊涂的问题,关于字节流和字符流的认识,以及在Java和Python中二者如何转换。

字节流和字符流的区别

  • 在Java基础的学习中,有专门的一部分来讲解流。最直观的一直区分就是字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的;而字符流在操作时使用了缓冲区,通过缓冲区再操作文件
  • 在Python2时代处理编码问题十分让人头痛,Python 3最重要的新特性大概要算是对文本和二进制数据作了更为清晰的区分。文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示。Python 3不会以任意隐式的方式混用str和bytes,正是这使得两者的区分特别清晰。不能拼接字符串和字节包,也无法在字节包里搜索字符串(反之亦然),也不能将字符串传入参数为字节包的函数(反之亦然)。

Java中的流分类和转换

  1. Java的字节流
    InputStream是所有字节输入流的祖先,而OutputStream是所有字节输出流的祖先。

主要用在处理二进制数据,它是按字节来处理的,但实际中很多的数据是文本,又提出了字符流的概念,它是按虚拟机的Encode来处理,也就是要进行字符集的转化。这两个之间通过 InputStreamReader,OutputStreamWriter来关联,实际上是通过byte[]和String来关联。在实际开发中出现的汉字问题实际上都是在字符流和字节流之间转化不统一而造成的。

在从字节流转化为字符流时,实际上就是byte[]转化为String

public String(byte bytes[], String charsetName)

  1. Java的字符流
    Reader是所有读取字符串输入流的祖先,而writer是所有输出字符串的祖先。

在字符流转化为字节流时,实际上是String转化为byte[]

byte[] String.getBytes(String charsetName)

  1. java.io中还出现了许多其他的流,主要是为了提高性能和使用方便,如BufferedInputStream,PipedInputStream等

Python中的转换

因为文本总是Unicode,所以创建时不需要指定,而字节型则要指定编码方式

siteurl= 'www.xumingguo.cn' # 直接生产字符串
bytes("python", 'ascii') # 字符串,编码
# 或者用r''方式
byt = b'bytes'

将字符串转换成bytes[]时用字符串的encode方法或bytes函数

siteurl_bytes_utf8 = siteurl.encode(encoding="utf-8")
byt = bytes("siteurl_bytes_utf8 ", 'ascii') # 字符串,编码

再解码成字符串时用decode方法,可默认不填解码方式

bytes_utf8_str = siteurl_bytes_utf8.decode()
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值