参考:http://blog.csdn.net/ilibaba/article/details/3955799

Java IO 的一般使用原则(花多眼乱,其实每个类都有专门的作用):

这里有详细介绍:Java的IO输入输出流类的介绍(有图)

一、按数据来源(去向,也就是颗粒)分类:

1 、文件:

FileInputStream, FileOutputStream, (字节流)

FileReader, FileWriter(字符流)

2 、字节数组 byte[]:

ByteArrayInputStream, ByteArrayOutputStream( 字节流 )

3 、字符数组 Char[]:

CharArrayReader, CharArrayWriter( 字符流 )

4、字符串String:

StringBufferInputStream,StringBufferOuputStream(字节流)
         StringReader, StringWriter( 字符流 )

5 、网络数据流:

InputStream, OutputStream,( 字节流 )
        Reader, Writer( 字符流 )

二、按是否格式化输出分:

1 、要格式化输出:

PrintStream(只能字节流), PrintWriter(字节流和字符流)

三、按是否要缓冲分:(一般推荐使用,可以提高效率)

1 、要缓冲:

BufferedInputStream, BufferedOutputStream,( 字节流 )
                 BufferedReader, BufferedWriter( 字符流 )

四、按数据格式分:(最根本的,除了文本文件使用字符流,其他一律字节流优先)

1 、二进制格式(只要不能确定是纯文本的) :

InputStream, OutputStream 及其所有带 Stream 结束的子类

2 、纯文本格式(含纯英文与汉字或其他编码方式):

Reader, Writer 及其所有带 Reader, Writer 的子类

五、特殊需要:

1 、从 Stream 到 Reader,Writer 的转换类:

InputStreamReader, OutputStreamWriter

2 、对象输入输出:

ObjectInputStream, ObjectOutputStream

3 、进程间通信:

PipeInputStream, PipeOutputStream,(字节流)

PipeReader, PipeWriter(字符流)

4 、合并输入:

SequenceInputStream

5 、更特殊的需要:

PushbackInputStream, PushbackReader, LineNumberInputStream, LineNumberReader

******************使用原则的步骤*************************************
决定使用哪个类以及它的构造方法的一般准则如下(不考虑特殊需要):

第一,考虑最原始的数据格式是什么:

原则四(是二进制文件还是纯文本,直接决定使用字节流还是字符流)

第二,是否需要转换流:

原则六第 1 点(字节转字符,字符转字节)

第三,数据来源(去向)是什么:

原则一(颗粒:基本单位,是文件,字节数组/字符数组,String,Object)

第四,是否要缓冲:

原则三 (特别注明:一定要注意的是 readLine() 是否有定义,有什么比 read, write 更特殊的输入或输出方法,通常多建议使用,可以提高效率

普通的InputStream/OutputStream或者Reader/Writer都没有定义readLine()方法,也就是不能直接在控制台输出字符串,

而Buffered缓冲流中有定义readLine(),不过不能自动换行,需要newLine()手动生成;而PrintStream和PrintWriter有println()方法)

第五,是否要格式化输出:(其实就是是否直接输出)

原则二(PrintStream,PrintWriter)

**********************几个例子**********************************

Java复制文件的简单代码:

1.使用字节流(所有都可以出来)

 package iotest;

 import java.io.*;
import java.util.*;
/**
* Java复制文件的简单例子
* */
public class CopyWithoutBuffer {
public static void main(String[] args){
long start = System.currentTimeMillis();
System.out.println("begin copy....");
try {
FileInputStream fis = new FileInputStream("E:\\12.mp4");
FileOutputStream fos = new FileOutputStream("E:\\123.mp4");
//这里使用了缓冲流,使用可以提高效率
BufferedInputStream bis = new BufferedInputStream(fis);
BufferedOutputStream bos = new BufferedOutputStream(fos);
try {
byte[] buf = new byte[1024];
////使用buffer
int read = bis.read(buf);
while(read!=-1){
bos.write(buf,0,read);//因为buf读到最后可能不满,所以要以read为准
read = bis.read(buf);
} // //不使用buff,并不使用byte数组,效率低很多,耗时大
// int read = bis.read();//一次读取一个字节
// while(read!=-1){
// bos.write(read);
// read = bis.read();
// }
bos.close();
fos.close();
bis.close();
fis.close();
} catch (IOException e) {
e.printStackTrace();
} } catch (FileNotFoundException e) {
e.printStackTrace();
} long end = System.currentTimeMillis();
System.out.println("Copy Complete,use times:"+(end-start)+" ms");
} }

2.使用字符流(只能处理纯文本文件(处理起来比字节流快),视频音频会有问题):

 package iotest;

 import java.io.*;

 public class IOReaderTest {
public static void main(String[] args) {
System.out.println("开始");
long start = System.currentTimeMillis();
try {
FileReader fr = new FileReader("e:\\123.txt");
FileWriter fw = new FileWriter("e:\\123456.txt");
/*
BufferedReader br = new BufferedReader(fr);
String abc = br.readLine();//BufferedReader才定义了readLine()方法
//如果要换行,需要br.newLine()手动生成
System.out.println(abc);
*/
int read = fr.read();
while(read!=-1){
fw.write(read);
read = fr.read();
}
fw.close();
fr.close();
long end = System.currentTimeMillis();
System.out.println("耗时:"+(end-start)+" ms");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} } }

Java的IO流各个类的使用原则的更多相关文章

  1. Java:IO流其他类(字节数组流、字符数组流、数据流、打印流、Properities、对象流、管道流、随机访问、序列流、字符串读写流)

    一.字节数组流: 类 ByteArrayInputStream:在构造函数的时候,需要接受数据源,而且数据源是一个字节数组. 包含一个内部缓冲区,该缓冲区包含从流中读取的字节.内部计数器跟踪 read ...

  2. Java学习笔记33(IO:打印流,IO流工具类)

    打印流: 有两个类:PrintStream     PrintWriter类,两个类的方法一样,构造方法不一样 PrintStream构造方法:接收File类型,接收字符串文件名,接收字节输出流(Ou ...

  3. Java基础-IO流对象之字符类(FileWrite与FileReader)

    Java基础-IO流对象之字符类(FileWrite与FileReader) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.常见编码简介 1>ASCII 我们知道计算机是 ...

  4. Java基础-IO流对象之File类

    Java基础-IO流对象之File类 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.IO技术概述 回想之前写过的程序,数据都是在内存中,一旦程序运行结束,这些数据都没有了,等下 ...

  5. Java常用工具类之IO流工具类

    package com.wazn.learn.util; import java.io.Closeable; import java.io.IOException; /** * IO流工具类 * * ...

  6. java的IO流

    java的IO流继承四大抽象类分别是字节流 inputStream outputStream与字符流 read write.怎么理解记忆很重要. 直接连接读写对象的是结点流,例如对文件读取字节类的名字 ...

  7. Java基础——IO流

    今天刚刚看完java的io流操作,把主要的脉络看了一遍,不能保证以后使用时都能得心应手,但是最起码用到时知道有这么一个功能可以实现,下面对学习进行一下简单的总结: IO流主要用于硬板.内存.键盘等处理 ...

  8. 【Java】IO流简单分辨

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5827509.html Java的IO流体系十分庞大,并且体系层次稍复杂,很容易记混或记错.在此,我把平时经常用 ...

  9. Java - 文件(IO流)

    Java - 文件 (IO)   流的分类:     > 文件流:FileInputStream | FileOutputStream | FileReader | FileWriter     ...

随机推荐

  1. MFC中cstring,string和char[]的相互转化

    int 转 CString:CString.Format("%d",int);...............................string 转 CString CSt ...

  2. 《html5 从入门到精通》读书笔记(二)

    接着上面继续记录笔记,这次要记的知识点比较多...记录下我认为比较重要的东西. 一.表单属性 1.autocomplete属性 该属性规定form或input域应该拥有自动完成功能. <form ...

  3. 爬虫开发python工具包介绍 (2)

    本文来自网易云社区 作者:王涛 可选参数我们一一介绍一下: 参数 释义 示例 params 生成url中?号后面的查询Key=value 示例1: >>>payload = {'ke ...

  4. 2.css的引入方式

    网页中引用CSS样式 内联样式 行内样式表 外部样式表 ..链接式 ..导入式 内嵌方式 style标签 <!doctype html> <html> <head> ...

  5. django重写form表单中的局部钩子函数

    from django import forms from django.core.exceptions import ValidationError from jax import models c ...

  6. 求解任意图的最小支配集(Minimun Dominating Set)

    给定一个无向图G =(V,E),其中V表示图中顶点集合,E表示边的集合.G的最小控制顶点集合为V的一个子集S∈V:假设集合R表示V排除集合S后剩余顶点集合,即R∩S=∅,R∪S=V:则最小控制顶点集合 ...

  7. [转载]Flip an image in UIImageView using UIView transitionWithView

    View animations on the iPhone are wonderful. Used properly they will delight your users and help you ...

  8. Kettle 值映射

    在费用转换里面做了两个值映射.一个是编码.一个是名称.其中两个值映射设置不一样效果不一样. 第一个编码映射 目标字段名不为空,则表示会新增字段.其中复核源值条件的都会转换为目标值,不符合条件的会用[不 ...

  9. Angular material mat-icon 资源参考_Action

    ul,li>ol { margin-bottom: 0 } dt { font-weight: 700 } dd { margin: 0 1.5em 1.5em } img { height: ...

  10. 洛谷 P3227 [HNOI2013]切糕(最小割)

    题解 Dinic求最小割 题目其实就是求最小的代价使得每个纵轴被分成两部分 最小割!!! 我们把每个点抽象成一条边,一个纵轴就是一条\(S-T\)的路径 但是题目要求\(|f(x,y)-f(x',y' ...