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的用法:
  1. new FileOutputStream(File);
  2. new FileOutputStream(FileDescriptor);    //FileDescriptor.out将内容输出到控制台
  3. new FileOutputStream(String);              //String为文件路径
  4. new FileOutputStream(File, boolean);     //boolean为true时,则不覆盖文件,在文件的末尾添加内容,false则覆盖文件
  5. 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);
}

Java中写文件操作的更多相关文章

  1. Java中的文件操作(一)RandomAccessFile

    今天,学到的是java中的文件操作. Java.IO.File Java中操作文件用到RandomAccessFile类,既可以读取文件内容,也可以向文件输出数据,但不同与普通输入/输出流的是Rand ...

  2. Java中的文件操作

    在使用计算机编程中,常常会用到对于文件的操作,以下是我对于Java中文件的相关内容学习之后的一个总结和在学习过程中遇到的一些问题. 一.什么是文件 对于文件进行操作,首先我们要知道什么是文件.在此之前 ...

  3. 关于文件的INode与Java中的文件操作接口

    本文由作者周梁伟授权网易云社区发布. 近日做的项目中涉及到多进程共同读写多个文件的问题,文件名和最后修改时间都是可能会被频繁修改的,因而识别文件的唯一性会产生相当的麻烦,于是专门再学习了一下文件系统对 ...

  4. Java中读文件操作

    InputStream & Reader InputStream(字节流),如下是InputStream的层次结构: AudioInputStream:音频输入流类,该方法可以: 从外部音频文 ...

  5. 【转】Java中的IO操作

    在使用io操作之前,先看一下java中的文件类File如何使用.File包括文件和目录,对文件和目录的操作是新建目录mkdir,新建文件createNewFile,删除文件和目录delete,以及其他 ...

  6. 3,Java中的文件IO流

    1,File类 ··· 概念:File对象可以表示一个文件或目录.可以对其进行增删改查. ··· 常用方法:     File f = new File(".");     判断是 ...

  7. Java中的IO操作和缓冲区

    目录 Java中的IO操作和缓冲区 一.简述 二.IO流的介绍 什么是流 输入输出流的作用范围 三.Java中的字节流和字符流 字节流 字符流 二者的联系 1.InputStreamReader 2. ...

  8. 第32课 Qt中的文件操作

    1. Qt的中IO操作 (1)Qt中IO操作的处理方式 ①Qt通过统一的接口简化了文件和外部设备的操作方式 ②Qt中的文件被看作一种特殊的外部设备 ③Qt中的文件操作与外部设备的操作相同 (2)IO操 ...

  9. Java中读取文件

    Java中读取文件,去除一些分隔符,保存在多维数组里面 public void readFile(String filePath) { File file=new File(filePath); Ar ...

随机推荐

  1. iOS程序模块化设计

    一.模块化设计的概述: 模块化设计(Block-based design):对一定范围内的不同功能或相同功能的不同性能.不同规格的产品进行功能分析的基础上,划分并设计出一系列功能模块,通过模块的选择和 ...

  2. Call for Papers International Conference for Smart Health (ICSH) 2014

    Call for PapersInternational Conference for Smart Health (ICSH) 2014 Beijing, China July 10-11, 2014 ...

  3. 《深入理解Java虚拟机》垃圾收集器

    说起垃圾收集(Garbage Collection,GC),大部分人都把这项技术当做Java语言的伴生产物.事实上,GC的历史远比Java久远,1960年诞生于MIT的Lisp是第一门真正使用内存动态 ...

  4. ASP.Net MVC开发基础学习笔记:三、Razor视图引擎、控制器与路由机制学习

    一.天降神器“剃须刀” — Razor视图引擎 1.1 千呼万唤始出来的MVC3.0 在MVC3.0版本的时候,微软终于引入了第二种模板引擎:Razor.在这之前,我们一直在使用WebForm时代沿留 ...

  5. 大白话讲解Promise(二)理解Promise规范

    上一篇我们讲解了ES6中Promise的用法,但是知道了用法还远远不够,作为一名专业的前端工程师,还必须通晓原理.所以,为了补全我们关于Promise的知识树,有必要理解Promise/A+规范,理解 ...

  6. 在C#代码中应用Log4Net(一)简单使用Log4Net

    首先让我们先把Log4Net跑起来,示例代码在文章最后面可以下载 1.先把Log4Net引入到工程中,为了演示方便,我们先建立一个winform程序.在程序的根目录下面,建立一个Libs文件夹,以便存 ...

  7. 策划编写一个新的Helper类

    https://code.csdn.net/jy02305022/blqw-data 有朋友看见的话给点意见呗

  8. Step by Step 创建一个WCF Service

    原创地址:http://www.cnblogs.com/jfzhu/p/4025448.html 转载请注明出处 (一)创建WCF Service (1)创建WCF Service类库 创建一个Cla ...

  9. java spring 邮件发送

    开发中经常会遇到发送邮件进行用户验证,或者其它推送信息的情况,本文基于spring,完成邮件的发送,主要支持普通文本邮件的发送,html文本邮件的发送,带附件的邮件发送,没有实现群发.多个附件发送等需 ...

  10. 大叔最新课程~MVC核心技术剖析

    <MVC核心技术剖析介绍> 主讲:仓储大叔 时间:2016-12-04 20:30分 MVC各层分工 Http请求的过程 如何查找Action 如何渲染视图 ViewModel,DTO,D ...