字符流

Reader是字符输入流的基类,用于从某个源设备读取字符

Writer是字符输出流,用于向某个目标设备写入字符

字符流操作文件

字符输入流FileReader,通过此流可以从关联的文件中读取一个或一组字符。

在程序开发中,经常需要向文件中写入字符,可以使用Writer的一个子类FileReader。

需求:在硬盘上,创建一个文件,并写入一些文字数据。

用于操作操作文件的Writer的子类FileWriter,后缀名是父类名。前缀名是该流对象的功能。

操作步骤:

1.创建一个FileWriter对象。该对象一被初始化就必须明确要被操作的文件,该文件会被创建到指定目录下,如果该目录下已经有同名文件,将被覆盖

FileWriter fw=new FileWriter("demo.txt");

2.调用write方法,将字符串写入到流中。

fw.write();

3.刷新流对象中的缓冲中的数据,将数据刷到目的地

fw.flush();

4.关闭流资源,但是关闭之前会刷新一次内部的缓冲中的数据,将数据刷到目的地中。和flush的区别,flush刷新后,流可以继续使用,close刷新后将会将流关闭。

fw.close();

字符文件输入流FileReader

针对字符进行操作,而不是字节。它的间接父类是字符流Reader。FileWriter是用于写入字符文件的便捷类。

在FileReader类中未自定义方法,而是继承了其父类及间接父类中的方法。

构造方法

public FileReader(File file)                 在给定从中读取数据的File的情况下创建一个新类

public FileReader(String fileName)    在给定从中读取数据的文件名的情况下创建一个新类

字符文件输出流FileWriter

构造方法

FileWriter(File file)                              通过file对象创建FileWriter

FileWriter(File file, boolean append)  通过file对象创建类,append为true或false表示是否在文件追加

FileWriter(FileDescriptor fd)               参数fd为文件描述符,通过文件描述符创建FileWriter

FileWriter(String fileName)                 参数fileName为文件路径名,通过文件路径创建FileWriter

FileWriter(String fileName, boolean append)

字符输入流Reader

该类是抽象类,不能被实例化

方法
    abstract void close()             关闭输入流

void mark ()                           在输入流中标记当前位置

boolean markSupported ()    测试输入流是否支持mark()和reset()方法

int read ()                              从输入流读取下一字符

int read (char[] cbuf)             从输入流读取若干字符数据,并存储到字符数组

abstract int read (char[] cbuf, int off, int len)       从输入流读取至多len个字符数据,并存储到字符数组

boolean void ready ()           判断是否准备读取输入流

void reset ()                          将输入流重新定位到mark()方法标记的位置

long skip (long n)                  跳过输入流中n个字符数据

字符输出流Writer

该类是抽象类,不能被实例化

方法

abstract void close()                     关闭输出流

abstract void flush()                      刷新输出流,强制将缓冲区内容写入输出流

void write(char[] cbuf)                   将指定字符数组的内容写入输出流

abstract void write(char[] cbuf,int off,int len)          将指定字符数组从off位置开始的len个字符写入输出流

write(int c)                                    将指定的字符写入输出流

write(String str)                            将指定的字符串写入输出流

write(String str,int off,int len)        将指定字符串从off位置开始的len个字符写入输出流

字符流的缓冲区

字符流提供了带缓冲区的包装流,分别是BufferedReader和BufferedWriter,其中BufferedReader用于对字符输入流进行包装,BufferedWriter用于对字符输出流进行包装。

缓冲区的出现提高了对数据的读写效率

对应类:BUfferWriter 、BufferedReader

特点:缓冲区要结合流才可以使用,在创建缓冲区之前,必须要有流对象。在流的基础上对流的功能进行了增强。

BufferedWriter步骤
    1.创建一个字符写入流对象

FileWriter fw=new FileWriter("a.txt");

2.将需要被提高效率的流对象作为参数传递给缓冲区的构造函数

bufferedWriter bufw=new BufferedWriter(fw);

buff.write("asdasdas");

bufw.newLine();//换行符,跨平台的

3.将缓冲区刷新

bufw.flush;

4.关闭缓冲区,就是在关闭缓冲区中的流对象

BufferedReader步骤
    1.创建一个字符写入流对象

FileReader fr=new FileReader ("a.txt");

2.将需要被提高效率的流对象作为参数传递给缓冲区的构造函数

BufferedReader bufr=new BufferedReader (fr);

3.读取流对象:该缓冲区提供了一个一次读取一行的方法。当返回null时表示,文件读到末尾

String line=null;

while((line=bufr.readLine())!=null) {

String s=line;}

4.关闭

bufr.close();

readLine()方法的原理:无论是读一行,获取多个字符,最终都是在硬盘上一个一个读取,最终使用额还是read方法一次读一个的方法。

通过缓冲区复制一个文件

BufferWriter bufw=null;
    BufferReader bufr=null;
    try {
        bufw=new BufferWriter(new FileWriter("b.txt"));
        bufr=new BufferReader(new FileReader("a.txt"));
        String line=null;
        while ((line=buffr.read(buf))!=null){
            bufw.write(line);
            bufw.newLine();
            bufw.flsuh;
        }
    }catch (IOException e) {
        e.printStackTrace();
    }finally {
        try {
            fr.close();
        } catch (IOException e) {
            e.printStackTrace();
        }   
        try {
            fw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

字符缓冲区输入流BufferedReader

从字符输入流中读取文本,缓冲各个字符,从而提供字符、数组和行的高效读取

构造方法

public BufferedReader(Reader in)                创建一个使用默认大小输入缓冲区的输入流

public BufferedReader(Reader in, int size)   创建一个使用size指定大小输入缓冲区的输入流

方法

void close()
                                关闭该流

void mark(int readAheadLimit)    标记流中的当前位置

boolean markSupported()           判断此流是否支持mark()操作

int read()                                     读取单个字符

int read(char[] cbuf, int off, int len)         将字符读入数组的某一部分

String readLine()                         读取一个文本行

boolean ready()                          判断此流是否已准备好被读取

void reset()                                 将流重置为最新的标记

long skip(long n)
跳过字符

字符缓冲区输出流BufferedWriter

将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。可以指定缓冲区的大小,或者接受默认的大小。

构造方法

public BufferedWriter(Writer out)                创建一个使用默认大小输出缓冲区的输出流

public BufferedWriter(Writer out, int size)   创建一个使用size指定大小输出缓冲区的输出流

方法

void close()          关闭该输出流

void flush()           刷新该流的缓冲

void newLine()     写入一个行分隔符

void write(char[] cbuf, int off,int len)     写入字符数组的某一部分

void write(int c)     写入单个字符

void write(String s,int off,int len)          写入字符串的某一部分

文件的读取

文件的读取方式一:FileReader();

1.创建一个FileReader对象。文件读取流对象,和指定名称的文件相关联,要保证该文件是已经存在的,如果不存在会发生异常

FileReader fr=new FileReader("demo.txt");

2.调用读取流的对象的read方法

(1)int ch=fr.read();一次读一个字符,会自动往下读。

(2)读出所有字符

while((ch=fr.read())!=-1){

System.out.println((char)ch);

}

3.关闭流资源,

fr.close();

文件的读取方式二:通过字符数组进行读取

1.创建一个FileReader对象。文件读取流对象,和指定名称的文件相关联,要保证该文件是已经存在的,如果不存在会发生异常

FileReader fr=new FileReader("demo.txt");

2.定一个字符数组,用于存储读到字符,该rrad(char[])返回的是读到的字符个数。

char[] buf=new char[1024];一般定义1024-2个字节。

int num=0;

while((num=fr.read(buf))!=-1){

System.out.println((new String(buf,0,num));

}

文件的续写

传递一个true参数,代表不覆盖已有文件,并在已知文件的末尾处进行数据续写。

FileWriter fw=new FileWriter("demo.txt",true);

换行转义字符:\r\n

IO异常的处理方式
    FileWriter fw=null;

try {

fw=new FileWriter("demo.txt");

fw.write("sdfasd");

} catch (IOException e) {

e.printStackTrace();

}finally {

try {

if(fw!=null)

fw.close();

} catch (IOException e) {

e.printStackTrace();

}
}

}

ListNumberReader带有行号的缓冲区
是BufferedReader的直接子类

LineNumberReader lnr=new LineNumberReader();

获取行号:lnr.getLineNumber();

设置行号从几开始:lnr.setLineNumber(100);

1.创建一个字符写入流对象

FileReader fr=new FileReader ("a.txt");

2.将需要被提高效率的流对象作为参数传递给缓冲区的构造函数

LineNumberReader lnfr=new LineNumberReader (fr);

3.读取流对象:该缓冲区提供了一个一次读取一行的方法。当返回null时表示,文件读到末尾

String line=null;

while((line=lnfr.readLine())!=null) {

String s=line;

String linenum=lnfr.getLineNumber();

}

4.关闭

lnfr.close();

自定义带行号的MyLineNumber

public class MyLineBufferReader extends MyBufferedReader {
    public MyLineBufferReader(Reader r) {
        super(r);
    }
    private int LineNumber;
    public int getLineNumber() {
        return LineNumber;
    }
    public void setLineNumber(int lineNumber) {
        LineNumber = lineNumber;
    }
    public String myReadLine() throws IOException {
        LineNumber++;
        return super.myReadLine();
    }
}

自定义一个功能和readline一致的方法,来模拟下BufferedReader()

public class MyBufferedReader extends Reader {
    private Reader r;
    public MyBufferedReader(Reader r) {
        super();
        this.r = r;
    }
    //可以一次读取一行的方法
    public String myReadLine() throws IOException {
        //定义一个临时容器。StringBulider容器,应用于存储字符数组
        StringBuilder sb=new StringBuilder();
        int ch=0;
        while((ch=r.read())!=-1){
            if(ch=='\r')
                continue;
            if(ch=='\n')
                return sb.toString();
            else
                sb.append((char)ch);
        }
        if(sb.length()!=0)
            return sb.toString();
            return null;
        }
    }
}

读取一个.java文件,并打印在控制台上

FileReader fr=null;
    char[] buf=new char[1024];
    int num=0;
    try {
        fr= new FileReader("a.txt");
        try {
            while((num=fr.read(buf))!=-1) {
            System.out.print(new String(buf,0,num));
        } catch (IOException e) {
            e.printStackTrace();
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } finally {
        try {
            if(fr!=null)
            fr.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

将C盘的一个文本文件拷贝到D盘(数组相当于存储之中的媒介)

步骤:
    1.新建一个文件用于存储要被拷贝的文件
    2.定义读取流和源文件关联
    3.通不过不断读写完成数据存储
    4.关闭资源
    FileWriter fw=null;
FileReader fr=null;
    try {
        fw=new FileWriter("b.txt");
        fr=new FileReader("a.txt");
        char[] buf=new char[1024];
        int num=0;
        while ((num=fr.read(buf))!=-1) {
            fw.write(buf,0,num);
        }
    }catch (IOException e) {
        e.printStackTrace();
    }finally {
        try {
            fr.close();
        } catch (IOException e) {
            e.printStackTrace();
        }   
        try {
            fw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
}

Java精选笔记_IO流(字符输入输出流、字符文件输入输出流、字符流的缓冲区)的更多相关文章

  1. Java精选笔记_IO流(字节流、InputStream、OutputStream、字节文件、缓冲区输入输出流)

    字节流 操作图片数据就要用到字节流. 字符流使用的是字符数组char[],字节流使用的是字节数组byte[]. 字节流读写文件 针对文件的读写,JDK专门提供了两个类,分别是FileInputStre ...

  2. Java精选笔记_IO流(转换流、常用流、流操作规律、字符编码)

    IO流 用来处理设备之间的数据传输,java对数据的操作是通过流的方式,java用于操作流的对象都在IO包中 按操作数据分为:字节流和字符流:按流向分为:输入流和输出流. 程序从输入流中读取数据,向输 ...

  3. Java精选笔记_IO流【File(文件)类、遍历目录下的文件、删除文件及目录】

    File(文件)类 File类用于封装一个路径,该路径可以是从系统盘符开始的绝对路径,也可以是相对于当前目录而言的相对路径 File类内部封装的路径可以指向一个文件,也可以指向一个目录,在使用File ...

  4. Java IO流学习总结一:输入输出流

    Java IO流学习总结一:输入输出流 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/54292148 本文出自[赵彦军的博客] J ...

  5. java:IO流(File,字节流/输入输出流(InputStream(FileInputStream),OutputStream(FileOutStream)),字符流(Reader,Writer))

    File: * java.io.File类:代表一个文件或目录. * 常用的构造方法: * File(String pathname)通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例 ...

  6. Java开发笔记(八十八)文件字节I/O流

    前面介绍了如何使用字符流读写文件,并指出字符流工具的处理局限,进而给出随机文件工具加以改进.随机文件工具除了支持访问文件内部的任意位置,更关键的一点是通过字节数组读写文件数据,采取字节方式比起字符方式 ...

  7. Java精选笔记_JSP技术

    JSP技术 JSP概述 什么是JSP 在JSP全名是Java Server Page,它是建立在Servlet规范之上的动态网页开发技术. 在JSP文件中,HTML代码与Java代码共同存在,其中,H ...

  8. Java精选笔记_Java编程基础

    Java的基本语法 Java代码的基本格式 修饰符 class 类名 {   程序代码 } 一个Java源文件只定义一个类,不同的类使用不同的源文件定义:将每个源文件中单独定义的类都定义成public ...

  9. Java 7源码分析第13篇 - 字节输入输出流(1)

    上一篇介绍了关于字节输入输出流的Java类框架,同时也简单介绍了一下各个类的作用,下面就来具体看一下这些类是怎么实现这些功能的. 1.InputStream和OutputStream InputStr ...

随机推荐

  1. Shell执行将脚本里的变量打印到指定日志文件

    首先需要定位获取任务的运行日志或者报错信息,才能定位问题. 通过shell调用有些脚本的话,日志信息会打印在shell里.不过也有用户在shell里调用正常,但是到crontab调用的时候就出错并且没 ...

  2. eclipse的remote search

    一般你希望以部分文件名作为关键字的时候,可以选择这个搜索选项,当然你也可以选择操作系统自带的搜索功能

  3. Ubuntu 16.04和win10双系统时间不一致解决办法

    windows10和ubuntu16.04双系统,装完后,在windows下时间不对,之前的老办法是: sudo gedit /etc/default/rcS 2 utc=yes 改成utc=no 然 ...

  4. python2.7执行shell命令

    python学习——python中执行shell命令 2013-10-21 17:44:33 标签:python shell命令 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者 ...

  5. C++基础学习-20120516

    1.一下是使用strcpy_s与strcpy的安全性比较 char szBuf[2] = {0}; strcpy_s(szBuf, 2, "12131");  //新的CRT函数  ...

  6. 一款基于jquery实现的鼠标单击出现水波特效

    今天要为大家绍一款由jquery实现的鼠标单击出现水波特效.用鼠标猛点击页面,你可以看到页面不断出面水波纹效果.然后水波纹渐渐消失.效果非常不错.我们一起看下效果图: 在线预览   源码下载 实现的代 ...

  7. 【WPF】XAML引入资源和在C#代码中动态添加样式

    转载自: http://blog.csdn.net/honantic/article/details/48781543 XAML引入资源参考这里: http://blog.csdn.net/qq_18 ...

  8. BUS Matrix

    ARM的BUS Matrix就是多主(Core,DMA等).多从(内部RAM,APB,外部总线等)的交联和仲裁.目的是为了提高不同主机访问不同外设情况下的带宽,另外一个就是简化Bus Master的协 ...

  9. 双行表头DatagridView的简单实现

    DatagridView默认不支持多行表头的实现,一些第三方的控件,比如Spread就可以,因此要实现这个功能,只能自己想办法了.介绍两种思路:1,用重写DataGridView的Paint等方法,可 ...

  10. 怎样编写socket套接字

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/ ...