Java IO流-字符流

2017-11-05 18:34:39

Java中的IO流按数据类型分类分为两种,一是字节流,二是字符流。字符流的出现是为了简化文本数据的读入和写出操作。

如果操作的文件是文本文件,那么使用字符流会大大简化操作,但是如果什么都不知道,就用字节流。

  • 字符流

由于字节流中读取中文不是很方便,所以Java中提供了转换流,所以

字符流 = 字节流 + 编码表(By the way,‘a’=97,‘A’=65,‘0’=48)。

字符流也有两个抽象基类:Writer

            Reader

* OutputStreamWriter

OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集。

每次调用 write() 方法都会导致在给定字符(或字符集)上调用编码转换器。在写入底层输出流之前,得到的这些字节将在缓冲区中累积。可以指定此缓冲区的大小,不过,默认的缓冲区对多数用途来说已足够大。注意,传递给 write() 方法的字符没有缓冲。

为了获得最高效率,可考虑将 OutputStreamWriter 包装到 BufferedWriter 中,以避免频繁调用转换器。

**构造方法

**常用方法

在写入String时不指定偏移,则写入lenth的长度。

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;

public class Demo1 {
    public static void main(String[] args) throws IOException {
        OutputStreamWriter fout = new OutputStreamWriter(new FileOutputStream("" +
                "E:\text.txt","GBK"));
        fout.write("你好,Java");
     fout.flush(); fout.close(); } }

 注意这里的默认编码是GBK。正如上文所言,在最后输出前,会在缓冲区进行编码,所以需要调用flush清空缓冲区,将文件输出。但是close()前会自动刷新。

 * InputSteamReader

InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。

每次调用 InputStreamReader 中的一个 read() 方法都会导致从底层输入流读取一个或多个字节。要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节,使其超过满足当前读取操作所需的字节。

为了达到最高效率,可要考虑在 BufferedReader 内包装 InputStreamReader。

**构造方法

**常用方法

为了简化OutputStreamWriter和InputStreamReader的初始化工作,这两个类又提供了两个子类作为便捷类。即:

FileWriter类,初始化方法FileWriter(File file,bool append),注意FileWriter类虽然简化了构建,但是无法设置编码方式,需要使用父类OutputStreamWriter

FileReader类,初始化方法FileReader(File file),同样如果要设定解码方式,需要使用父类InputStreamReader

 ==>同样的,字符流为了高效读写也提供了

字符缓冲流:BufferedWriter,BufferedReader。

* BufferedWriter

BufferedWriter将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。

可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了。

**构造方法

**常用方法

import java.io.*;

public class Demo1 {
    public static void main(String[] args) throws IOException {
        BufferedWriter fout = new BufferedWriter(new FileWriter(
                "E:\text.txt"));
        fout.write("你好,Java");
        fout.close();
    }
}

* BufferedReader

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

可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。

*构造方法

**常用方法

readline()终于出来了~ 如果已到达流末尾,则返回 null。

    @Test
    public void demo() throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new FileReader(
                "E:\text.txt"));
        int ch;
        while((ch = bufferedReader.read())!=-1)
        {
            System.out.print((char)ch);
        }

        bufferedReader.close();
    }

==>一种特殊的输出流,打印流PrintWriter。

PrintWriter:向文本输出流打印对象的格式化表示形式。此类实现在 PrintStream 中的所有 print 方法。它不包含用于写入原始字节的方法,对于这些字节,程序应该使用未编码的字节流进行写入。

PrintStream 类不同,如果启用了自动刷新,则只有在调用 printlnprintfformat 的其中一个方法时才可能完成此操作,而不是每当正好输出换行符时才完成。这些方法使用平台自有的行分隔符概念,而不是换行符。

PrintWriter打印流的特点:

            A:只有写数据的,没有读数据的。

            B:可以操作任意类型的数据

            C:可以指定是否自动刷新

              D:可以直接使用路径进行初始化

**构造方法

**常用方法

 

  1. write()方法不能输出任意类型,能够输出任意类型的函数有println(),print()
  2. 如果启用了自动刷新,则只有在调用 printlnprintfformat 的其中一个方法时才可能完成此操作
  3. 构造方法中必须要选择启用自动刷新
import java.io.FileWriter;
import java.io.PrintWriter;

public class Demo5 {
    public static void main(String[] args) throws Exception {
        PrintWriter pw = new PrintWriter(new FileWriter("E://test.txt"),
                true);

        pw.println(100);
        pw.println("This is string.");
        pw.println(true);

        pw.close();
    }
}
原文地址:https://www.cnblogs.com/hyserendipity/p/7788153.html