使用字符流的文件IO

尽管字节文件处理是最常见的,但是使用字符流进行IO操作也是可能的.字符流的优势是他们可以字节操作unicode字符.因此,如果想存储Unicode文本,字符流肯定是最好的选择.一般来说,如果要执行基于字符的文件IO,就要使用FileReader和FileWriter类.
1.使用FileWriter
FileWriter创建一个可以用于写入文件的Writer.他的最常用的构造函数如下所示:
FileWriter(String fileName) throws IOException
FileWriter(String fileName,boolean append) throws IOException
这里fileName是文件的完整路径名,如果append为true,那么输出被添加至文件的末尾.否则,文件被重写.两个构造函数都会在发生错误时抛出IOException.FileWriter是从OutputStreamWrite和Writer派生而来的.因此,他可以使用这些类定义的方法.
下面是一个简单的键盘-磁盘实用程序,他读取从键盘输入的文本行,并且把他们写入名为test.txt的文件中.文本会一直读取,直到用户输入单词stop为止.他使用FileWriter输出到文件.
    public static void main(String args[])
    throws IOException
    {
     String str;
     BufferedReader br = new BufferedReader(
             new InputStreamReader(System.in)
             );
     
     try(FileWriter fw = new  FileWriter("test.txt"))
     {
         do {
             System.out.print(":");
             str = br.readLine();
             if(str.compareTo("stop") == 0)  break;
             str = str+"\r\n";
             fw.write(str);
         } while(true);
     } catch(IOException exc) {
         System.out.println("IO ERROR");
     }
    }
2.使用FileReader
FileReader类创建了一个可以用于读取文件内容的Reader,他的最常用的构造函数如下所示:
FileReader(String fileName) throws FileNotFoundException
这里,fileName是文件的完整路径名,如果文件不存在,他就会抛出一个FileNotFoundException.FileReader是由InputStreamReader和Reader派生而来的,因此,他可以访问这些类定义的方法.
下面的程序创建了一个简单的磁盘-屏幕实用程序,即从一个名为test.txt的文本文件读取内容,然后在屏幕上显示其内容:
    public static void main(String args[])
    throws IOException
    {
     String s;
     
     try(BufferedReader br = new  BufferedReader(new FileReader("test.txt")))
     {
         while((s = br.readLine()) != null)
         {
             System.out.println(s);
         }
     } catch(IOException exc) {
         System.out.println("IO ERROR");
     }
    }
在本例中,注意FileReader包含在一个BufferedReader中,这使他可以使用readLine(),而且关闭BufferReader会自动关闭文件.
问:我听说有另一个IO包称为NIO,你能告诉我他的一些情况吗?
答:NIO是一种新的IO,是在JDK1.4中加入到Java语言的,他支持基于通道的IO操作方法,NIO类包含在java.nio及其子包(如java.nio.channels和java.nio.charset)中.
NIO构建于两个基础元素之上:缓冲区(buffer)和通道(channel).缓冲区存储数据.通道则作为通向一台IO设备(如文件或套接字)的开放连接.总之,使用新IO系统,可以获得与一台IO设备连接的通道和存储数据的缓冲区.这样,可以根据需要对缓冲区输入或输出数据.
NIO使用的其他两个实体是charset和selector.charset定义了字节映射为字符的方法.可以使用编码器将字符序列编码为字节,也可以使用解码器把字节序列解码为字符.selector支持基于键盘的无阻塞多重IO.换言之,selector可使你通过多重通道来执行IO操作.selector最适用于支持套接字的通道.
从JDK7开始,NIO被大大增强了,以至于现在经常会使用NIO.2这个词.改进之处包括增加了3个新包:Java.nio.file,java.nio.file.attribute和java.nio.spi;增加了一些新的类,接口和方法;并直接支持流IO.这些改进扩展了NIO的用途,特别是在文件方面.
NIO类不会代替java.io中定义的IO类,相反,NIO类设计用于做为标准IO系统的补充,以提供另一种在某些情况下更合适的IO方法.