BufferedReader和BufferedWriter

  • 这两个类是高效率的提高文件的读取速度,它们为字符输入和输出提供了一个缓冲区,可以显著的调高写入和读取的速度,特别针对大量的磁盘文件读取的时候,下面着重的讲讲这两个类

BufferedReader

  • 从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取,要特别注意的是这个市针对字符流而不是字节流。
  • 通常,Reader 所作的每个读取请求都会导致对底层字符或字节流进行相应的读取请求。因此,建议用 BufferedReader 包装所有其 read() 操作可能开销很高的 Reader(如 FileReader 和 InputStreamReader)

构造函数

  • BufferedReader(Reader in) 创建一个使用默认大小输入缓冲区的缓冲字符输入流。
  • BufferedReader(Reader in, int sz) 创建一个使用指定大小输入缓冲区的缓冲字符输入流。

实例

  • 可以看出构造函数使用了Reader这个抽象类来初始化,我们前面说过这个是针对字符流的读取,因此可以使用Reader类的两个子类FileReader,InputStreamReader来初始化
File file=new File("/tmp"+File.separator+"test"+File.separator+"test.txt");
BufferedReader bufferedReader=new BufferedReader(new FileReader(file)); //使用FileReader实例化
//使用InputStreamReader来实例化
BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(new FileInputStream(file)));

常用方法

  • close()
  • String readLine() 读取一行的数据
  • int read() 读取一个字符,注意这里的和字节的不一样,这里的汉字占用了一个字节,前面讲到读取字节流的时候使用byte读取汉字占用三个字节
  • skip(int n) 跳过n个字节
  • ready() 判断此流是否已准备好被读取。

实例

  • 用于控制台的读取,前面已经说过System.in返回的是InputStream类型的,因此可以使用InputStreamReader实例化,当然这个有点多余了,我们完全可以使用java.util提供的Scanner直接进行输入
BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(System.in));
String str=bufferedReader.readLine(); //将控制台输入的字符串读取
System.out.println(str); //打印出来
  • 用于文件的读取
 BufferedReader bufferedReader=new BufferedReader(new FileReader(file));
// BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(new FileInputStream(file)));
// bufferedReader.skip(2); //跳过两个字节
//
// 第一种读取的方式
while(bufferedReader.ready()) //判断是否还有字符
{
String str=bufferedReader.readLine(); //直接读取一行
System.out.println(str);
}
bufferedReader.close(); //第二种读取方式
int len=bufferedReader.read();
while(len!=-1) //判断是否读到文件的末尾
{
System.out.print((char)len); //强制转化成字符
len=bufferedReader.read();
}

BufferedWriter

  • 将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
  • 通常 Writer 将其输出立即发送到底层字符或字节流。除非要求提示输出,否则建议用 BufferedWriter 包装所有其 write() 操作可能开销很高的 Writer(如 FileWriters 和 OutputStreamWriters)。例如
PrintWriter out
= new PrintWriter(new BufferedWriter(new FileWriter("foo.out")));

构造函数

  • BufferedWriter(Writer out) 创建一个使用默认大小输出缓冲区的缓冲字符输出流。
  • BufferedWriter(Writer out, int sz) 创建一个使用给定大小输出缓冲区的新缓冲字符输出流。
File file=new File("/tmp"+File.separator+"test"+File.separator+"test.txt");
BufferedWriter bufferedWriter=new BufferedWriter(new FileWriter(file));

注意这里的FileWriter是Writer的子类,因此可以使用其实例化

常用函数

  • close()
  • flush()
  • newLine() 写入一个与平台相关的换行符
  • write(int data) 写入一个字符,这里的写入的不是整数
  • write(String str) 写入一个字符串
  • write(String str,int off,int len) 写入部分字符串
  • write(char[] c)
  • write(char[] c,int off,int len)

实例

        File file=new File("/tmp"+File.separator+"test"+File.separator+"test.txt");
File file1=new File("/tmp"+File.separator+"test");
File file2=new File("/tmp"+File.separator+"test"+File.separator+"demo.txt");
if(!file1.exists())
{
file1.mkdir();
System.out.println("文件夹创建成功");
}
BufferedWriter bufferedWriter=new BufferedWriter(new FileWriter(file));
String str="陈加兵";
int data=48;
String name="chenjiabing";
char[] chars=name.toCharArray();
bufferedWriter.write(str); //写入一个字符串,当然也可以截取这个字符串的某一段
bufferedWriter.newLine(); //写入一个平台自带的换行符,因为每一个操作系统的换行符都不一样
bufferedWriter.write(data); //写入的并不是整数,而是这个整数所代表的字符
bufferedWriter.newLine();
bufferedWriter.write(chars,1,4); //写入字符数组
bufferedWriter.flush();
bufferedWriter.close()

拓展:通过了上面的学习,你不觉得使用这个类写入文件数据有点烦了,只能写入String char类型的数据,此时我们就想到了前面说过的打印流(PrintWriter),这是一个便捷的写入文件的类,可以指定任意格式任意类型的数据,同样是输出流,我么可以将他们结合起来,构成一个更加强大的输出流,如下:

        File file=new File("/tmp"+File.separator+"test"+File.separator+"test.txt");
//用BufferedWriter实例化PrintWriter,显著提高写入的效率
PrintWriter printWriter=new PrintWriter(new BufferedWriter(new FileWriter(file)));
String name="陈加兵";
int age=22;
float grade=99.9f;
printWriter.printf("姓名:%s,年龄:%s,grade:%s",name,age,grade); //格式化的写入
printWriter.close();

综合实例

将一个文件中数据转移到另外一个文件中

package IO;

import java.io.*;

/**
* Created by chenjiabing on 17-5-26.
*/
public class demo13 { /**
* 常用函数:
* newLine()
* write(String str)
* write(String str,int off,int len)
* write(Char[] c)
* write(Char[] c,int off,int len)
* write(int data)
* close()
* flush()
*/
public static void main(String[] args) throws IOException {
File file = new File("/tmp" + File.separator + "test" + File.separator + "test.txt");
File file1 = new File("/tmp" + File.separator + "test");
File file2 = new File("/tmp" + File.separator + "test" + File.separator + "demo.txt");
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(file2));
BufferedReader bufferedReader = new BufferedReader(new FileReader(file)); while (bufferedReader.ready()) {
String str = bufferedReader.readLine(); //读取文件test.txt中的一行数据
bufferedWriter.write(str); //将这一行数据写入文件demo.txt
bufferedWriter.newLine();
}
bufferedReader.close();
bufferedWriter.flush();
bufferedWriter.close(); }
}

参考文章

Java IO学习笔记八的更多相关文章

  1. Java IO学习笔记八:Netty入门

    作者:Grey 原文地址:Java IO学习笔记八:Netty入门 多路复用多线程方式还是有点麻烦,Netty帮我们做了封装,大大简化了编码的复杂度,接下来熟悉一下netty的基本使用. Netty+ ...

  2. Java IO学习笔记总结

    Java IO学习笔记总结 前言 前面的八篇文章详细的讲述了Java IO的操作方法,文章列表如下 基本的文件操作 字符流和字节流的操作 InputStreamReader和OutputStreamW ...

  3. Java IO学习笔记:概念与原理

    Java IO学习笔记:概念与原理   一.概念   Java中对文件的操作是以流的方式进行的.流是Java内存中的一组有序数据序列.Java将数据从源(文件.内存.键盘.网络)读入到内存 中,形成了 ...

  4. Java IO学习笔记三

    Java IO学习笔记三 在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类. OutputStreamWriter:是Writer的子类,将输出的 ...

  5. Java IO学习笔记二

    Java IO学习笔记二 流的概念 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 程序中的输入输 ...

  6. Java IO学习笔记一

    Java IO学习笔记一 File File是文件和目录路径名的抽象表示形式,总的来说就是java创建删除文件目录的一个类库,但是作用不仅仅于此,详细见官方文档 构造函数 File(File pare ...

  7. Java IO学习笔记一:为什么带Buffer的比不带Buffer的快

    作者:Grey 原文地址:Java IO学习笔记一:为什么带Buffer的比不带Buffer的快 Java中为什么BufferedReader,BufferedWriter要比FileReader 和 ...

  8. Java IO学习笔记二:DirectByteBuffer与HeapByteBuffer

    作者:Grey 原文地址:Java IO学习笔记二:DirectByteBuffer与HeapByteBuffer ByteBuffer.allocate()与ByteBuffer.allocateD ...

  9. Java IO学习笔记三:MMAP与RandomAccessFile

    作者:Grey 原文地址:Java IO学习笔记三:MMAP与RandomAccessFile 关于RandomAccessFile 相较于前面提到的BufferedReader/Writer和Fil ...

随机推荐

  1. sublime text3在指定浏览器上本地服务器(localhost)运行文件(php)

    昨天在使用sublime text3时,发现能在本地服务器上运行php文件,于是百度了一下有关知识, 终于成功了,今天总结一下. 首先要让sublime text3 出现侧边栏sidebar,不会的可 ...

  2. [原创] 绿色单文件封装程序GreenOne V3.0

    1.原理 将包含可执行文件的多个文件 调用Winrar,创建自解压格式压缩文件 设置高级自解压选项中的文本和图标,设置解压后运行的文件为选中的可执行文件. 这种创建单文件封装其实也就是一个Winrar ...

  3. 读入一个自然数n,计算其各位数字之和,用汉语拼音写出和的每一位数字。 输入格式:每个测试输入包含1个测试用例,即给出自然数n的值。这里保证n小于10的100次幂。 输出格式:在一行内输出n的各位数字之和的每一位,拼音数字间有1 空格,但一行中最后一个拼音数字后没有空格。 输入样例: 1234567890987654321123456789 输出样例: yi san wu

    这是PAT中的一道练习题 刚开始的时候我想着直接定义正整数n,结果走了很大的弯路,因为题目中要求n小于10的100次幂,即最大的正整数n有100位,而C语言中整型数字最大占8个字节的存储空间,如果按无 ...

  4. .net使用RabbitMQ

    前面的两篇博文算是把RabbitMQ的基础了解了下,今天学习.Net 中RabbitMQ的使用.原本这篇博文是应该上周写的,可在自己使用的过程中出现了一个问题bug:就是在连接服务端时,一直报下面的错 ...

  5. Volley使用指南

    1.什么是Volley 在这之前,我们在程序中需要和网络通信的时候,大体使用的东西莫过于AsyncTaskLoader,HttpURLConnection,AsyncTask,HTTPClient(A ...

  6. Linux五种IO模型性能分析

    1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步:       所谓同步,就是在发出一个功能调用时, ...

  7. 4.从AbstractQueuedSynchronizer(AQS)说起(3)——AQS结语

    前两节的内容<2.从AbstractQueuedSynchronizer(AQS)说起(1)——独占模式的锁获取与释放> .<3.从AbstractQueuedSynchronize ...

  8. 2.Java 加解密技术系列之 MD5

    Java 加解密技术系列之 MD5 序 背景 正文 结束语 序 上一篇文章中,介绍了最基础的编码方式 — — BASE64,也简单的提了一下编码的原理.这篇文章继续加解密的系列,当然也是介绍比较基础的 ...

  9. Http学习之使用HttpURLConnection发送post和get请求(2)

    接上节Http学习之使用HttpURLConnection发送post和get请求 本节深入学习post请求. 上 节说道,post请求的OutputStream实际上不是网络流,而是写入内存,在ge ...

  10. winfrom中将panel另存为图片

    private void button1_Click(object sender, EventArgs e)        {            Point ScrollMaxInfo = Get ...