1.1、字符流

字符流:一次读入或读出是16位二进制。格式:后缀名是父类名。前缀名是该流对象的功能。

Reader(字符流):用于读取字符流的抽象类。

Writer:写入字符流的抽象类。

06、IO流(一) -- 字符流

IO流用来处理设备之间的数据传输,而且流按照分向划分可分为输入流和输出流。

1、IO流常用基类

(1)字节流的抽象基类:InputStream,OutputStream 。
(2)字符流的抽象基类:Reader,Writer 。
注:由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀。
如: InputStream 的子类 FileInputStream 。Reader 的子类 FileReader 。

a) Writer :

字段

protected  Object lock://用于同步针对此流的操作的对象。

构造方法:

protected  Writer()://创建一个新的字符流 writer,其关键部分将同步 writer 自身。
protected  Writer(Object lock)://创建一个新的字符流 writer,其关键部分将同步给定的对象。

方法:

Writer append(char c)://将指定字符添加到此 writer。 
Writer append(CharSequence csq)://将指定字符序列添加到此 writer。
Writer append(CharSequence csq, int start, int end)://将指定字符序列的子序列添加到此 writer.Appendable。
abstract  void close()://关闭此流,但要先刷新它。
abstract  void flush()://刷新该流的缓冲。刷新后可以继续使用该流。
void write(char[] cbuf)://写入字符数组。 
abstract  void write(char[] cbuf, int off, int len)://写入字符数组的某一部分。
void write(int c)://写入单个字符。
void write(String str)://写入字符串。
void write(String str, int off, int len)://写入字符串的某一部分。

b) Reader:

字段

protected  Object lock://用于同步针对此流的操作的对象。

构造方法:

protected  Reader()://创建一个新的字符流 reader,其重要部分将同步其自身的 reader。  
protected  Reader(Object lock)://创建一个新的字符流 reader,其重要部分将同步给定的对象。

方法:

abstract  void close()://关闭该流并释放与之关联的所有资源。
void mark(int readAheadLimit)://标记流中的当前位置。
boolean markSupported()://判断此流是否支持 mark() 操作。
int read()://读取单个字符。一次读一个字符。而且会自动向下读取。 
int read(char[] cbuf)://将字符读入数组。
abstract  int read(char[] cbuf, int off, int len) ://将字符读入数组的某一部分。
int read(CharBuffer target)://试图将字符读入指定的字符缓冲区。 
boolean ready()://判断是否准备读取此流。  
void reset()://重置该流。
long skip(long n)://跳过字符。

2、IO异常处理

FileWriter fw = null;//在外面建立引用,在try内进行初始化
try {
    fw = new FileWriter("demo.txt");
    fw.write("abcdef");
}catch (IOException e) {
    System.out.println(e.toString());
}finally {
    try {
        if(fw!=null)
            fw.close();
    }catch (IOException e) {
        System.out.println(e.toString());
    }
}

3、 FileWriter 和 FileReader

a) FileWriter

FileWriter是Writer的子类。
构造函数:

FileWriter(File file)//根据给定的 File 对象构造一个 FileWriter 对象。
FileWriter(File file, boolean append)//根据给定的 File 对象构造一个 FileWriter 对象。
FileWriter(FileDescriptor fd)//构造与某个文件描述符相关联的 FileWriter 对象。
FileWriter(String fileName)//根据给定的文件名构造一个 FileWriter 对象。
FileWriter(String fileName, boolean append)//根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象。

写入实例:

private static void writerFile() {
    File file = new File("D:\\hello.txt");
    try {
        FileWriter fileWriter = new FileWriter(file);
        fileWriter.write("Hello");
        System.out.println("写入成功!");
        fileWriter.flush();
        fileWriter.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

b) FileReader

FileReader:它是Reader的子类。
构造函数:

FileReader(File file)//在给定从中读取数据的 File 的情况下创建一个新 FileReader。
FileReader(FileDescriptor fd)//在给定从中读取数据的 FileDescriptor 的情况下创建一个新 FileReader。
FileReader(String fileName)// 在给定从中读取数据的文件名的情况下创建一个新 FileReader。

第一种取出:单个字符的读取

public static void FileReader(){
    File file = new File("D:\\hello.txt");
    FileReader fileReader;
    try {
        fileReader = new FileReader(file);
        int ch = 0;
        while ((ch = fileReader.read()) != -1) {
            System.out.println("ch="+(char)ch);
        }
        fileReader.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}  
//read():一次读一个字符。而且会自动向下读取

第二种取出:定义缓冲区的读写

public static void FileReader(){
    File file = new File("D:\\hello.txt");
    FileReader fileReader;
    try {
        fileReader = new FileReader(file);
        char[] buf = new char[1024];
        int len = 0;
        while((len = fileReader.read(buf)) != -1){
            System.out.println(new String(buf, 0, len));
        }
        fileReader.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}  
//read(char[]):该read(char[])返回的是读到的字符个数。
//String(char[] value, int offset, int count):分配一个新的 String,它包含取自字符数组参数一个子数组的字符。

4、字符流的缓冲区

BufferedWriter和BufferedReader:缓冲区的出现提高了数据的读写效果,它必须结合流使用,并且在流的基础上对流的功能进行增强。

a) BufferedWriter:

  • 缓冲区的出现是为了提高流的操作效率而出现。
  • 创建缓冲区之前,必须要先有流对象。
  • 记住只要用到缓冲区,就要记得刷新。
  • 其实关闭缓冲区,就是在关闭缓冲区中的流对象。

构造方法:

BufferedWriter(Writer out)://创建一个使用默认大小输出缓冲区的缓冲字符输出流。
BufferedWriter(Writer out, int sz)://创建一个使用给定大小输出缓冲区的新缓冲字符输出流。

特有方法:

void newLine()://写入一个行分隔符。该缓冲区中提供了一个跨平台的换行符。 在Windows系统下换行符是/r/n,而在Linux系统下换行符是/n。

代码示例:

private static void bufferedWriterFile() {
    // 自带flush方法
    BufferedWriter writer;
    try {
        writer = new BufferedWriter(new FileWriter("D:\\hello.txt"));
        writer.write("你好");
        writer.newLine();
        writer.write("世界");
        writer.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

b) BufferedReader

构造方法:

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

特有方法:

boolean markSupported()://判断此流是否支持 mark() 操作(它一定支持)。
String readLine()://读取一个文本行。
boolean ready()://判断此流是否已准备好被读取。
void reset()://将流重置到最新的标记。
long skip(long n):// 跳过字符。

代码示例:

private static void bufferedReaderFile() {
    BufferedReader reader;
    try {
        reader = new BufferedReader(new FileReader("D:\\hello.txt"));
        String line = null;
        while((line = reader.readLine())!= null){
            System.out.println(line);
        }
        reader.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
    
}

c) LineNumberReader

它是BufferedReader 的一个子类。属于功能增强,带着行号。
构造方法:

LineNumberReader(Reader in)://使用默认输入缓冲区的大小创建新的行编号 reader。
LineNumberReader(Reader in, int sz)://创建新的行编号 reader,将字符读入给定大小的缓冲区。

特有方法:

int getLineNumber()://获得当前行号。
void setLineNumber(int lineNumber)://设置当前行号。

读取文件的内容,并且带上行号:

private static void readerFileWithLine() {
    LineNumberReader reader;
    try {
        reader = new LineNumberReader(new FileReader("D:\\hello.txt"));
        String line = null;
        while((line = reader.readLine()) != null){
            System.out.println(reader.getLineNumber() + ":" + line);
        }
        reader.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

###################################

相关文章:

  • 2021-10-29
  • 2021-09-24
  • 2021-07-03
  • 2022-01-13
  • 2022-03-07
  • 2021-06-01
  • 2021-12-07
猜你喜欢
  • 2021-06-07
  • 2021-06-22
  • 2021-12-02
  • 2022-02-03
  • 2021-10-02
  • 2021-10-14
  • 2021-04-20
相关资源
相似解决方案