资讯专栏INFORMATION COLUMN

Java IO学习笔记八

Vixb / 1771人阅读

摘要:通常,所作的每个读取请求都会导致对底层字符或字节流进行相应的读取请求。因此,建议用包装所有其操作可能开销很高的如和构造函数创建一个使用默认大小输入缓冲区的缓冲字符输入流。

BufferedReader和BufferedWriter

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

BufferedReader

从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取,要特别注意的是这个市针对字符流而不是字节流。

通常,Reader 所作的每个读取请求都会导致对底层字符或字节流进行相应的读取请求。因此,建议用 BufferedReader 包装所有其 read() 操作可能开销很高的 Reader(如 FileReaderInputStreamReader

构造函数

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(如 FileWritersOutputStreamWriters)。例如

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();


    }
}
参考文章

http://ifeve.com/java-io-char-buffered-filter/

http://www.cnblogs.com/lich/archive/2011/12/11/2284223.html

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/67175.html

相关文章

  • Java IO学习笔记

    摘要:通常,所作的每个读取请求都会导致对底层字符或字节流进行相应的读取请求。因此,建议用包装所有其操作可能开销很高的如和构造函数创建一个使用默认大小输入缓冲区的缓冲字符输入流。 BufferedReader和BufferedWriter 这两个类是高效率的提高文件的读取速度,它们为字符输入和输出提供了一个缓冲区,可以显著的调高写入和读取的速度,特别针对大量的磁盘文件读取的时候,下面着重的讲讲...

    NSFish 评论0 收藏0
  • Java IO学习笔记总结

    摘要:学习笔记总结前言前面的八篇文章详细的讲述了的操作方法,文章列表如下基本的文件操作字符流和字节流的操作和操作内存操作流管道流打印流对的支持和后续字节流字节流的操作都是基于和这两个抽象类是字节输入流,主要的功能是从文件中读取数据它的子类有内存操 Java IO学习笔记总结 前言 前面的八篇文章详细的讲述了Java IO的操作方法,文章列表如下 基本的文件操作 字符流和字节流的操作 In...

    zhangke3016 评论0 收藏0
  • Java学习笔记()——数据校验(Hibernate validation)

    摘要:在接口服务开发中,难免会校验传入方的参数校验,尤其在请求时,验证字符长度,字符类型是否满足数据库中字段的最大长度及类型,如果不符合条件应及时拦截并返回,避免后续的流程。 showImg(https://segmentfault.com/img/remote/1460000018664784); 公司转java开发也有一段时间了,在实际开发过程中还是会遇到一些问题的,本篇主要记录下接口服...

    snowell 评论0 收藏0
  • Java学习路线总结,搬砖工逆袭Java架构师(全网最强)

    摘要:哪吒社区技能树打卡打卡贴函数式接口简介领域优质创作者哪吒公众号作者架构师奋斗者扫描主页左侧二维码,加入群聊,一起学习一起进步欢迎点赞收藏留言前情提要无意间听到领导们的谈话,现在公司的现状是码农太多,但能独立带队的人太少,简而言之,不缺干 ? 哪吒社区Java技能树打卡 【打卡贴 day2...

    Scorpion 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<