*/

.hljs {
display: block;
overflow-x: auto;
padding: 0.5em;
color: #333;
background: #f8f8f8;
}

.hljs-comment,
.hljs-template_comment,
.diff .hljs-header,
.hljs-javadoc {
color: #998;
font-style: italic;
}

.hljs-keyword,
.css .rule .hljs-keyword,
.hljs-winutils,
.javascript .hljs-title,
.nginx .hljs-title,
.hljs-subst,
.hljs-request,
.hljs-status {
color: #333;
font-weight: bold;
}

.hljs-number,
.hljs-hexcolor,
.ruby .hljs-constant {
color: #099;
}

.hljs-string,
.hljs-tag .hljs-value,
.hljs-phpdoc,
.tex .hljs-formula {
color: #d14;
}

.hljs-title,
.hljs-id,
.coffeescript .hljs-params,
.scss .hljs-preprocessor {
color: #900;
font-weight: bold;
}

.javascript .hljs-title,
.lisp .hljs-title,
.clojure .hljs-title,
.hljs-subst {
font-weight: normal;
}

.hljs-class .hljs-title,
.haskell .hljs-type,
.vhdl .hljs-literal,
.tex .hljs-command {
color: #458;
font-weight: bold;
}

.hljs-tag,
.hljs-tag .hljs-title,
.hljs-rules .hljs-property,
.django .hljs-tag .hljs-keyword {
color: #000080;
font-weight: normal;
}

.hljs-attribute,
.hljs-variable,
.lisp .hljs-body {
color: #008080;
}

.hljs-regexp {
color: #009926;
}

.hljs-symbol,
.ruby .hljs-symbol .hljs-string,
.lisp .hljs-keyword,
.tex .hljs-special,
.hljs-prompt {
color: #990073;
}

.hljs-built_in,
.lisp .hljs-title,
.clojure .hljs-built_in {
color: #0086b3;
}

.hljs-preprocessor,
.hljs-pragma,
.hljs-pi,
.hljs-doctype,
.hljs-shebang,
.hljs-cdata {
color: #999;
font-weight: bold;
}

.hljs-deletion {
background: #fdd;
}

.hljs-addition {
background: #dfd;
}

.diff .hljs-change {
background: #0086b3;
}

.hljs-chunk {
color: #aaa;
}

#container {
padding: 15px;
}
pre {
border: 1px solid #ccc;
border-radius: 4px;
display: block;
background-color: #f8f8f8;
}
pre code {
white-space: pre-wrap;
}
.hljs,
code {
font-family: Monaco, Menlo, Consolas, 'Courier New', monospace;
}
:not(pre) > code {
padding: 2px 4px;
font-size: 90%;
color: #c7254e;
background-color: #f9f2f4;
white-space: nowrap;
border-radius: 4px;
}
-->

字节流、字符流涉及的类比较多,比较容易混淆。因此,有必要针对何时使用字节流、何时使用字符流、何时使用Buffer类的流做一个归纳。要归纳它们,无需过多的语言,只需抓住它们的重点和特性即可。

在决定何时使用何种类时,以下几个问题需要考虑清楚。

  1. 是否有数据源、数据的流向是否有目标。

    • 数据源:表示输入,或称为读。可提供使用的两个父类为InputStream和Reader。
    • 有目标:表示输出,或称为写。可提供使用的两个父类为OutputStream和Writer。
  2. 应该使用字节流还是字符流?如果源或目标包含非ascii字符,则采用字符流。
  3. 源和目标是何种设备类型。
    • 源 :磁盘文件File,内存(字节/字符数组),键盘System.in,网络socket
    • 目标:磁盘文件File,内存(字节/字符数组),屏幕System.out,网络socket
  4. 是否需要使用额外的特殊功能,包括操作行,字符集转换,使用缓冲区提高效率,串联多个字节输入流,保证数据类型不变,保证数据字面意义等等。最后还需要考虑字节流转换为字符流的问题。

最后,需要知道的是对于使用BufferedReader的输入流,有时候可以考虑使用字符数组可能效果和性能更好。

以下是一个应用以上规律的需求示例:读取包含gbk简体中文的文件数据,并以utf-8编码复制到另一个文件中。

//1.有源有目标,且都是文件。

//2.读取和写入都包含中文字符,所以采用字符流。

//3.写入过程中需要转码,因此需要使用OutputStreamWriter。

//4.可以使用缓冲区功能提高效率。

  1. import java.io.*;
  2. public class CP {
  3. public static void main(String[] args) throws IOException {
  4. File src = new File("d:/myjava/a.txt");
  5. File dest = new File("d:/myjava/a_bak.txt");
  6. cp(src,dest);
  7. }
  8. public static void cp(File src,File dest) throws IOException {
  9. BufferedReader bufr = new BufferedReader(new FileReader(src));
  10. BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(dest),"utf-8"));
  11. //按行读取
  12. String line = null;
  13. while((line=bufr.readLine())!=null) {
  14. bufw.write(line);
  15. bufw.newLine();
  16. bufw.flush();
  17. }
  18. bufw.close();
  19. }
  20. }

上述代码执行后,目标文件中的末尾将比源文件多一个空行,上述方法对这个问题不是很好解决。但如果使用字符数组来替代BufferedReader,则没有这样的问题,如下。

  1. import java.io.*;
  2. public class CP {
  3. public static void main(String[] args) throws IOException {
  4. File src = new File("d:/myjava/a.txt");
  5. File dest = new File("d:/myjava/a_bak.txt");
  6. cp(src,dest);
  7. }
  8. public static void cp(File src,File dest) throws IOException {
  9. FileReader fr = new FileReader(src);
  10. BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(dest),"utf-8"));
  11. char[] buf = new char[1024];
  12. int len = 0;
  13. while ((len=fr.read(buf))!=-1) {
  14. bufw.write(buf,0,len);
  15. bufw.flush();
  16. }
  17. bufw.close();
  18. }
  19. }

注:若您觉得这篇文章还不错请点击右下角推荐,您的支持能激发作者更大的写作热情,非常感谢!

java IO(五):字节流、字符流的选择规律的更多相关文章

  1. java IO(三):字符流

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  2. IO 复习字节流字符流拷贝文件

    /* 本地文件 URL 文件拷贝 *//*文本文件拷贝 可以通过 字符流,也可以通过字节流*/ /*二进制文件拷贝 只可以通过字节流*//* 希望这个例子能帮助搞懂 字符流与字节流的区别 */ imp ...

  3. IO—》字节流&字符流

    字节流 一.字节输出流OutputStream OutputStream此抽象类,是表示输出字节流的所有类的超类.操作的数据都是字节,定义了输出字节流的基本共性功能方法. FileOutputStre ...

  4. Java——IO类,字符流写数据

    body, table{font-family: 微软雅黑} table{border-collapse: collapse; border: solid gray; border-width: 2p ...

  5. Java——IO类,字符流读数据

    body, table{font-family: 微软雅黑} table{border-collapse: collapse; border: solid gray; border-width: 2p ...

  6. IO流(字节流,字符流,缓冲流)

    一:IO流的分类(组织架构) 根据处理数据类型的不同分为:字节流和字符流 根据数据流向不同分为:输入流和输出流   这么庞大的体系里面,常用的就那么几个,我们把它们抽取出来,如下图:   二:字符字节 ...

  7. 缓冲字符流 java.io.BufferedWriter ,java.io.BufferedReader,缓冲字符输出流:PrintWriter

    package seday07; import java.io.IOException;import java.io.PrintWriter; /*** @author xingsir * 缓冲字符流 ...

  8. -1-4 java io java流 常用流 分类 File类 文件 字节流 字符流 缓冲流 内存操作流 合并序列流

      File类 •文件和目录路径名的抽象表示形式 构造方法 •public File(String pathname) •public File(String parent,Stringchild) ...

  9. io系列之字符流

    java中io流系统庞大,知识点众多,作为小白通过五天的视频书籍学习后,总结了io系列的随笔,以便将来复习查看. 本篇为此系列随笔的第一篇:io系列之字符流. IO流 :对数据的传输流向进行操作,ja ...

随机推荐

  1. 浅谈我的MongoDB学习(二)

    上一篇简单讲了mongodb的安装,mongo的windows服务安装,这样服务器重启windows服务会自动重启mongodb的server,然后我们就可以用客户端去管理数据了.mongodb客户端 ...

  2. git 删除分支操作

    删除分支时自己不能够在要删除的分支上 删除本地的某个分支 git branch -d branchname # 交互式删除分支 git branch -D branchname # 强制删除分支 删除 ...

  3. Jquery_基础(一) 常用方法与选择器

    一.Jquery常用方法: $(function(){ //掌握$() 以及function(){} 结合 $("#a01").click(function(){ alert('h ...

  4. ORM: object relationship mapping

    ORM: object relationship mapping 关于数据库的两条命令: python manage.py makemigrations python manage.py migrat ...

  5. 使用python写一个简单的C段扫

    纠结C段查询N久..刚刚拿骚棒FD去抓御剑的包,发现emmm...申请了必应的Key 然后去拿必应API查.这里疼[心]原本也想去弄的.但是人懒. 然后就没有然后了. 代码: 生成IP段的脚本图1 # ...

  6. 51Nod 1182 完美字符串(字符串处理 贪心 Facebook Hacker Cup选拔)

    1182 完美字符串             题目来源:                         Facebook Hacker Cup选拔         基准时间限制:1 秒 空间限制:1 ...

  7. Gym 100952C&&2015 HIAST Collegiate Programming Contest C. Palindrome Again !!【字符串,模拟】

    C. Palindrome Again !! time limit per test:1 second memory limit per test:64 megabytes input:standar ...

  8. CodeForces628-B.New Skateboard

    B. New Skateboard time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  9. 解决JSONObject.fromObject数字为null时被转换为0

    在使用JSONObject.fromObject的时候会遇到一种情况就是当对象的某一个Double型或Integer型的属性为空的时候,转JSON的时候会变成0.当一个布尔型的属性为空的时候,转JSO ...

  10. js取整并保留两位小数的方法

    js 四舍五入函数 toFixed(),里面的参数 就是保留小数的位数.注意 toFixed()方法只针对数字类型,如果是字符类型需要使用Number()等方法先转换数字类型再使用 document. ...