Java知识点总结(JavaIO-字符流)
@(Java知识点总结)[Java, JavaIO]
[toc]
在程序中一个字符等于两个字节,那么 Java 提供了 Reader 和 Writer 两个专门操作字符流的类。
字符输出流:Writer
类定义如下:
public abstract class Writer extends Object implements Appendable,Closeable,Flushable
Appendable 接口表示内容可以被追加,接收的参数是CharSequence,实际上 String 类就实现了此接口,所以可以直接通过此接口的方法向输出流中追加内容。
字符输入流:Reader
public abstract class Reader extends Object implements Readable,Closeable
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(); } }}
字节流和字符流的区别
字符流在操作时使用了缓冲区(内存),通过缓冲区再操作文件。
使用字节流写入文件,如果没有关闭字节流操作,文件依然存在内容,说明字节流是操作文件本身的。
使用字符流写入文件,如果没有关闭字符流操作,文件中没有任何内容,这是因为字符流使用了缓冲区,关闭字符流时会强制性的将缓冲区中的内容进行输出,但是如果程序没有关闭,则缓冲区的内容无法输出,所以文件中没有内容。
缓冲区:如果一个程序频繁地操作一个资源(如文件或数据库),则性能会很低,此时为了提升性能,就可以将一部分数据暂时读入到内存的一块区域之中,以后直接从此区域中读取数据即可,因为读取内存速度会比较快。
在字符流操作中,所有的字符都是在内存中形成的,在输出前会将所有的内容暂时保存在内存之中,所以使用了缓冲区暂存数据。
字节流比字符流更好,使用更广泛 。
所有的文件在硬盘或传输时都是以字节的方式进行的,包括图片等都是按字节的方式存储的,而字符是自由在内存中才会形成,所以在开发中,字节流使用较为广泛。