OutputStream 和 Writer
OutputStream类(直接操作byte数组)
该类是字节输出流的抽象类,定义了输出流的各种操作方法。如下图是OutputStream的层次结构:

- ByteArrayOutputStream:字节数组流,可以捕获内存缓冲区的数据,转换为字节数组。该类有两个构造方法:
new ByteArrayOutputStream();
new ByteArrayOutputStream(int size); //size表示初始化字节数组缓冲区的大小

ByteArrayOutputStream bos = new ByteArrayOutputStream();
bos.write('q');
bos.write('a'); //将字节写入该字符数组
bos.reset(); //重置该字节数组,即将如上写入的'q' 'a'字节清空
byte[] b = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n'};
bos.write(b, 1, 7); //从b数组的第一个下标连续写入长度为7个字符
try {
FileOutputStream fs = new FileOutputStream("SourceFile/employee");
bos.writeTo(fs); //将字符数组写入文档
fs.close();
bos.flush();
bos.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

- FileOutputStream:以字节流的方式将二进制数据或者字符数据输出到文件中,该类有5个构造方法,我们在代码中介绍了2和4的用法:
- new FileOutputStream(File);
- new FileOutputStream(FileDescriptor); //FileDescriptor.out将内容输出到控制台
- new FileOutputStream(String); //String为文件路径
- new FileOutputStream(File, boolean); //boolean为true时,则不覆盖文件,在文件的末尾添加内容,false则覆盖文件
- new FileOutputStream(String, boolean); //同上

try {
FileOutputStream fs1 = new FileOutputStream(FileDescriptor.out);
FileOutputStream fs2 = new FileOutputStream(new File("SourceFile/employee"), true); //在该文件的末尾添加内容
fs1.write("https://www.cnblogs.com/zhanglei93/".getBytes()); //write()方法可以写入byte数组、int
fs1.close();
fs2.write("https://www.cnblogs.com/zhanglei93/".getBytes());
fs2.flush(); //清空缓存里的数据,并通知底层去进行实际的写操作
fs2.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

- BufferedOutputStream是一个缓冲数据输出流接口,类中有一个byte数组,调用write()函数时,首先向这个数组中写入数据,然后当某些时刻(数组写满等)会将这些数组写入到流之中,该类有两个构造方法:
new BufferedOutputStream(OutputStream)
new BufferedOutputStream(OutputStream,int) //int的值规定了byte数组的大小

try {
FileOutputStream fs = new FileOutputStream("SourceFile/employee");
BufferedOutputStream bos = new BufferedOutputStream(fs);
bos.write("https://www.cnblogs.com/zhanglei93/".getBytes()); //write()方法可以写入byte数组、int
fs.close();
bos.flush();
bos.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

- PrintStream可以方便的输出各种类型的数据,该类主要用于操作字节流,且该类的方法不抛出IOException。该类有8个构造方法:
new PrintStream(File);
new PrintStream(OutputStream);
new PrintStream(String); //文件路径及名称
new PrintStream(File, String); //String 编码格式
new PrintStream(OutputStream, boolean); //是否自动刷新
new PrintStream(OutputStream, boolean, String); //是否自动刷新、编码格式
new PrintStream(String, String); //文件路径及名称、编码格式
关于该类的详细说明见:http://www.cnblogs.com/skywang12345/p/io_16.html
Writer类(首先进行decode、encode)
该类是字符输出流的抽象类,定义了输出流的各种操作方法。如下图是Writer的层次结构:

- BufferedWriter通过创建缓冲数组,将写入内容先存入缓存,该类有2个构造函数:
new BufferedWriter(Writer)
new BufferedWriter(Writer, int) //int大小为默认数组的大小

try {
BufferedWriter bw = new BufferedWriter(new FileWriter("SourceFile/employee"));
bw.write("http://www.cnblogs.com/zhanglei93/".toCharArray()); //写入char数组
bw.write("http://www.cnblogs.com/zhanglei93/"); //写入String,还可以写入int
CharSequence csq = "http://www.cnblogs.com/zhanglei93/p/5846592.html";
bw.append(csq, 0, 34);
bw.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}

- CharArrayWriter创建char缓冲数组,也有两个构造函数:
new CharArrayWriter();
new CharArrayWriter(int);

CharArrayWriter cw = new CharArrayWriter(5);
for(Employee e : employees){
try {
cw.write(e.getName());
cw.append(e.getSalary() + "");
cw.write(e.getDate().toString() + "\r\n");
FileWriter fw = new FileWriter("SourceFile/employee");
cw.writeTo(fw);
fw.close();
cw.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}

- FileWriter该类包含5个构造方法:
new FileWriter(File)
new FileWriter(FileDescriptor)
new FileWriter(String)
new FileWriter(File, boolean)
new FileWriter(String, boolean)
具体的使用方法见:http://docs.oracle.com/javase/8/docs/api/java/io/FileWriter.html
- PrintWriter该类有8种构造方法:
具体见:http://docs.oracle.com/javase/7/docs/api/java/io/PrintWriter.html

PrintWriter pw = null;
/**
* PrintWriter(String fileName, String csn)
* 创建具有指定文件名称和字符集且不带自动行刷新的新 PrintWriter。如不执行pw.close()则不刷新文件内容
* @param name
* @param code
* @param employees
*/
public void writeData(String name, String code, Employee[] employees){
try {
pw = new PrintWriter(name, code);
writeToFile(pw, employees);
pw.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* PrintWriter(Writer out, boolean autoFlush)
* 创建新 PrintWriter, flag = true表示能自动刷新,即不执行pw.close()也会自动刷新内容到文件
* @param write
* @param flag
* @param employees
*/
public void writeData(Writer write, boolean flag, Employee[] employees){
pw = new PrintWriter(write, flag);
writeToFile(pw, employees);
pw.close();
}
private void writeToFile(PrintWriter pw, Employee[] employees){
pw.println(employees.length);
for(Employee e : employees)
e.writeEmployee(pw);
}

OutputStream 和 Writer的更多相关文章
- Java I/O流-总结(InputStream,OutputStream,Reader,Writer)
Java流总结 一. 流的分类 • 按数据流动方向 – 输入流:只能从中读取字节数据,而不能向其写出数据 – 输出流:只能向其写入字节数据,而不能从中读取数据 • 按照流所处理的数据类型 – 字节流: ...
- Java IO--字节流与字符流OutputStream/InputStream/Writer/Reader
流的概念 程序中的输入输出都是以流的形式保存的,流中保存的实际上全都是字节文件. 字节流与字符流 内容操作就四个类:OutputStream.InputStream.Writer.Reader 字节流 ...
- 02_IO操作的基本规律(InputStream,OutputStream,Reader,Writer,FileReader,FileWriter,BufferedReader,BufferedWri
模拟BufferedInputStream,编写一个类 package toto.IO; import java.io.IOException; import java.io.InputStre ...
- java流1----InputStream、OutputStream、Reader、Writer
字节流和字符流 顾名思义,字节流就是操作的是字节,字符流操作的就是字符.其中字节流又可以分为字节输入流(InputStream)和字节输出流(OutputStream).同样的字符流也可以分为字符输入 ...
- 013-java中的IO操作-InputStream/Reader、OutputStream/Writer
一.概述 IO流用来处理设备之间的数据传输,上传文件和下载文件,Java对数据的操作是通过流的方式,Java用于操作流的对象都在IO包中. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称 ...
- IO流05_OutputStream和Writer输出流
[输出流中的字节流和字符流] [OutPutStream和Writer] [ OutputStream和Writer中包含的方法 ] void write(int c) 将指定的字节/字符 ...
- Java I/O---Reader & Writer(字符流)
1.Reader & Writer 当我们初次看见Reader和Writer类时,可能会以为这是两个用来替代InputStream和OutputStreamt的类,但实际上并非如此. 尽管一些 ...
- java-I/O File类(5)-Reader和Writer、OutputStreamWriter 、BufferedWriter、字节流和字符流的区别
标签: outputstreamwriterreader字符file方法 2015-05-14 23:06 469人阅读 评论(0) 收藏 举报 分类: 孙鑫-java基础(16) I-O(4 ...
- [19/03/30-星期六] IO技术_四大抽象类_ 字节流( 字节输入流 InputStream 、字符输出流 OutputStream )_(含字节文件缓冲流)
一.概念及分类 InputStream(输入流)/OutputStream(输出流)是所有字节输入输出流的父类 [注]输入流和输出流的是按程序运行所在的内存的角度划分的 字节流操作的数据单元是8的字节 ...
随机推荐
- opencv3.0+vs2013安装记录
为了能够更好的学习图像,我觉得opencv是一个必不可少的库,因此在以后的研究上使用opencv作为研究工具,与大家共同进步. 话归正题:先搭建opencv的环境. 1.下载安装包3.0 a,官网打开 ...
- 什么是Java优先级队列(Priority Queue)?
PriorityQueue是一个基于优先级堆的无界队列.它的元素是按照自然顺序排序的.在创建元素的时候,我们给它一个一个负责排序的比较器.PriorityQueue不允许null值,因为 它们没有自然 ...
- 第三节 java 函数的封装方法 以及 访问封装内容
从我们的选择排序和冒泡排序里我们可以看到有很多相同的代码, 我们 可以把这些相同的代码提取出来封装为方法:比如我们的判 断交换和遍历输出: 抽取1: public static void PanDua ...
- DevExpress WinForms v18.2新版亮点(三)
行业领先的.NET界面控件2018年第二次重大更新——DevExpress v18.2日前正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了DevExpress WinForms v1 ...
- spring4全注解web项目demo
记得没接触框架的时候,写demo测试时真的很爽,新建web项目,然后随便写写servlet随便调试 框架越来越多,配置记不得了,整合容易出问题,集成新东西越来越少了,不敢动了. 这是个spring4的 ...
- pytest的执行规则和顺序
用例运行级别 模块级(setup_module/teardown_module)开始于模块始末,全局的 函数级(setup_function/teardown_function)只对函数用例生效(不在 ...
- MySQL:数据库的基本操作
第二篇.数据库的基本操作 一.创建数据库 附:创建数据库并不意味输入数据在这个数据库中,只有用切换数据库才可以输数据到这个数据库中. 1.创建数据库 格式:create database数据库名字 [ ...
- 在Linux系统下mail命令的用法
在Linux系统下mail命令的测试 1. 最简单的一个例子: mail -s test admin@aispider.com 这条命令的结果是发一封标题为test的空信给后面的邮箱,如果你有mta并 ...
- 键盘keycode对照表
- 2017ICPC南宁赛区网络赛 The Heaviest Non-decreasing Subsequence Problem (最长不下降子序列)
Let SSS be a sequence of integers s1s_{1}s1, s2s_{2}s2, ........., sns_{n}sn Each integer i ...