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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,718评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,683评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,207评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,755评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,862评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,050评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,136评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,882评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,330评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,651评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,789评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,477评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,135评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,864评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,099评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,598评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,697评论 2 351

推荐阅读更多精彩内容