UTF-8的字节占多少个字节?

常用中文字符用utf-8编码占用3个字节(大约2万多字),超大字符集中要占4个字节.在内存中是2个字节,真正写到硬盘上面的是3个字节。
GBK、GB2312汉字占2个字节,用iso8859-1无法表示汉字,只能转为问号。

字节流 字符流;

IO流主要是用于获取在硬盘、内存、键盘中数据;根据处理的数据的数据类型不同可以分为(1)字节流和字符流;

根据流向的不同可以分为:(2)输入流和输出流

根据作用的不同可以分为:(3)节点流和处理流.

它们都有各自的抽象父类:InputStream 和OutputStream;

字符流家族:

InputStream家族

|- FileInputStream

|-FilterInputStream

|-BufferInputStream

|-DatainputStream

|-ByteArrayInputStream

|- ObjectInputStream

|- SequenceInputSteam

|-pipeInputStream

|-StringInputStream

OutPutStream家族

|-FileOutStream

|-FilterOutStream

|-BufferedOutputStream

|-DatainputStream

|-PrintStream

|-ByteArrayOutputStream

|-ObjectOutPutSteam

|-SequenceOutputStream

|-PipeoutputStream

|-StringOutPutStream

上面的族谱可以清楚的看到,InputSteam 是所有输入字节流的抽象父类,OutputStream是所有输出字符流的抽象父类;

ByteArrayInputSteram ,StringBufferInputSteram, FileInputSteram是三种基本的介质流,他们是分别从Byte,String ,File中读取数据.pipedinputStream是在其他线程的共用管道读取数据.

那么同理的,ByteArrayOutputStream、StringBufferOutputSteramFileOutputStream 是两种基本的介质流,它们分别向Byte 数组、和File中写入数据。PipedOutputStream 是向与其它线程共用的管道中写入数据。

字符流家族

字符流以长度为16的char为单位,一般会用来读取文件.

Reader家族

|-InputStreamReader

|-FileReader

|-ObjectReader

|-CharArrayReader

|-BufferdReader

|-SequenceReader

|-PipedReader

|StringReader

Writer家族

|-OutputStream

|-FileWriter

|-CharArrayWriter

|-ObjectWriter

|-BufferedWriter

|-SequenceWriter

|-PipedWriter

|-PrintWirter

|-StringWriter

Reader是所有输入字符流抽象父类,Writer是所有输出字符流的抽象父类;

CharReader、StringReader 是两种基本的介质流,它们分别将Char 数组、String中读取数据。PipedReader 是从与其它线程共用的管道中读取数据。

InputStreamReader是一个连接字节流和字符流的桥梁,它会将字符流转变成字符流.。同理地;CharArrayWriter、StringWriter 是两种基本的介质流,它们分别向Char 数组、String 中写入数据。PipedWriter 是向与其它线程共用的管道中写入数据。

字节流和字符流区别:

(1)      读取方式不一样,字节流是读一个字节返回一个字节;字符流是读1到N个字节返回1到N个字节;

(2)     两者能够处理的数据类型不一样,字节流可以处理所有的类型的数据,MP3,MP4等等,但是字符流只能够处理字符数据。

当需要读取文本文件时会优先考虑使用字符流,其他情况就要使用字节流。

字节流和字符流的转换:

字节流和字符流的转换达到什么效果,转换顾名思义就是字符流和字节流的相互转换以及编码.

当需要字节和字符相互转换或者流的操作需要编码的时候,就需要用到转换流;

例如

InputStreamReader :把字节流转换成字符流;

OutputStreamWriter : 把字符流转转换成字节流.

	InputStreamReader isr = new InputStreamReader(new FileInputStream("e:/test.txt"),"UTF-8");

	OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("e:/test.txt"),"UTF-8");

处理流和节点流

处理流是对一个流的连接和封装,实现数据的读写操作。

读取文件的内容,字符流的输出

/**
* 字符流的写出
*/
try(
BufferedOutputStream os=new BufferedOutputStream(new FileOutputStream(new File("test.txt")))){
os.write("saysomething".getBytes());
}
catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

字节流的读取:

	public void fileread(){
/**
* 字节流的读取
*/ try(BufferedInputStream is=new BufferedInputStream(new FileInputStream(new File("text.txt")))){
byte[] buffer=new byte[1024];
int len; ByteArrayOutputStream bao=new ByteArrayOutputStream();
while((len=is.read(buffer))!=-1){
bao.write(buffer,0,len);
}
byte[] data=bao.toByteArray();
System.out.println(new String(data));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

以上是先把读取到的内容先存放在一个ByteArrayOutputStream中,当读取完文件的内容之后,在一次性的读取ByteArrayOutputStream中的内容,这种做法可以避免因为byte[]的大小是奇数时可能导致存放中文出现乱码的情况.

对于BufferedOutputStream

BufferedOutputStream的数据成员is也是一个位数组,默认为512字节。

当使用write()方法写入数据时实际上会先将数据写到is中,当is已满时才会实现给定的OutputStream对象的write()方法,将is数据写到目的地,而不是每次都对目的地作写入的动作。

 

BufferedWriter和PrintWriter的区别

.printWriter的print和println可以接受任意类型的参数,会自动添加换行,

bufferedwriter的writer方法只能接受字符、字符数组和字符串,对于换行就要显性的调用newLine方法了。

比如:

OutputSteam能够直接的传给PrintWriter接受;

PrintWriter pw=new PrintWriter(new BufferedoutputStreatmen(new FileOutPutStream(“abc.txt”)))

;PrintWriter pw=new PrintWriter(new BufferedWriter(new BufferedOutPutStreamWriter(xxxxx)))

(1)Printwriter相对于用户友好,出现异常也不会抛异常,需要通过checkError来获取到一场;在构造方法这块相对强,传入指定的参数可以做到自动刷新缓存,并且能够使用不同平台的换行符。

它的缺点就是它是无追加模式的,如果文件本身就有内容,那么它要写入文件的话就是要清掉文件的内容再写入。

(2)BufferedWriter就可以实现自定义缓存的大小之余,也可以实现文件内容的追加。当设置append为true的时候它就会在文件的尾部进行追加内容。Append为false则会从第一行开始覆盖(重点!!)写入。

(3)BufferedWriter和BufferOutputStream的默认buffer大小不一样 ,前者是8k chars,后者是8k bytes。

Stream和writer的区别:一个是二进制数,一个是字符数据。

 

javaIO流小结(1)的更多相关文章

  1. Java基础 Java-IO流 深入浅出

    建议阅读 重要性由高到低 Java基础-3 吃透Java IO:字节流.字符流.缓冲流 廖雪峰Java IO Java-IO流 JAVA设计模式初探之装饰者模式 为什么我觉得 Java 的 IO 很复 ...

  2. Java学习日记之 Java-IO流

    Java中的IO流在处理上分为字节流和字符流.字节流和字符流的区别 : 1.字节流读取的时候,读到一个字节就返回一个字节:  字符流使用了字节流读到一个或多个字节(中文对应的字节数是两个,在UTF-8 ...

  3. javaIO流实现读写txt文件

    javaIO流实现文件读写 文件写入: InputStreamReader BufferedReader 文件读取: FileOutputStream package javatest.basic22 ...

  4. JavaIO流中的拷贝

    JavaIO流中对数据的操作尤为重要,掌握了基本的拷贝操作,才能将各种数据源的操作联系起来. 先来看看对文件夹的拷贝吧: /** * 利用递归实现文件夹的拷贝操作 * 分析:判断 * 是文件:调用拷贝 ...

  5. java IO 流小结

    java IO 流小结 java流类图结构 流的分类 按方向 输入流 输出流 按类型 字节流 字符流 结论:只要是处理纯文本数据,就优先考虑使用字符流. 除此之外都使用字节流.

  6. JavaIO 流(1)IO流介绍

    IO流定义: 流的本质是一组单向有序,分起始和终止的数据传输过程.需要导入import java.io.* IO流分类: 按数据类型分为:字节流和字符流 字节流: 按字节进行读取(可以处理任意类型数据 ...

  7. 完美解决JavaIO流报错 java.io.FileNotFoundException: F:\ (系统找不到指定的路径。)

    完美解决JavaIO流报错 java.io.FileNotFoundException: F:\ (系统找不到指定的路径.) 错误原因 读出文件的路径需要有被拷贝的文件名,否则无法解析地址 源代码(用 ...

  8. JavaIO流(输入输出操作)

    Java中执行输出和输入操作,需要通过IO流.例如最常见的System.out.println()就是一个输出流.IO流的类比较多,但核心体系就是由File. InputStream .OutputS ...

  9. javaIO -- 流的体系设计思路、基础分类

    一.流 1. 流的含义 在程序设计中,流是对于数据流动传输的一种抽象描述任何有能力产出数据的数据源,或者有能力接受数据的接收端对象都是一个流. 2. 流的源和目的 数据可能从本地文件读取,或者写入,  ...

随机推荐

  1. sublime text 2 笔记

    sublime text 2 ,是代码程序员最佳编辑器,不是之一.其快捷优雅的操作风格,和便利的快捷键,是程序员码农的不二选择. 网上下载sublime text 2,支持文件拖放,文件夹拖放.3.0 ...

  2. Xcode升后插件失效

    Xcode升后插件失效,与添加插件不小心点击Skip Bundle解决办法 字数267 阅读4731 评论1 喜欢12 今天升级了xcode到6.4 发现之前装的插件不能使用了.这里有一个解决的方案: ...

  3. Core Data 教学

    看了一篇国外的文章,关于iOS9的Core Data教学,在这里做了一下总结 Core Data 教学 示例开源地址:LastDayCoreData 在这篇文章中我们将学习Core Data的系列教程 ...

  4. 【BZOJ1012】【树状数组求区间最值】最大数maxnumber

    Description 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度. 2. ...

  5. websocket以及自定义协议编程一些总结

    以下仅供自己翻阅,因为时间久了会忘2.发送缓冲区主要是为了处理发送前一些小内容,可以自己控制flush,或者write的不是那么频繁因为没必要.至于大内容就没必要了.3.其实tcp以上的通信协议也好, ...

  6. 基于jQuery 的图片瀑布流实现

    解题思路: 第1步  分析问题:我这边的处理方式是以列为单位.每次滚动条滚到底部,把需要加的新的内容放在高度最小的列.如下图所示 加载后的显示 如果在继续往下滚动.新图片就会在1下边显示,如此类推. ...

  7. 定时器内部的this

    今天写了个例子遇见的: timer1=setTimeout(function(){ $(this).next().css("display","none") } ...

  8. centos postfix 邮箱安装记录

    ---恢复内容开始--- #wget http://nchc.dl.sourceforge.net/project/postfixadmin/postfixadmin/postfixadmin-2.9 ...

  9. truncate 命令删除恢复

    truncate命令可以一次性删除当前表中所有记录并且不留任何日志,同时这个表的ID就自动初化从1开始,今天我就来给大家尝试一个利用truncate清除记录之后恢复过程. 实际线上的场景比较复杂,当时 ...

  10. css实现三角的一些方法

    css实现三角没有想象中的那么难,只要明白border的各种属性的意思就很好明白css三角是如何实现的. 一下是几个很简单的例子:   css三角形状的制作:     css样式:    .trian ...