java基础知识回顾之javaIO类---FileWriter和FileReader

FileWriter类的构造方法定义如下:

1.public FileWriter(File file)throws IOException

字符流的操作比字节流操作好在一点,就是可以直接输出字符串了,不用再像之前那样进行转换操作了。

package com.lp.ecjtu;

import java.io.FileWriter;
import java.io.IOException;

public class FileWriterDemo {

    /**
     * 字符流,创建一个FileWriter对象,该对象一被初始化,就必须明确操作的文件,将
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        //而且该文件被创建到指定目录下,如果该目录下面已经有同名的文件,将被覆盖
        FileWriter fw = new FileWriter("Demo.txt");
        //调用write方法,将字符串写入到流当中去,也就是缓冲区中
        fw.write("abcefg");
        //刷新流对象中的缓冲中的数据
        //将数据刷到指定的文件当中去
        fw.flush();
        //fw.close();//如果用close,则流关闭,后面的写入流将不会被执行
        fw.write("3423");
        fw.flush();
    }

}

输出结果:

在Demo.txt文件中写入了:abcefg3423

2.public FileWriter(File file,boolean append)throws IOException 用FileWriter的另一种构造方法,传递一个true参数,代表不覆盖已有的文件。并在已有文件进行续写
package com.lp.ecjtu;

import java.io.FileWriter;
import java.io.IOException;

/**
 * 对已有文件的续写
 * @author Administrator
 *
 */
public class FileWriterDemoApend {

    /**
     * 创建一个FileWriter对象,该对象一被初始化,就必须明确操作的文件
     * @param args
     * @throws IOException
     * @throws IOException
     */
    public static void main(String[] args){
        FileWriter fw = null;
        try{
            //用FileWriter的另一种构造方法,传递一个true参数,代表不覆盖已有的文件。并在已有文件进行续写
            fw = new FileWriter("Demo.txt",true);
            //调用write方法,将字符串写入到流当中去,也就是缓冲区中
            fw.write("234334\r\n谢谢");

        }catch (IOException e) {
            e.printStackTrace();
        }finally{
                try {
                    if(fw != null){
                        fw.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
}

输出结果:在文件中续写字符串:

结果变为

abcefg3423234334

谢谢

FileReader的构造方法定义如下:

public FileReader(File file)throws FileNotFoundException

FileReader(String fileName) 在给定从中读取数据的文件名的情况下创建一个新 FileReader

 

例子:一个字符一个字符读取文件:

package com.lp.ecjtu;

import java.io.FileReader;
import java.io.IOException;

public class FileReaderDemo {

    /**
     * 怎样去捕获IO异常,标准的捕获异常方式
     * 下面的1,2,3都会抛出异常,可能发生的异常有下面三个:
     * 1.java.io.FileNotFoundException //关联的文件不存在
     * 2.java.lang.NullPointerException //FileReader可能没有new
     * 3.IOException //操作IO流的时候抛出的异常
     */
    public static void main(String[] args) {
        //创建一个文件读取流对象,和指定的名称的文件相关联
        //要保证该文件是已经存在的,如果不存在,会发生FileNotFoundException
        FileReader fr = null;
        try {
                fr = new FileReader("Demo.txt");

             //一次读取一个字符,而且会自动往下读
            /* int char1 = fr.read();
            System.out.println("char1="+(char)char1);//char1=a
            int char2 = fr.read();
            System.out.println("char2="+(char)char2);//char2=b
            int char3 = fr.read();
            System.out.println("char3="+(char)char3);//char3=c
            int char4 = fr.read();
            System.out.println("char4="+(char)char4);//char4=e
            int char5 = fr.read();
            System.out.println("char5="+(char)char5);
            int char6 = fr.read();
            System.out.println("char6="+(char)char6);
            int char7 = fr.read();
            System.out.println("char7="+char7);*/
            //如果达到流的末尾,则返回-1,-1为数据的分割符
            int ch = 0;
            while((ch=fr.read())!= -1){
                System.out.print((char)ch);
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            if(fr != null){
                try {
                    fr.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

        }
    }

}

输出结果:

abcefg3423234334
谢谢

以字符数组的形式读取:

使用:

public int read(char[] cbuf)
         throws IOException
package com.lp.ecjtu;

import java.io.FileReader;
import java.io.IOException;

public class FileReaderDemo2 {

    /**
     * @param args
     */
    public static void main(String[] args) throws IOException{
        //创建一个文件读取流对象,和指定的名称的文件相关联
        //要保证该文件是已经存在的,如果不存在,会发生FileNotFoundException
        FileReader fr = new FileReader("Demo2.txt");

        //定义一个字符数组,用于存储读到的字符
        //char[] ch = new char[1024];
        //返回读到的字符个数
        //每次读3字符个放到字符数组缓冲区当中,一次性存储3个放到数组当中,然后在一次性读取出来
        char[] ch = new char[3];
        int num = fr.read(ch);
        System.out.println("num="+num+"----"+new String(ch));
        int num1 = fr.read(ch);
        System.out.println("num1="+num1+"----"+new String(ch));
        int num2 = fr.read(ch);
        System.out.println("num2="+num2+"----"+new String(ch));
        int num3 = fr.read(ch);
        System.out.println("num3="+num3+"----"+new String(ch));

        int nu = 0;
        while((nu=fr.read(ch)) !=-1){
            System.out.println(new String(ch,0,nu));
        }

        fr.close();
    }

}

输出:demo2中存储的字符为:abcdefg

num=3----abc
num1=3----def
num2=1----gef
num3=-1----gef

以字符数组的的形式循环读取java文件

package com.lp.ecjtu;

import java.io.FileReader;
import java.io.IOException;

public class FileReaderJava {

    /**
     * @param args
     * 读取一个java文件,并且打印到控制台上
     */
    public static void main(String[] args) throws IOException{
        //创建一个文件读取流对象,和指定的名称的文件相关联
        //要保证该文件是已经存在的,如果不存在,会发生FileNotFoundException
        FileReader fr = new FileReader("FileReaderDemo.java");

        //定义一个字符数组,用于存储读到的字符
        char[] ch = new char[1024];
        //返回读到的字符个数
        int num= 0;
        while((num=fr.read(ch)) !=-1){
            System.out.print(new String(ch,0,num));
        }

        fr.close();
    }

}

文件的复制:将一个盘的文件复制到另一个盘:

package com.lp.ecjtu;

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class CopyTest {

    /**将C盘一个文本文件复制到D盘
     * @param args
     * 原理:其实就是将C盘下的文件数据存储到D盘的文件当中
     * 步骤:
     * 1.在D盘创建一个文件,用于存储C盘文件的数据
     * 2.定义读取流和C盘文件相关联
     * 3.通过不断的读写完成数据的存储
     * 4.关闭资源
     * @throws IOException
     */

    public static void copy1() throws IOException{
        //创建要写出到哪个文件,也就是目的地:为硬盘文件
        FileWriter fw = new FileWriter("testjava.txt");
        //与要拷贝的文件关联,也就是读取要拷贝的文件 源:为硬盘文件
        FileReader fr = new FileReader("FileReaderDemo.java");
        int ch=0;
        //从c盘  读一个,就往D盘复制一个
        while((ch = fr.read())!= -1){
            fw.write(ch);
        }
        fw.close();
        fr.close();
    }
    /**
     * 写入数组缓存中,一次读出,一次性写入
     * @param args
     * @throws IOException
     */
    public static void copy2(){
        FileWriter fw = null;
        FileReader fr = null;

        try {
            fw = new FileWriter("test2.txt");
            fr = new FileReader("FileReaderDemo.java");
            char[] buf = new char[1024];
            int len = 0;//表示buf数组的长度
            while((len = fr.read(buf))!=-1){
                fw.write(buf,0,len);
                System.out.println(buf);
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            try {
                if(fw != null){
                    fw.close();
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            try {
                if(fr != null){
                    fr.close();
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }
    public static void main(String[] args) throws IOException {
        copy1();
        copy2();
    }

}

总结:copy1的效率低于copy2,因为copy2一次性把数组复制到数组缓冲区,然后在写入流中。

时间: 2024-08-02 06:47:55

java基础知识回顾之javaIO类---FileWriter和FileReader的相关文章

java基础知识回顾之javaIO类--File类应用:获取指定目录下面的指定扩展名的文件,将文件的绝对路径写入到目的文件当中

/** * File文件综合应用 * 需求:获取指定目录下面,指定扩展名的文件,将文件的绝对路径写到文本文件当中. *  * 思路:1.需要深度遍历.--递归 * 2.遍历的过程中过滤指定扩展名的文件--过滤器FileNameFilter,将文件存入容器中 * 3.将容器中的内容遍历,写入到指定文件中 * */ 代码:  FilenameFilter 过滤器: package com.lp.ecjtu.File.filter; import java.io.File; import java.i

java基础知识回顾之javaIO类--管道流PipedOutputStream和PipedIutputStream

管道流(线程通信流):管道流的主要作用是可以进行两个线程间的通讯,分为管道输出流(PipedOutputStream).管道输入流(PipedInputStream),如果想要进行管道输出,则必须要把输出流连在输入流之上.如图所示: 1.管道输入流应该连接到管道输出流 ,输入流和输出流可以直接连接       2.使用多线程操作,结合线程进行操作.通常由某个线程从管道输入流中(PipedInputStream)对象读取.          并由其他线程将其写入到相应的端到输出流中.不能使用单线程

java基础知识回顾之javaIO类--RandomAccessFile类

java.io 类 RandomAccessFile java.lang.Object java.io.RandomAccessFile1.该类不是IO流中的子类.2.该类既能读又能写.3.该对象内部分装了一个字节数组,通过指针可以操作数组中的元素.4.其实该对象就是将字节输入流和输出流进行了封装.5.该对象只能对文件操作,目的和源只能是文件对象.通过看构造方法可以看得出来.RandomAccessFile(File file, String mode) RandomAccessFile(Str

java基础知识回顾之javaIO类--内存操作流ByteArrayInputStream和ByteArrayOutputSteam(操作字节数组)

直接看代码: package cn.itcast.io.p6.bytestream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; public class ByteArrayStreamDemo { /** * @param args * @throws IOException * 特点 * 1.内存操作流 * 2.不操作底层资源,不调

java基础知识回顾之javaIO类--File类应用:删除带内容的目录

/** * 深度删除一个带内容的目录 * 原理:必须从里往外删除,需要深度遍历 * @author Administrator * */ public class FileDeleteList { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub File dir = new File("E:\\复件 demodir"); removedir(

java基础知识回顾之javaIO类--File类应用:递归深度遍历文件

代码如下: package com.lp.ecjtu.File.FileDeepList; import java.io.File; public class FileDeepList { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub File dir = new File("E:"+File.separator+"demodir

java基础知识回顾之javaIO类--File类应用:过滤器接口FilenameFilter和FileFilter

FilenameFilter和FileFilter都是用来过滤文件,例如过滤,以.jpg或者.java结尾的文件,通过看他们的源码:通过使用File类中String[] list(FilenameFilter filter)或者public File[] listFiles(FileFilter filter)方法,把FilenameFilter或者FileFilter接口对象作为参数传入,通过实现接口里面的 boolean accept(File dir, String name) 或者boo

java基础知识回顾之javaIO类--File类

File类是对文件系统中文件以及目录(文件夹)进行封装的对象,可以通过面向对象的思想来操作文件和目录(文件夹).File类保存文件或目录的各种元素的信息,包括文件名,文件长度,最后修改日期,是否可读,获取当前文件的路径名,判断指定文件是否存在,获得当前文件的列表,创建.删除文件目录等方法. /**     * 构造方法:File f = new File("file.txt");//file.txt 相对路径     *       File f1 = new File("c

java基础知识回顾之javaIO类---BufferedReader和BufferedWriter

使用了装饰设计模式:此类的设计是为了提高流操作数据的效率.思想就是定义容器将数据进行临时存储,对于缓冲区对象,其实就是将这个容器进行了分装,并提供了更高效的操作方法. 原理: 1,使用流的read方法从源中读取一批数据存储到缓冲区的数组中. 2,通过计数器记录住存储的元素个数. 3,通过数组的角标来获取数组中的元素(从缓冲区中取数据). 4,指针会不断的自增,当增到数组长度,会归0.计数器会自减,当减到0时,就在从源拿一批数据进缓冲区. BufferReader: package com.lp.