Java:IO流之字符流Reader、Writer详解

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();
        */
    }
}
时间: 2024-08-07 15:28:31

Java:IO流之字符流Reader、Writer详解的相关文章

系统学习 Java IO (十五)----字符读写 Reader/Writer 其他子类

目录:系统学习 Java IO---- 目录,概览 跟踪行号的缓冲字符输入流 LineNumberReader LineNumberReader 类是一个 BufferedReader ,用于跟踪读取字符的行号.行号从 0 开始.每当 LineNumberReader 在包装的 Reader 返回的字符中遇到行终止符时,行号递增. 可以通过调用 getLineNumber() 方法获取当前行号,也可以通过调用 setLineNumber() 方法设置当前行号. 注意设置的行号不会改变实际的文件指

JAVA IO 字节流与字符流

文章出自:听云博客 题主将以三个章节的篇幅来讲解JAVA IO的内容 . 第一节JAVA IO包的框架体系和源码分析,第二节,序列化反序列化和IO的设计模块,第三节异步IO. 本文是第一节.       IO框架 从上图我们可以看出IO可以分为两大块 字节流和字符流 字节流是 InputStream 和 OutputStream 分别对应输入与输出 字符流是Reader和Writer分别对应输入与输出        ByteArrayInputStream  它字节数组输入流.继承于InputS

Java IO 字节流与字符流 (三)

Java的IO流分为字符流(Reader,Writer)和字节流(InputStream,OutputStream),字节流顾名思义字节流就是将文件的内容读取到字节数组,然后再输出到另一个文件中.而字符流操作的最小单位则是字符.可以先看一下IO流的概述: 下面首先是通过字符流对文件进行读取和写入: 1 package lib; 2 3 import java.io.BufferedReader; 4 import java.io.File; 5 import java.io.FileNotFou

Java IO 字节流与字符流 (二)

概述 IO流用来处理设备之间的数据传输 Java对数据的操作时通过流的方式 Java用于操作流的对象都在IO包中 流按操作的数据分为:字节流和字符流 流按流向不同分为:输入流和输出流 IO流常用基类 字节流的抽象基类 InputStream,OuputStream 字符流的抽象基类 Reader,Writer 注: 这些基类的子类都是以基类的名称结尾的,如FileReader,FileInputStream 字节流 字节流:以字符为导向的流 简单介绍一个例子,演示字节流对图片的复制 1: imp

java io 学习之三 字符流的缓冲区

 /** 字符流的缓冲区 缓冲区的出现,提高了对数据的读写效率 对应的类: BufferedWriter BufferedReader 缓冲区要结合流才可以使用 缓冲区是在流的基础上对流的功能进行增强 软件的优化可以分为:设计优化和性能优化 设计优化:对代码进行重构,让代码实现更强的可扩展性和灵活性,复用性. 提高性能最常用的的手段是:缓冲区  线程池 BufferedWriter 构造方法摘要 BufferedWriter(Writer out) 创建一个使用默认大小输出缓冲区的缓冲字符输

java.io 字节流与字符流及简单实例

java io是java中非常基础的知识点,对于通信和不涉及到数据库的项目java io应该是要经常使用.java io分为字节流和字符流,分清字节流和字符流的异同是掌握java io的起点. 字节流,最小单位是字节,通信协议中的X-MODEM和Y-MODEM协议传输单位就是字节流.java io中与字节流相关的主要类有:InputStream,OutputStream,FileInputStream,FileOutputStream.与字符流有关的主要类有:Writer,Reader,File

java IO(三):字符流

*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hljs-comment, .hljs-template_comment, .diff .hljs-header, .hljs-javadoc { color: #998; font-style: italic; } .hljs-keyword, .css .rule .hljs-keyword, .h

Java——IO类,字符流读数据

body, table{font-family: 微软雅黑} table{border-collapse: collapse; border: solid gray; border-width: 2px 0 2px 0;} th{border: 1px solid gray; padding: 4px; background-color: #DDD;} td{border: 1px solid gray; padding: 4px;} tr:nth-child(2n){background-co

黑马程序员——Java基础--IO流(一)---字符流和字节流

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.IO流的介绍及体系 IO流用来处理设备之间的数据传输.java对数据的操作是通过流的方式.java用于操作流的对象都在IO包中. 输入流和输出流相对于内存设备而言:将外设中的数据读取到内存中:输入.将内存中的数据写出到外设中:输出. 流按照操作数据分为两种:字节流和字符流. 字符流的由来:其实就是字节流读取文字字节数据后,不直接操作而是先查指定的编码表,获取对应的文字,再对这个文字进行操作

java io流(字符流) 文件打开、读取文件、关闭文件

java io流(字符流) 文件打开 读取文件 关闭文件 //打开文件 //读取文件内容 //关闭文件 import java.io.*; public class Index{ public static void main(String[] args) throws Exception{ //打开文件 //字符流方式打开 //字符流每次按一个字符读取 FileReader wj = new FileReader("D:/java/kj/javanew/src/Index.java"