2

Java知识点总结(JavaIO-字符流)

@(Java知识点总结)[Java, JavaIO]

[toc]

在程序中一个字符等于两个字节,那么 Java 提供了 Reader 和 Writer 两个专门操作字符流的类。

字符输出流:Writer

类定义如下:

public  abstract class Writer extends Object implements Appendable,Closeable,Flushable

Appendable 接口表示内容可以被追加,接收的参数是CharSequence,实际上 String 类就实现了此接口,所以可以直接通过此接口的方法向输出流中追加内容。

clipboard.png

clipboard.png

字符输入流:Reader

 
public  abstract class Reader extends Object implements Readable,Closeable


clipboard.png

clipboard.png

 
import  java.io.File;
import  java.io.FileReader;
import  java.io.FileWriter;
import  java.io.IOException;
import  java.io.Reader;
import  java.io.Writer;
 
public  class Demo04 {
 
  // 输出文件内容
  public static void test1() throws IOException {
    File file = new File("E:" + File.separator + "test.txt");
    Writer fw = new FileWriter(file);
 
    String str = "Hello world!";
    fw.write(str);
    fw.close();
 
  }
 
  // 追加文件内容
  public static void test2() throws IOException {
    File file = new File("E:" + File.separator + "test.txt");
    Writer fw = new FileWriter(file, true);
 
    String str = "\r\nHello world!";
    fw.write(str);
    fw.close();
 
  }
 
  // 从文件中读取内容
  public static void test3() throws IOException {
    File file = new File("E:" + File.separator + "test.txt");
 
    Reader fr = new FileReader(file);
    char[] c = new char[(int) file.length()];
    int len = fr.read(c); // 返回值是读取的字符数
    
    fr.close();
    System.out.println("内容是:"  + new String(c, 0, len));
 
  }
 
  // 使用循环方式读取内容
  public static void test4() throws IOException {
    File file = new File("E:" + File.separator + "test.txt");
 
    Reader fr = new FileReader(file);
    char[] c = new char[(int) file.length()];
    
    int temp = 0;
    int len = 0;
    while((temp = fr.read()) != -1){
      c[len] = (char)temp ;
      len ++;
    }
    
    fr.close();
    System.out.println("内容是:"  + new String(c,0,len));
 
  }
 
  // 强制性清空缓冲区
  public static void test5() throws IOException {
    File file = new File("E:" + File.separator + "test.txt");
    Writer fw = new FileWriter(fil e);
 
    String str = "Hello world!";
    fw.write(str);
    
    fw.flush();
    //fw.close();
 
  }
 
  public static void main(String[] args) {
    try {
      /*test1();
      test2();
      test4();*/
       test5();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
} 

字节流和字符流的区别

clipboard.png

字符流在操作时使用了缓冲区(内存),通过缓冲区再操作文件。

使用字节流写入文件,如果没有关闭字节流操作,文件依然存在内容,说明字节流是操作文件本身的。

使用字符流写入文件,如果没有关闭字符流操作,文件中没有任何内容,这是因为字符流使用了缓冲区,关闭字符流时会强制性的将缓冲区中的内容进行输出,但是如果程序没有关闭,则缓冲区的内容无法输出,所以文件中没有内容。

缓冲区:如果一个程序频繁地操作一个资源(如文件或数据库),则性能会很低,此时为了提升性能,就可以将一部分数据暂时读入到内存的一块区域之中,以后直接从此区域中读取数据即可,因为读取内存速度会比较快。

在字符流操作中,所有的字符都是在内存中形成的,在输出前会将所有的内容暂时保存在内存之中,所以使用了缓冲区暂存数据。

字节流比字符流更好,使用更广泛 。

所有的文件在硬盘或传输时都是以字节的方式进行的,包括图片等都是按字节的方式存储的,而字符是自由在内存中才会形成,所以在开发中,字节流使用较为广泛。


苏生
803 声望725 粉丝