java字符流和字节流的区别_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();

}

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/547779.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IEPNGFix:Unclickable children of element 解决办法

以前我有写过一篇关于让IE6支持png半透明图片的方法&#xff0c;这期间这一神器一直发挥了很大的作用&#xff0c;并且没有出现过什么差错&#xff0c;直到昨天。 昨天同事做的一个项目因为设计图的关系&#xff0c;所以实现起来用到了很多position定位的属性&#xff0c;这里…

ASP.NET MVC 重点教程一周年版 第九回 HtmlHelper

许多时候我们会遇到如下场景 在写一个编辑数据的页面时&#xff0c;我们通常会写如下代码 1: <input type"text" value<%ViewData["title"] %> name"title" /> 由前篇我们所讲的Helper演化&#xff0c;我们思考&#xff0c;对于这种…

Tensorflow中查看gpu是否可用

Tensorflow中查看gpu是否可用 使用tf.test.is_gpu_available()函数可直接返回 import tensorflow as tf tf.test.is_gpu_available() Tensorflow测试程序 # Python import tensorflow as tf hello tf.constant(Hello, TensorFlow!) sess tf.Session() print(sess.run(hell…

websphere一直安装部署_WebSphere集群安装配置及部署应用说明

《WebSphere集群安装配置及部署应用说明》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《WebSphere集群安装配置及部署应用说明(27页珍藏版)》请在人人文库网上搜索。1、WebSphere6.1集群安装配置及部署应用说明1 安装Webphere1.1 安装WebSphere ND 6.11、 双击launc…

设置devenv命令的启动版本

机子上装了有vs 05、vs 08、vs 10如果按上顺序安装的话&#xff0c;在 运行 > devenv 就可以打开最新的vs10 工具&#xff0c;如果顺序是乱的话&#xff0c;就没那么幸运了&#xff0c;也就是说你最后安装的版本将会被你的 devenv 命令打开&#xff0c;原因是最后一次安装vs…

Yolov4训练自己的数据集

Yolov4训练自己的数据集 代码运行环境Ubuntu18.04python3.6显卡1080TiCUDA10.0cudnn7.5.1OpenCV3.4.6Cmake3.12.2&#xff0c;详细环境配置安装步骤就不讲解拉&#xff0c;网上教程一大堆。从github克隆下载源码&#xff0c;链接地址&#xff1a;https://github.com/AlexeyAB/…

[TED] Kinect控制的四翼直升机

超级精彩的demo&#xff0c;耐心看下去&#xff0c;越到后来越精彩。转载于:https://www.cnblogs.com/brucejia/archive/2013/06/14/3135206.html

vs 2010 不显示解决方案文件

vs 2010 不显示解决方案文件的问题早就遇到过&#xff0c;而且也能很容易的解决&#xff0c;唯独这次太郁闷了&#xff0c;先说说之前的我办法吧&#xff0c;像往常一样&#xff0c;在工具栏里面找到 >工具>选项>项目和解决方案>常规>勾中“总是显示解决方案”&…

debian 重启mysql_怎么重启MySQL服务,正确重启mysql

mysql> USE mysql; -- 切换到 mysql DBDatabase changedmysql> SELECT User, Password, Host FROM user; -- 查看现有用户,密码及允许连接的主机---------------------------| User | Password | Host |---------------------------| root | | localhost |--------------…

CentOS7 安装ownCloud

ownCloud的安装依赖LAMP环境&#xff0c;即 Linux Apache MySQL(Mariadb) PHP&#xff0c;所以在装owncloud前最好先装好这些&#xff0c;并且保证已经可用。 为了方便&#xff0c;本文在运行shell命令时都是以管理员用户身份运行&#xff08;root权限下运行&#xff09;&a…

Ajax跨子域

主页index.html的主要代码如下&#xff1a; <button οnclick"crossDomain();">开始跨域</button><div id"ajax"></div><iframe src"http://work.2fool.cn/crossdomain/iframe.html" id"iframe" style&quo…

关于阿拉伯数字转化成为大写汉字

public class MoneyUtil { /** 大写数字 */ private static final String[] NUMBERS { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" }; /** 整数部分…

javascript 复制功能 兼容所有浏览器的解决方案

代码如下&#xff1a; // 兼容所有浏览器function copyUrl(url) { if (navigator.userAgent.toLowerCase().indexOf(ie) > -1) { clipboardData.setData(Text, url); alert("该地址已复制到剪切板&#xff01;"); } else { prompt(&qu…

SQL Server 性能优化之——系统化方法提高性能

原文 http://www.cnblogs.com/BoyceYang/archive/2013/06/15/3138142.html 阅读导航 1. 概述 2. 规范逻辑数据库设计 3. 使用高效索引设计 4. 使用高效的查询设计 5. 使用技术分析低性能 6. 总结 1. 概述 在比较大的范围内找出能够大幅提高性能的区域&#xff0c;并且专注于分析…

yum搭建lnmp的最简单方法

相信有些刚刚接触web开发的小伙伴对于服务器上搭建web环境还不太了解&#xff0c;今天手把手教大家搭建lemp的线上环境&#xff0c;您需要做如下一些准备&#xff1a; 阿里云或者其他服务商的云主机一台云主机已安装Centos 7了解ssh、vim 好的&#xff0c;相信大家已经做好准备…

java opencv 平移_Java中使用opencv

Java中使用opencvJava中使用opencv零、前言作为图像处理出身&#xff0c;不仅仅要会C图像处理、matlab图像处理、python图像处理、最起码也得会java图像处理&#xff0c;当然我最终还都用的是opencv这个机器视觉库了。今天简单介绍一下java中如何使用opencv。一、配置库(1)官网…

子域名跨越的问题

子域名不支持ajax直接提交&#xff0c;但支持form表单直接提交。

Linux利用PROMPT_COMMAND实现审计功能

这个系统审计&#xff0c;记录什么用户&#xff0c;在什么时间&#xff0c;做了什么操作。 然后将查到的信息记录到一个文件里。一。 配置1. 在/etc/profile 文件的最后&#xff0c;添加如下2行代码&#xff1a;export HISTORY_FILE/var/log/File_history/date %Y-%m-%d.logexp…

CentOS7 安装 NextCloud

NextCloud 的安装依赖LAMP环境&#xff0c;即 Linux Apache MySQL(Mariadb) PHP&#xff0c;所以在装 NextCloud前最好先装好这些&#xff0c;并且保证已经可用。 为了方便&#xff0c;本文在运行shell命令时都是以管理员用户身份运行&#xff08;root权限下运行&#xff0…

jQuery 插件取url参数[jquery.url.js]的使用以及文件下载

方法一、 如题&#xff0c;直接上调用代码&#xff1a; jQuery.url.param("c") “c”就是当前url中的参数&#xff0c;记得要引用jquery.js和jquery.url.js jquery.url.js 下载 方法二、 function GetQueryString(name) {var reg new RegExp("(^|&)"…