博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java:IO流之字符流Reader、Writer详解
阅读量:6822 次
发布时间:2019-06-26

本文共 5791 字,大约阅读时间需要 19 分钟。

java.io包中:字符流
  字符流的两个抽象基类:
  Reader         Writer
 
文件的读取:Reader抽象类(java.io包中)
直接子类的构造方法:
FileReader(File file) 
            在给定从中读取数据的 File 的情况下创建一个新 FileReader。 
FileReader(FileDescriptor fd) 
            在给定从中读取数据的 FileDescriptor 的情况下创建一个新 FileReader。 
FileReader(String fileName) 
            在给定从中读取数据的文件名的情况下创建一个新 FileReader。 
 
int read()读取单个字符  
   注意:作为整数读取的字符,范围在0到65535之间(0x00-0xffff),如果已到达流的末尾,则返回 -1 
int read(char[] cbuf)  将字符读入数组。
   注意:读取的字符数,如果已到达流的末尾,则返回 -1 
//例子1:使用read()读取单个字符并输出
import java.io.*;class FileReaderDemo{    public static void sop(Object obj)    {        System.out.print(obj);    }    public static void main(String[] args)throws IOException    {      //创建一个文件读取流对象,和指定名称的文件相关联起来。      //要保证该文件是已经存在的。如果不存在,会发生异常,即FileNotFoundException          FileReader fr = new FileReader("F:\\myfile\\test.txt");            //调用读取流对象的read方法。      //read方法:一次读取一次字符,而且会自动往后面读取字符。      int ch = 0;      while((ch=fr.read())!=-1)      {          sop((char)ch);      }          /*     while(true)      {        int ch = fr.read();        if(ch==-1)            break;         sop((char)ch);  //读取文件中的一个字符       }    */      fr.close();    }}
//例子2:使用read(char[] cbuf)  将字符读入数组再输出
import java.io.*;class FileReaderDemo2{    public static void sop(Object obj)    {        System.out.print(obj);     }    public static void main(String[] args)throws IOException    {      //创建一个文件读取流对象,和指定名称的文件相关联起来。      //要保证该文件是已经存在的。如果不存在,会发生异常,即FileNotFoundException          FileReader fr = new FileReader("F:\\myfile\\test.txt");            //定义一个字符数组,用于存储读取的字符      char[] buf = new char[1024];      int num = 0;      while((num = fr.read(buf))!=-1)//num = fr.read(buf)返回是读取的字符个数,如果已到达流的末尾,则返回 -1       {        //String(char[] value, int offset, int count) 分配一个新的 String,它包含取自字符数组参数一个子数组的字符。        String str = new String(buf,0,num);        sop(str);      }      fr.close();          }}
 
那么再学习字符写入流的特点:Writer 抽象类(java.io包中)    
FileWriter(File file)   根据给定的 File 对象构造一个 FileWriter 对象。
既然IO流是用于操作数据的,那么数据的最常见体现形式是:文件
那么先以操作文件为主来显示。
 
需求:在硬盘上,创建一个文件夹并写入一些文字数据。后缀名是父类名,前缀名是该流对象的功能。
找到一个专门用于操作文件的Writer子类对象。
 
public abstract void close()
       throws IOException关闭此流,但要先刷新它。在关闭该流之后,再调用 write() 或 flush() 将导致抛出 IOException。
  关闭以前关闭的流无效。
abstract  void flush() 
          刷新该流的缓冲。
//例子3:
import java.io.*;class FileWriterDemo{    public static void main(String[] args) throws IOException    {        //第一步:        //创建一个FileWriter对象,该对象一被初始化就必须有明确的被操作的文件,而且该文件会被创建到指定的目录下        //如果该目录下已有同名文件,将会被覆盖。其实该步就是要明确数据要存放的目的地。        FileWriter fw = new FileWriter("F:\\myfile\\demo.txt");                        //第二步:        //调用父类共性方法write方法,将数据写入到了流当中。        fw.write("asjdsjdfkskidkf,fdhjsdkjfdsk,dfhjdskj");                //第三步:        //调用父类共性方法flush方法,刷新流对象中的缓冲中的数据,将数据刷新到目的地中。        fw.flush();                //可以接着往目的地中写入数据        fw.write("xiayuanquan");        fw.flush();                //父类中的共性方法close方法,关闭流资源,但是关闭之前会刷新一次内部的缓冲中的数据,将数据刷新到目的地中去。        //和flush的区别:flush刷新后,流可以继续使用;而close刷新后,流会关闭,无法继续使用。        fw.write(" aaaaaaaaaaaaaa");        fw.close(); //Stream closed        //fw.write("xxxx"); //流已关闭,此时不能再向目的地的文件中写入数据            }}
 
使用字符流读取和写入数据时,可能会出现流异常的情况,例如文件不存在、路径错误等,此时,需要我们对异常进行捕获并处理。
//例子4:
import java.io.*;class FileWriterExceptionDemo{    public static void main(String[] args)    {        FileWriter fw = null;        try        {            fw = new FileWriter("F:\\myfile\\Exception.txt");//创建目标文件                    fw.write("my name is xiayuanquan!"); //往流里写入数据内容        }        catch(IOException ie)        {            System.out.println(ie.toString());        }        finally        {            try            {              if(fw!=null)                    fw.close(); //先刷新流,将流中的数据内容刷到目标文件中,然后关闭流资源            }            catch(IOException ie)            {            System.out.println(ie.toString());            }        }    }}
 
拓展:当用户想把数据写入同一个文件,可是文件中已经存在内容时,那么新写入的数据会替换之前的数据。此时,这不是用户所希望的,针对这种情况,我们可以将新写入的内容在文件内容后面续写即可。api中就提供了一个方法如下:
对已有文件数据内容的续写:
FileWriter(File file, boolean append) 
          根据给定的 File 对象构造一个 FileWriter 对象。
//例子5:
import java.io.*;class FileWriterDemoappend{    public static void main(String[] args)    {        FileWriter fw = null;        try        {            //传递一个ture参数,代表不覆盖已有的文件。并在已有文件的末尾处进行文件的续写。            fw = new FileWriter("F:\\myfile\\demo.txt",true);            fw.write(",,,wei-zhong-hua-jue-qi-er-du-shu");            fw.write("\r\nabc=abc");//'\r\n'代表换行,然后接着续写数据        }        catch(IOException e)        {            System.out.println(e.toString());        }        finally        {            try            {                if(fw!=null)                    fw.close();            }            catch(IOException e)            {            System.out.println(e.toString());            }        }    }}
 
综合练习:将相同目录下一个文本文件赋值到另一个文本文件中。
(例如:将F:\\myfile\\practice.txt--------->F:\\myfile\\test.txt)
思路:第一步,创建读取流与F:\\myfile\\practice.txt相关联。
         第二步,将F:\\myfile\\practice.txt中数据内容全部读入流中,并放在定义的数组内,然后关闭资源。
         第三部,创建写入流与F:\\myfile\\test.txt相关联,并设置续写功能的布尔值为true;
         第四部,将第二部定义的数组的数据内容全部写入F:\\myfile\\test.txt文件中,然后关闭资源。
//例子6:
import java.io.*;class CopyText{    public static void main(String[] args)throws IOException    {          FileReader fr = new FileReader("F:\\myfile\\practice.txt");        FileWriter fw = new FileWriter("F:\\myfile\\test.txt",true);                //第一种方式:(先全部读完数据后存入缓冲区,再一次性续写入目标文件中)        int num=0;        char[] buf = new char[1024];        while((num = fr.read(buf))!=-1)        {            String str = new String(buf,0,num);            fw.write("\r\n"+str);                // fw.write(buf,0,num);            fw.close();        }        fr.close();                /*        //第二种方式:(每次读一个数据,就往目标文件中写入一个数据)        int num = 0;        while((num = fr.read())!=-1)        {            fw.write(num);        }        fw.write("\r\n");        fw.close();        fr.close();        */    }}

 

 
 

转载地址:http://jvozl.baihongyu.com/

你可能感兴趣的文章
html meta中的viewport指令
查看>>
windows 2008的安装
查看>>
Unity3D研究院之手游开发中所有特殊的文件夹(assetbundle与Application.persistentDataPath)...
查看>>
[DeviceOne开发]-手势动画示例分享
查看>>
《Activiti实战》读书笔记——5.1.4
查看>>
Linux文件管理类命令
查看>>
Kuerbernetes 1.11 二进制安装
查看>>
SpringMVC异步处理之@Async(附源代码 - 单元测试通过)
查看>>
undefined reference to 'pthread_setspecific '
查看>>
MediaBrowserService 音乐播放项目--IT蓝豹
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
路由器的密码恢复
查看>>
linux yum命令详解
查看>>
java 多线程暂停与恢复:suspend,resume
查看>>
Jquery 获得<input type="text" id="test">中的value
查看>>
《Android开发从零开始》——38.WebView控件学习
查看>>
Windows Server 2012 Hyper-V PK VMware 性能
查看>>
IOS 手写控件 简单播放器 AVFoundation音乐播放
查看>>
FPGA设计——图像处理(均值滤波)
查看>>