常用输入字符流Reader

Reader是用于输入字符数据的,它所根据的 方法跟InputStream基本一样。它是所有输入字符流的抽象父类,因此不能直接构建Reader的实例,必须通过它的子类来构建。以下是几个常用的子类:

1、字符数组作为输入源——CharArrayReader

CharArrayReader包含一个内部缓冲区,该缓冲区包括从流中读取的字符数组。所谓内存缓存区,就是对应了内存中存在的字符数组,因此可以根据字符数组来创建该类的实例。它有以下两个构造函数:

CharArrayReader(char[] buf);
CharArrayReader(char[] buf,int offset,int length);

以下是通过一个字符数组创建字符输入流的过程,并从该输入流中读取数据输出到控制台:

import java.io.CharArrayReader;
import java.io.IOException;

public class TestCharArrayReader {
    public static void main(String[] args) throws IOException {
        // 初始化字符数组
        char[] buf = new char[3];
        buf[0] = ‘a‘;
        buf[1] = ‘b‘;
        buf[2] = ‘c‘;
        // 创建输入流
        CharArrayReader car = new CharArrayReader(buf);
        // 从输入流中读取数据
        char buf2[] = new char[3];
        car.read(buf2);
        System.out.println(buf2);
        // System.out.println(new String(buf2));
        // 关闭输入流
        car.close();

    }
}

2、文件作为输入源——FileReader

FileReader是用来读取字符文件的便捷类。FileReader用于读取字符流,要读取原始字节流,请考虑使用FileInputStream。

FileReader实例可以通过以下的两种方式创建,既可以从文件对象创建,也可以直接根据文件名创建:

FileReader(File file);   //从文件对象创建
FileReader(String fileName);//直接根据文件名创建

下面程序演示如何读取一个磁盘文件来创建一个文件输入流,并循环读取该数据流中的数据并输出到控制台上

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class TestFileReader {
    public static void main(String[] args) {
        try {
            // 创建文件输入流
            FileReader fr = new FileReader("D:/demo/test.txt");
            // 从输入流中读取数据
            while (fr.ready()) {
                int i = fr.read();
                System.out.println((char) i);
                // 关闭输入流
                fr.close();
            }
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}

3、字符串作为输入源——StringReader

此类允许输入流由字符串内容提供,与CharArrayReader使用字符数组作为输入源类。穿件方法只有一个:

StringReader(String s);   //从字符串中读取

下面就是一个实例的创建过程

import java.io.IOException;
import java.io.StringReader;

public class TestStringReader {
    public static void main(String[] args) {
        // 创建字符串输入流
        StringReader sr = new StringReader("Hello world");
        // 从输入流中读取数据
        try {
            int c;
            while ((c = sr.read())!=-1) {
                System.out.print((char) c);
            }
            // 关闭流
            sr.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

4、缓存输入流——BufferedReader

BufferedReader从字符输入流中读取文本,缓存各个字符,从而实现字符、数组和行的高效读取。建议用BufferedReader包装所有其read()操作如FileReader和InputStreamReader开销很高的Reader。

创建方式有两种:

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

如果需要一个具有缓存的文件输入流,则应当组合使用FileReader和BufferedReader,这将能提高读取效率。以下就是将文件输入流对象转换为缓存流的过程:

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class TestBufferedReader {
    public static void main(String[] args) {

        try {
            // 创建文件输入流
            FileReader fr = new FileReader("D:demo/test.txt");
            // 创建数据缓存流
            BufferedReader br = new BufferedReader(fr);
            // 从输入流中读取数据
            while (br.ready()) {
                int c = br.read();
                System.out.print((char) c);
            }
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}
时间: 2024-12-25 18:49:19

常用输入字符流Reader的相关文章

BufferedReader,缓冲输入字符流

1. /** * 输入字符流: * --------|Reader 所有输入字符流的基类.抽象类 * -----------|FileReader 读取文件字符串的输入字符流. * -----------|BufferedReader 缓冲输入字符流.目的是:提高读取效率和拓展FileReader的功能.(该类内部也是维护了字节数组) */ public class Demo1 { public static void main(String[] args) throws IOException

字符流Reader和Writer

1.Rader是字符输入流的父类. 2.Writer是字符输出流的父类. 3.字符流是以字符(char)为单位读取数据的,一次处理一个unicod. 4.字符类的底层仍然是基本的字节流. 5.Reader常用方法 -int   read()  读取一个字符,返回的int值低16位有效, - int   read(char[]  chs)    从该流中读取一个字符数组的length个字符并存入该数组,返回值为实际读取到的字符量. 6.Writer的常用方法 - void   write(int

字符流Reader、Writer,字符转换流 OutputStreamWriter、InputStreamReader

Reader.Writer是所有字符流的超类. Writer类方法 void write(String str) void write(char[] cbuf, int off, int len); void flush() void close OutputStreamWriter构造方法字符编码默认为系统编码,可以不写 FileWriter的append默认为false,可以不写.另一个构造(File file, boolean append) Writer out = new FileWr

Java:IO流之字符流Reader、Writer详解

java.io包中:字符流 字符流的两个抽象基类: Reader         Writer 文件的读取:Reader抽象类(java.io包中) 直接子类的构造方法: FileReader(File file) 在给定从中读取数据的 File 的情况下创建一个新 FileReader. FileReader(FileDescriptor fd) 在给定从中读取数据的 FileDescriptor 的情况下创建一个新 FileReader. FileReader(String fileName

字符流Reader对象创建子类及方法

字符流中输入数据主要用Reader来完成,输出使用Reader 父类---Reader 子类---BufferedReader / CharArrayReader / FilterReader / InputStreamReader子类 (File Writer)   / PipedReader / String Reader Reader是抽象类,不能直接创建对象,一般都是通过子类实例化创建对象: 在读取文件时创建格式: File f=new File("e:"+File.separ

字节流与字符流复习

/* 字节流 输入字节流: -----------| InputStream 所有输入字节流的基类 抽象类 -----------------| FileInputStream 读取文件数据的输入字节流 -----------------| BufferedInputStream 缓冲输入字符流 该类出现的目的是为了提高读取文件 数据的效率. 这个类其实只不过是在内部维护了一个8kb的字节数组而已. 输出字节流: -----------| OutputStream 所有输出字节流的基类. 抽象类

Java IO 转换流 字节转字符流

Java IO 转换流 字节转字符流 @author ixenos 字节流 输入字节流:---------| InputStream 所有输入字节流的基类. 抽象类.------------| FileInputStream 读取文件的输入字节流.------------| BufferedInputStream 缓冲输入字节流. 该类内部其实就是维护了一个8kb(8192b)字节数组而已. 该类出现的目的是为了提高读取文件数据的效率. 输出字节流:---------| OutputStream

深入理解JAVA I/O系列三:字符流详解

字符流为何存在 既然字节流提供了能够处理任何类型的输入/输出操作的功能,那为什么还要存在字符流呢?容我慢慢道来,字节流不能直接操作Unicode字符,因为一个字符有两个字节,字节流一次只能操作一个字节.如果JAVA不能直接操作字符,我会感到JAVA对这个世界满满的恶意,所以提供对直接的字符输入/输出的支持是很有必要的,因为我们的口号是:一次编写,到处运行. 字符流的概念 输出字符流:把要写入文件的字符序列(实际是unicode码元序列)转为指定编码方式下的字节序列,然后在写入文件中. 输入字符流

IO(字符流)

    1. 由于Java采用16位的Unicode字符,因此需要基于字符的输入/输出操作.从Java1.1版开始,加入了专门处理字符流的抽象类Reader和Writer,前者用于处理输入, 后者用于处理输出. 2. Java程序语言使用Unicode来表示字符串和字符,Unicode使用两个字节来表示一个字符,即一个字符占16位 3. 字节流的编码规范与具体的平台有关,可以在构造流对象时指定规范,也可以使用当前平台的缺省规范 InputStreamReader和OutputStreamWrit