一、字符流

BufferedReader:BufferedReader是从缓冲区之中读取内容,所有的输入的字节数据都将放在缓冲区之中
BufferedWriter:把一批数据写入到缓冲区,当缓冲区区的满时,再把缓冲区的内容写到字符输出流中

二、对文本文件的读写

2.1、字符输入流

2.2、字符输出流

2.3、综合使用

package com.pb.io.buffered;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException; public class BufereTest {
/*BufferedWriter
* 1.需要修饰到一个指定的输出流(例如:FileWriter)还可以是其它的
* 2.BufferedWriter会覆盖原有文件内容
* 3.需要清空缓冲区,使用flush()方法
* BufferedReader
* 1.需要修饰到一个指定的输入流(例如:FileReader)还可以是其它的
* 2.关闭流
*/
public static void main(String[] args) {
/*
* BufferedWriter写操作
*/
try {
//1.创建文件输出流FileWriter
FileWriter fw=new FileWriter("d:/test/test.txt");
//这里没有加true,是清空文件重新写入,可以加入true
//2.实例化。BufferedWriter对象包装类
BufferedWriter bw=new BufferedWriter(fw);
//3.写入内容
bw.write("大家好!");
bw.write("我要修改内容了");
bw.newLine(); //换行
bw.write("哈哈,我修改完了!");
bw.newLine();
//4.清空缓冲区
bw.flush();
//5.关闭流
bw.close();
fw.close();
System.out.println("==========写入文件结束======");
} catch (IOException e) {
e.printStackTrace();
}
/*
* BufferedReader读文件
*/ try {
//1.声明文件读取对象
FileReader fr=new FileReader("d:/test/test.txt");
//2.声明BufferedRead对象
BufferedReader br=new BufferedReader(fr);
//3.开始读取文件
System.out.println("========开始读取文件========");
String date;
while((date=br.readLine())!=null){
System.out.println(date);
}
System.out.println("========读取文件结束========");
//4.关闭流
br.close();
fr.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} } }

结果:

==========写入文件结束======
========开始读取文件========
大家好!我要修改内容了
哈哈,我修改完了!
========读取文件结束========

三、字节-字符转换流

  • OutputStreamWriter:是Writer的子类,将输出的字符流变为字节流,即:将一个字符流的输出对象变为字节流输出对象。
  • InputStreamReader:是Reader的子类,将输入的字节流变为字符流,即:将一个字节流的输入对象变为字符流的输入对象。
 

FileOutputStream是OutputStream 的直接子类,FileInputStream也是InputStream的直接子类,
但是在字符流文件的两个操作类却有一些特殊,FileWriter并不直接是Writer的子类,而是OutputStreamWriter的子类,
而FileReader也不直接是Reader的子类,是InputStreamRader的子类,
那么从这两个类的继承关系就可以清楚的发现,不管是使用字节流还是字符流实际上最终都是以字节的形式操作输入输出流的。

例1.实现文本文件的复制

s1.txt内容

明月几时有,
把酒问青天,
不知道天上宫阙,
今夕是何年。
package com.pb.io.buffered;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter; /*
* 实现文本文件的复制
*使用BufferedReader和BufferedWriter来实现
*/
public class BuffereDemo1 { public static void main(String[] args) { try {
//1.声明BufferedReader和BufferedWriter对象
InputStreamReader isr=new InputStreamReader(new FileInputStream("d:/test/s1.txt"), "GB2312"); //解决中文乱码
//FileReader fr=new FileReader("d:/test/s1.txt");
BufferedReader br=new BufferedReader(isr); OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("d:/test/s2.txt"),"GB2312");
//FileWriter fw=new FileWriter("d:/test/s2.txt"); //s2并不存在,会自动创建
BufferedWriter bw =new BufferedWriter(osw);
//2.开始读取文件
String line; //声明变量用来用来存放读出的内容
int num=1;//用来记录行数
while((line=br.readLine())!=null){
System.out.println("=========正在读出第"+num+"行===========");
System.out.println(line);
System.out.println("=========正在写入第"+num+"行===========");
bw.write(line);
num++;
} System.out.println("======文件写入结束========");
//清空缓冲区
bw.flush();
//关闭输出流
bw.close();
osw.close();
System.out.println("======文件读取结束========");
//关闭输入流
br.close();
isr.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} } }

Java从零开始学三十六(JAVA IO- 字符流)的更多相关文章

  1. Java从零开始学三十三四(JAVA IO-流简述)

    一.流概念(stream) File类并不能对文件内容进行读写. 读文件就是指:把文件的内中的数据读取到内存中来 写文件就是指:把内存中的数据写入到文件中去. 通过什么读写文件呢?文件流. 1.1.流 ...

  2. Java从零开始学三十八(JAVA IO- 重定向IO)

    一.三个静态变量 java.lang.System提供了三个静态变量 System.in(默认键盘) System.out(默认显示器) System.err 二.重写向方法 System提供了三个重 ...

  3. Java从零开始学三十五(JAVA IO- 字节流)

    一.字节流 FileOutputStream是OutputStream 的直接子类 FileInputStream也是InputStream的直接子类 二.文本文件的读写 2.1.字节输入流 Test ...

  4. Java从零开始学三十九(对象序列化)

    一.序列化 将对象的状态存储到特定存储介质中的过程 对象序列化,就是把一个对象变为二进制的数据流的一种方法,通过对象序列化可以方便的实现对象的传输或存储.   序列化保存对象的“全景图”,构建对象的“ ...

  5. Java从零开始学三十二(正则表达式)

    一.为什么要有正则 正则表达式可以方便的对数据进行匹配,可以执行更加复杂的字符串验证.拆份.替换功能. 例如:现在要求判断一个字符串是否由数字组成,则可以有以下的两种做法: 不使用正则完成 使用正则完 ...

  6. Java从零开始学三十(String和StringBuffer类)

    一.StringBuffer连接字符操作 当一个字符串的内容需要被经常改变时就要使用StringBuffer 在StringBuffer中使用append()方法,完成字符串的连接操作   二.Str ...

  7. Java从零开始学二十六(包装类)

    一.包装类 包装类是将基本类型封装到一个类中.也就是将基本数据类型包装成一个类类型. java程序设计为每一种基本类型都提供了一个包装类.这些包装类就在java.lang包中.有8个包装类 二.包装类 ...

  8. Java从零开始学四十六(Junit)

    一.软件测试 软件开发: 项目调研--需求分析--软件设计--程序编码--软件测试--运行维护 软件测试:利用测试工具按照测试方案和流程对产品进行功能和性能测试,使用人工或者自动手段来运行或测试某个系 ...

  9. 菜鸡的Java笔记 第三十六 - java 函数式编程

    StudyLambda    Lambda 指的是函数式编程,现在最为流行的编程模式为面向对象,很多的开发者并不认可面向对象,所以很多的开发者宁愿继续使用 C 语言进行开发,也不愿意使用java,c+ ...

随机推荐

  1. ASP.NET Web API 记录请求响应数据到日志的一个方法

    原文:http://blog.bossma.cn/dotnet/asp-net-web-api-log-request-response/ ASP.NET Web API 记录请求响应数据到日志的一个 ...

  2. 获取数据库连接对象(线程ThreadLocal)

    /** * 负责数据库连接定义的程序类 * 该类可以负责所有操作线程的数据库连接,利用get()方法可以获得连接对象 */ public class DatabaseConnection { priv ...

  3. mySql---or和in的效率问题(和<=、>=、between之间的关系)

    写在前面: 本文是直接拿取的别人的实验数据作参考,然后对数据作分析. 参考网友的测试数据结果: 在网上一直看到的是or和in的效率没啥区别,一直也感觉是这样,前几天刚好在看<mysql数据库开发 ...

  4. 你了解for循环吗

    大家学什么语言都会学for循环 可是你真的会用吗 通常写法都是 var arr=arr[1,2,3,4]; for(var i=0;i<arr.length;i++){ console.log( ...

  5. max_binlog_cache_size

    http://blog.mimvp.com/2017/07/mysql-yi-ge-can-shu-yin-qi-de-dang-ji-xue-an/ max_binlog_cache_size 表示 ...

  6. 用VC资源动态链接库解决国际化问题

    http://daixinghe.blog.163.com/blog/static/1843615920097181952979/ 随着计算机应用的普及,应用软件跨国使用越来越频繁,如何实现应用软件的 ...

  7. Introducing .NET Core

    At connect(), we announced that .NET Core will be entirely released as open source software. I also ...

  8. CLR查找和加载程序集 z

    C#开发者在开发WinForm程序.Asp.Net Web(MVC)程序等,不可避免的在项目中引用许多第三方的DLL程序集, 编译后引用的dll都放在根目录下.以我个人作品 AutoProject S ...

  9. Selenium2+python自动化51-unittest简介

    前言 熟悉java的应该都清楚常见的单元测试框架Junit和TestNG,这个招聘的需求上也是经常见到的.python里面也有单元测试框架-unittest,相当于是一个python版的junit. ...

  10. [集合框架] List 实现

    List 实现分为通用 List 实现和特殊用途的 List 实现. 通用 List 实现 有两个通用的 List 实现 —— ArrayList 和 LinkedList.大多数时候,你可能会使用 ...