Java IO

字符流和字节流:

字节流两个基类:InputStream OutputStream
字符流两个基类:字符流在内部融合编码表,字符指定编码格式,gbk,unicode,utf-8。
Reader Writer
先学习一下字符流的特点。
既然IO流是用于操作数据的,那么数据的最常见体现形式是:文件。
那么先以操作文件为主来演示。

需求:在硬盘上,创建一个文件并写入一些文字数据。
找到一个专门用于操作文件的Writer子类对象。FileWriter。后缀名是父类名。前缀名是该流对象的功能。

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

public class FileWriterDemo {
    public static void main(String[] args) throws IOException
    {
        //创建一个FileWriter对象。该对象一被初始化就必须要明确被操作的文件。
        //而且该文件会被创建到指定目录下。如果该目录下已有同名文件,将被覆盖。
        //其实该步就是在明确数据要存放的目的地。
        FileWriter fw = new FileWriter("demo.txt");
        //调用write方法,将字符串写入到流中。
        fw.write("abcde");
        //刷新流对象中的缓冲区中的数据。
        //将数据刷到目的地中。
        //fw.flush();

        //关闭流资源,但是关闭之前会刷新一次内部的缓冲中的数据。
        //将数据刷到目的地中。
        //和flush区别:flush刷新后,流可以继续使用,close刷新后,会将流关闭。
        fw.close();;
    }
}
Snip20190914_3.png
import java.io.FileWriter;
import java.io.IOException;

public class FileWriterDemo {
    public static void main(String[] args) throws IOException
    {
        //创建一个FileWriter对象。该对象一被初始化就必须要明确被操作的文件。
        //而且该文件会被创建到指定目录下。如果该目录下已有同名文件,将被覆盖。
        //其实该步就是在明确数据要存放的目的地。
        FileWriter fw = new FileWriter("demo.txt");
        //调用write方法,将字符串写入到流中。
        fw.write("abcde");
        //刷新流对象中的缓冲区中的数据。
        //将数据刷到目的地中。
        //fw.flush();

        //关闭流资源,但是关闭之前会刷新一次内部的缓冲中的数据。
        //将数据刷到目的地中。
        //和flush区别:flush刷新后,流可以继续使用,close刷新后,会将流关闭。
        fw.close();;
        fw.write("haha");
    }
}
//输出 编译报错流资源已关闭不可写入。
Exception in thread "main" java.io.IOException: Stream closed
    at sun.nio.cs.StreamEncoder.ensureOpen(StreamEncoder.java:45)
    at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:118)
    at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:135)
    at java.io.OutputStreamWriter.write(OutputStreamWriter.java:220)
    at java.io.Writer.write(Writer.java:157)
    at FileWriterDemo.main(FileWriterDemo.java:21)

IO异常的处理方式

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

public class FileWriterDemo0 {
    public static void main(String[] args) {
        FileWriter fw = null;
        try{
            fw = new FileWriter("demo.txt");
            fw.write("abcdefg");
        }catch (IOException e)
        {
            System.out.println("catch:"+e.toString());
        }finally {
            try
            {
               if (fw!=null)
                   fw.close();
            }catch (IOException e)
            {
                System.out.println(e.toString());
            }
        }
    }
}

对已有文件的数据续写

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

public class FileWriterDemo1 {
    public static void main(String[] args) throws IOException
    {
        //传递一个true参数,代表不覆盖已有的文件。并在已有文件的末尾处进行数据续写。
        FileWriter fw = new FileWriter("demo.txt",true);
        fw.write("nihao\nxiexie");//windows系统换行是加\r\n
        fw.close();
    }
}
Snip20190914_4.png

IO流文本文件读取方式一

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

public class FileReaderDemo {
    public static void main(String[] args) throws IOException
    {
       //创建一个文件读取流对象,和指定名称的文件相关联。
       //要保证该文件是已经存在的,如果不存在,会发生异常FileNotFoundException
       FileReader fr = new FileReader("demo.txt");
       //调用读取流对象的read方法。
        //read():一次读一个字符。而且会自动往下读。
        while (true)
        {
            int chr = fr.read();
            if (chr == -1)
                break;;
                System.out.println("chr="+(char)chr);
        }
        
    }
}
//输出
chr=a
chr=b
chr=c
chr=d
chr=e
chr=f
chr=g

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

public class FileReaderDemo {
    public static void main(String[] args) throws IOException
    {
       //创建一个文件读取流对象,和指定名称的文件相关联。
       //要保证该文件是已经存在的,如果不存在,会发生异常FileNotFoundException
       FileReader fr = new FileReader("demo.txt");
       //调用读取流对象的read方法。
        //read():一次读一个字符。而且会自动往下读。
        int ch = 0;
        while ((ch=fr.read())!=-1)
        {
            System.out.println((char) ch);
        }
    }
}
//输出
a
b
c
d
e
f
g

IO流文本文件读取方式二

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

public class FileReaderDemo0 {
    public static void main(String[] args) throws IOException
    {
        FileReader fr = new FileReader("demo.txt");
        //定义一个字符数组。用于存储读到字符。
        //该read(char[])返回的是读到的字符个数。
        //num表示读到的字符个数
        char[] buf = new char[1024];
        int num = 0;
        while ((num=fr.read(buf))!=-1)
        {
            System.out.println(new String(buf,0,num));
        }
        fr.close();
    }
}
//输出
abcdefg

读取一个.java文件,并打印在控制台上。

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

public class FileReaderTest {
    public static void main(String[] args) throws IOException
    {
        FileReader fr = new FileReader("DateDemo.java");
        char[] buf = new char[1024];
        int num = 0;
        while ((num = fr.read(buf))!= -1)
        {
            System.out.println(new String(buf,0,num));
        }
        fr.close();
    }
}
//输出
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateDemo {
    public static void main(String[] args) {
        Date d = new Date();
        System.out.println(d);//打印的时间看不懂,希望有些格式

        //将模式封装到SimpleDateformat对象中
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日E hh:mm:ss");
        //调用format方法让模式格式化指定Date对象
        String time = sdf.format(d);
        System.out.println("time="+time);
    }
}
Snip20190914_5.png

将C盘一个文本文件复制到D盘

复制的原理:
其实就是将C盘下的文件数据存储到D盘的一个文件中。
步骤:

1.在D盘创建一个文件。用于存储C盘文件中的数据。

2.定义读取流和C盘文件关联。

3.通过不断的读写完成数据存储。

4.关闭资源。

复制方式一

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

public class CopyText {
    public static void main(String[] args) throws IOException
    {
        copy_1();
    }
    //从C盘读一个字符,就往D盘写一个字符。
    public static void copy_1() throws IOException
    {
        //创建目的地。
        FileWriter fw = new FileWriter("DateDemo_copy.txt");
        //与已有文件关联
        FileReader fr = new FileReader("DateDemo.java");
        int ch = 0;
        while ((ch=fr.read())!=-1)
        {
            fw.write(ch);
        }
        fw.close();
        fr.close();
    }
}
Snip20190914_10.png

Snip20190914_11.png

复制方式二

import com.sun.xml.internal.ws.policy.privateutil.PolicyUtils;

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

public class CopyText {
    public static void main(String[] args) throws IOException {
//        copy_1();
        copy_2();
    }

    public static void copy_2() throws IOException {
        FileWriter fw = null;
        FileReader fr = null;
        try {
            fw = new FileWriter("SystemDemo_copy.txt");
            fr = new FileReader("SystemDemo.java");
            char[] buf = new char[1024];
            int len = 0;
            while ((len = fr.read(buf)) != -1) {
                fw.write(buf, 0, len);
            }
        } catch (IOException e) {
            throw new RuntimeException("读写失败");
        } finally {
            try {
                if (fr != null)
                    fr.close();
                ;
            } catch (IOException e) {
                throw new RuntimeException("读写失败");
            } finally {
                if (fw != null)
                    try {
                        fw.close();
                    } catch (IOException e) {
                        throw new RuntimeException("读写失败");
                    }
            }
        }
    }

    //从C盘读一个字符,就往D盘写一个字符。
    public static void copy_1() throws IOException {
        //创建目的地。
        FileWriter fw = new FileWriter("DateDemo_copy.txt");
        //与已有文件关联
        FileReader fr = new FileReader("DateDemo.java");
        int ch = 0;
        while ((ch = fr.read()) != -1) {
            fw.write(ch);
        }
        fw.close();
        fr.close();
    }
}

另一种写法,两个if分别判断fw和fr是否为空。
import com.sun.xml.internal.ws.policy.privateutil.PolicyUtils;

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

public class CopyText {
    public static void main(String[] args) throws IOException {
//        copy_1();
        copy_2();
    }

    public static void copy_2() throws IOException {
        FileWriter fw = null;
        FileReader fr = null;
        try {
            fw = new FileWriter("SystemDemo_copy.txt");
            fr = new FileReader("SystemDemo.java");
            char[] buf = new char[1024];
            int len = 0;
            while ((len = fr.read(buf)) != -1) {
                fw.write(buf, 0, len);
            }
        } catch (IOException e) {
            throw new RuntimeException("读写失败");
        } finally {
            if (fr!=null)
                try {
                   fr.close();
                }catch (IOException e)
                {
                    throw new RuntimeException("读写失败");
                }
            if (fw!=null)
                try {
                fw.close();
                }catch (IOException e)
                {
                    throw new RuntimeException("读写失败");
                }
        }
    }

    //从C盘读一个字符,就往D盘写一个字符。
    public static void copy_1() throws IOException {
        //创建目的地。
        FileWriter fw = new FileWriter("DateDemo_copy.txt");
        //与已有文件关联
        FileReader fr = new FileReader("DateDemo.java");
        int ch = 0;
        while ((ch = fr.read()) != -1) {
            fw.write(ch);
        }
        fw.close();
        fr.close();
    }
}
Snip20190914_12.png

Snip20190914_16.png

你可能感兴趣的:(Java IO)