本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/42119261


我想你对JAVA的IO流有所了解,平时使用的也比較的多,可是对于其详细分类和继承体系可能知道的并不多,可能也非常少去看相关的API文档,找出当中的关系和各自的应用情形。本文简单对经常使用的IO流进行分类整理,并简单举例说明其应用。希望本文对你有所帮助。

(A)IO流大致分为两种:

(1)字节流:相应抽象类为InputStream(输入流)和 OutputStream(输出流)。 

        (2)字符流:相应抽象类为Reader(输入流)和Writer(输出流)。

(B)详细实现例如以下

(1)字节流:(经常使用的)FileInputStream实现了InputStream。

                               (经常使用的)FileOutputStream实现了OutputStream。 

        (2)字符流:(经常使用的)BufferedReader、InputStreamReader、 StringReader实现了Reader。FileReader继承了InputStreamReader。

                               (经常使用的)BufferedWriter、OutputStreamWriter、StringWriter实现了Writer,FileWriter继承了OutputStreamWriter。

(C)实现类详情及使用情况例如以下:



输出流:

(1)OutputStreamWriter是字符流通向字节流的桥梁:使用指定的 charset 将要向其写入的字符编码为字节。它使用的字符集能够由名称指定或显式给定,否则可能接受平台默认的字符集。

每次调用 write() 方法都会针对给定的字符(或字符集)调用编码转换器。在写入基础输出流之前。得到的这些字节会在缓冲区累积。能够指定此缓冲区的大小。只是,默认的缓冲区对多数用途来说已足够大。

为了达到最高效率,可考虑将 OutputStreamWriter
包装到 BufferedWriter 中以避免频繁调用转换器。

比如: 

BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));

(2)FileReader 用来读取字符文件的便捷类,用于读取字符流。

(3)BufferedReader具有缓冲区,从字符输入流中读取文本。缓冲各个字符。从而实现字符、数组和行的高效读取。

(4)StringReader  一个字符串的字符输入流。

(5)FileInputStream 要读取原始字节流。经常使用于读二进制文件,如图片、声音、影像等文件。

输入流:

(1)InputStreamReader是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。每次调用其一个 read() 方法都会导致从基础输入流读取一个或多个字节。要启用从字节到字符的有效转换。能够提前从基础流读取很多其它的字节,使其超过满足当前读取操作所需的字节。为了达到最高效率,可要考虑在 BufferedReader 内包装 InputStreamReader。比如: BufferedReader
in = new BufferedReader(new InputStreamReader(System.in));

(2)FileWriter 用来写入字符文件的便捷类。

(3)BufferedWriter  具有缓冲区,将文本写入字符输出流。缓冲各个字符。从而提供单个字符、数组和字符串的高效写入。

(4)StringWriter  一个字符串的字符输出流。能够用其回收在字符串缓冲区中的输出来构造字符串。

(5)FileOutputStream 写入原始字节流。

经常使用于读二进制文件,如图片、声音、影像等文件。

(D)代码实例分析例如以下:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import org.junit.Test; public class TestStream {
// 读取文件里字符
@Test
public void testRead() throws IOException {
String path = "read.txt";
FileReader read = new FileReader(path);
BufferedReader reader = new BufferedReader(read);
while (reader.readLine() != null) {
String s = reader.readLine();
System.err.println(s);
}
reader.close();
} // 写入字符到文件
@Test
public void testWrite() throws IOException {
String path = "write.txt";
FileWriter write = new FileWriter(path);
BufferedWriter writer = new BufferedWriter(write);
char[] buffer = new char[1024];
for (int i = 0; i < 1024; i++) {
if ((char) 'a' + i > Character.MAX_VALUE) {
buffer[i] = 'z';
System.err.println(1);
} else {
buffer[i] = (char) ('a' + i);
} }
writer.write(buffer);
writer.close();
} // 删除文件内容
@Test
public void testDelete() throws IOException {
String path = "write.txt";
FileWriter write = new FileWriter(path);
BufferedWriter writer = new BufferedWriter(write);
StringBuffer buffer = new StringBuffer();
writer.write(buffer.toString());
writer.close();
} // 替换内容
@Test
public void testDeleteAndReplace() throws IOException {
String path = "write.txt";
FileWriter write = new FileWriter(path);
BufferedWriter writer = new BufferedWriter(write);
int i = 0;
while (++i < 100) {
StringBuffer buffer = new StringBuffer();
buffer.append(Math.random());
writer.write(buffer.toString() + "\r\n");
}
writer.close();
} // 拷贝一个文件内容到还有一个文件
@Test
public void copyFile(String oldPath, String newPath) {
try {
int byteread = 0;
File oldfile = new File(oldPath);
if (oldfile.exists()) { //文件存在时
InputStream inStream = new FileInputStream(oldPath); //读入原文件
FileOutputStream fs = new FileOutputStream(newPath);
byte[] buffer = new byte[100];
while ((byteread = inStream.read(buffer)) != -1) {
fs.write(buffer, 0, byteread);
}
inStream.close();
fs.close();
}
} catch (Exception e) {
e.printStackTrace();
}
} //读取字符流
@Test
public static void testReadByte() {
String path = "write.txt";
File file = new File(path);
InputStream in = null;
try {
// 一次读一个字节
in = new FileInputStream(file);
int tempbyte;
while ((tempbyte = in.read()) != -1) {
System.out.write(tempbyte);
}
in.close();
} catch (IOException e) {
e.printStackTrace();
return;
}
try {
// 一次读多个字节
byte[] tempbytes = new byte[100];
int byteread = 0;
in = new FileInputStream(path);
while ((byteread = in.read(tempbytes)) != -1) {
System.out.write(tempbytes, 0, byteread);
}
} catch (Exception e1) {
e1.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e1) {
}
}
}
}
}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

JAVA在IO流量汇总的更多相关文章

  1. atitit.ajax bp dwr 3.该票据安排使用的流量汇总 VO9o.....

    atitit.ajax bp dwr 3.该票据安排使用的流量汇总 VO9o..... 1. 安装配置 1 1.1. 下载  dwr.jar 1M 1 1.2. 配置注解方式..web.xml 1 2 ...

  2. Hadoop案例(九)流量汇总案例

    流量汇总程序案例 1.自定义输出 统计手机号耗费的总上行流量.下行流量.总流量(序列化) 1)需求: 统计每一个手机号耗费的总上行流量.下行流量.总流量 2)数据准备 phone_date.txt - ...

  3. MapReduce分析流量汇总

    一.MapReduce编程规范 一.MapReduce编程规范 用户编写mr程序主要分为三个部分:Mapper,Reducer,Driver 1.Mapper阶段 (1)用户自定义Mapper类 要继 ...

  4. java的IO流

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

  5. java之io之File类的list()方法过滤目录的使用

    java的io的知识中,File类必须掌握.File类是对文件或者文件夹的封装.它本身并不能对所封装的文件进行读写,它封装的只是文件或文件夹的周边知识,比如 大小啦,创建日期啦,路径啦等等. 如果Fi ...

  6. Java 新IO

       NIO提供全新的底层I/O模型.与最初的java.io包中面向流(stream-oriented)概念不同,NIO采用了面向块的概念(block-oriented).在尽可能的情况下,I/O的操 ...

  7. JAVA中IO总结

    JAVA中IO流主要分为两大类: 字节流:InputStream+OutputStream 字符流:Reader+Writer 字节流: InputStream是所有字节输入流的父类 OutputSt ...

  8. Java基础——IO流

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

  9. 【Java】IO流简单分辨

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

随机推荐

  1. 【HDU】4888 Redraw Beautiful Drawings 网络流【推断解是否唯一】

    传送门:pid=4888">[HDU]4888 Redraw Beautiful Drawings 题目分析: 比赛的时候看出是个网络流,可是没有敲出来.各种反面样例推倒自己(究其原因 ...

  2. Android---App Widget(一)

    本文译自:http://developer.android.com/guide/topics/appwidgets/index.html App Widgets是一些较小的应用程序窗口,它们能够被嵌入 ...

  3. java 解析 json 遍历未知key

    1.—————————————————————————————————————————————————————————————— import net.sf.json.JSONObject; Stri ...

  4. cocos2d-x 2.2.3 创建项目的方法

    直接复制粘贴到txt文本,然后修改后缀为.bat,然后将bat文件放到tools\project-creator的目录下即可. :project_input @echo 请输入项目名称,按回车,例:H ...

  5. Java EE (11) - 影响性能的因素

    垂直层(Tier)影响性能的因素 资源层数据库性能通常考虑以下方面的优化(MySQL为例):--使用哪种存储引擎:MyISAM vs. InnoDB, MERGE, MEMORY, Federated ...

  6. win7问题解决,凭据管理器和无法访问,不允许一个用户使用一个以上用户名与服务器或共享资源进行多重连接。

    WIN7凭据管理器,如果你用一个帐号远程登录以后在电脑中会记住这个信息,假如你想用另外的帐号,那么就到控制面板-凭据管理器里中进行修改或者删除. 如果你登录以后提示,“无法访问.不允许一个用户使用一个 ...

  7. python之字符串的分割和拼接

    关于string的split 和 join 方法 对导入os模块进行os.path.splie()/os.path.join() 貌似是处理机制不一样,但是功能上一样. 1.string.split( ...

  8. cocos2d-x: 33种切换场景

    [1]:CCTransitionCrossFade::create(时间,目标场景); //慢慢淡化到还有一场景 [2]:CCTransitionFade::create(时间,目标场景); //本场 ...

  9. IT增值服务,客户案例(一)--山东青岛在职人士,2年.Net经验,转Java开发半年

    客户总体情况:2年.Net开发经验,2014年刚刚转Java半年.对Java的若干问题不是非常清楚,仅仅是对JSP/Servlet/JavaBean Spring.SpringMVC.Mybatis有 ...

  10. struts2 Session拦截器

    一:struts2简介 二:拦截器