Java的IO流各个类的使用原则
参考: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流各个类的使用原则的更多相关文章
- Java:IO流其他类(字节数组流、字符数组流、数据流、打印流、Properities、对象流、管道流、随机访问、序列流、字符串读写流)
一.字节数组流: 类 ByteArrayInputStream:在构造函数的时候,需要接受数据源,而且数据源是一个字节数组. 包含一个内部缓冲区,该缓冲区包含从流中读取的字节.内部计数器跟踪 read ...
- Java学习笔记33(IO:打印流,IO流工具类)
打印流: 有两个类:PrintStream PrintWriter类,两个类的方法一样,构造方法不一样 PrintStream构造方法:接收File类型,接收字符串文件名,接收字节输出流(Ou ...
- Java基础-IO流对象之字符类(FileWrite与FileReader)
Java基础-IO流对象之字符类(FileWrite与FileReader) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.常见编码简介 1>ASCII 我们知道计算机是 ...
- Java基础-IO流对象之File类
Java基础-IO流对象之File类 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.IO技术概述 回想之前写过的程序,数据都是在内存中,一旦程序运行结束,这些数据都没有了,等下 ...
- Java常用工具类之IO流工具类
package com.wazn.learn.util; import java.io.Closeable; import java.io.IOException; /** * IO流工具类 * * ...
- java的IO流
java的IO流继承四大抽象类分别是字节流 inputStream outputStream与字符流 read write.怎么理解记忆很重要. 直接连接读写对象的是结点流,例如对文件读取字节类的名字 ...
- Java基础——IO流
今天刚刚看完java的io流操作,把主要的脉络看了一遍,不能保证以后使用时都能得心应手,但是最起码用到时知道有这么一个功能可以实现,下面对学习进行一下简单的总结: IO流主要用于硬板.内存.键盘等处理 ...
- 【Java】IO流简单分辨
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5827509.html Java的IO流体系十分庞大,并且体系层次稍复杂,很容易记混或记错.在此,我把平时经常用 ...
- Java - 文件(IO流)
Java - 文件 (IO) 流的分类: > 文件流:FileInputStream | FileOutputStream | FileReader | FileWriter ...
随机推荐
- Tomcat应用配置
为Tomcat添加管理员 为了更好的管理tomcat服务器,我们通常会给tomcat添加用户管理员,这样就可以登录进入查看发布的项目.以下是实际操作步骤: 在Tomcat的配置目录下找到tomcat- ...
- Verilog MIPS32 CPU(五)-- CP0
Verilog MIPS32 CPU(一)-- PC寄存器 Verilog MIPS32 CPU(二)-- Regfiles Verilog MIPS32 CPU(三)-- ALU Verilog M ...
- IO--磁盘理论
磁盘从圆心由内向外被分成多个磁道,而每个磁道会被划分成多个连续的扇区 扇区是磁盘寻址的最小单位,而实际上分配空间最小的单位是簇(cluster),因此导致文件大小和实际占用空间大小不一样 磁盘读写数据 ...
- Djangorestframework编写post接口
前提:已经有Django环境 一.安装 pip install djangorestframework 二.编写视图 import json from django.shortcuts import ...
- 解决SqlServer 2005 sa帐户不能登录问题
允许 sa 用户远程是很危险的.推荐的做法是在本地新建一个允许远程连接的用户. 1.启用TCP/IP协议. 2.配置监听端口(1433). net -an 检查本地端口是否建立监听,使用 在线IP端口 ...
- TCP中的seq
TCP连接中传送的字节流中的每个字节都按顺序编号,第一个字节的编号由本地随机产生 seq其实就是这个报文段中的第一个字节的数据编号. 例如,一段报文的序号字段值是 200 ,而携带的数据共有100字段 ...
- leetcode 加一
给定一个非负整数组成的非空数组,在该数的基础上加一,返回一个新的数组. 最高位数字存放在数组的首位, 数组中每个元素只存储一个数字. 你可以假设除了整数 0 之外,这个整数不会以零开头. 示例 1: ...
- “全栈2019”Java第六章:注释
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- Servlet实现禁用cookie重写URL获取session
前言 一个女人让他的程序员丈夫去商店买东西:你去附近的商店买些鸡蛋,如果有香蕉的话,买8个回来,这个丈夫买了8个鸡蛋回来,他的妻子大吃一惊:你为什么买了8个鸡蛋?! 程序员丈夫回答:因为他们有香蕉. ...
- AHOI2005航线规划 bzoj1969(LCT缩点)
题目描述 对Samuel星球的探险已经取得了非常巨大的成就,于是科学家们将目光投向了Samuel星球所在的星系——一个巨大的由千百万星球构成的Samuel星系. 星际空间站的Samuel II巨型计算 ...