欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java IO流-字符流

程序员文章站 2022-04-03 07:57:16
...

2017-11-05 18:34:39

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

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

Java IO流-字符流

 

  • 字符流

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

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

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

            Reader

* OutputStreamWriter

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

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

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

**构造方法

Java IO流-字符流

**常用方法

Java IO流-字符流

在写入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。

**构造方法

Java IO流-字符流

**常用方法

Java IO流-字符流

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

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

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

 

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

字符缓冲流:BufferedWriter,BufferedReader。

* BufferedWriter

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

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

**构造方法

Java IO流-字符流

**常用方法

Java IO流-字符流

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从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。

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

*构造方法

Java IO流-字符流

**常用方法

Java IO流-字符流

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:可以直接使用路径进行初始化

**构造方法

Java IO流-字符流

**常用方法

Java IO流-字符流

 Java IO流-字符流

Java IO流-字符流

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

 

上一篇: HIbernate映射

下一篇: 第五章队列