java输出流_缓存_复制文件

本文内容

文件输出流、缓存、文件复制
outText();//使用字节输出字符串到txt文件(或追加内容)
appendText();//使用RandomAccessFile(此类还可以进行读操作)向文件中追加内容
charOutText();//使用字符输出流,将字符串输出到txt中
bufferCharOutText();//加缓存的、按字符输出(按字节输出一样)
readOutZip();//读取文件然后写入到另一个路径下(相当于拷贝)

package com.io.file;

import java.io.*;

public class OutFile {
    public static void main(String[] args) {

        //outText();//使用字节输出字符串到txt文件(或追加内容)
        //appendText();//使用RandomAccessFile(此类还可以进行读操作)向文件中追加内容
        //charOutText();//使用字符输出流,将字符串输出到txt中
        //bufferCharOutText();//加缓存的、按字符输出(按字节输出一样)
        readOutZip();//读取文件然后写入到另一个路径下(相当于拷贝)

    }

    /**
     * 读取文件(按字节)然后写入到另一个路径下(相当于拷贝)
     */
    private static void readOutZip() {
        //File.separator是为了避免因路径符(在不同系统中是不一样的)不正确引起的路径错误
        File infile = new File("D:"+File.separator+"A_软件工具包/《植物大战僵尸》跳关修改器.rar");
        File outfile = new File("G:"+File.separator+"A_软件工具包/《植物大战僵尸》跳关修改器.rar");
        //此处需创建父目录,如果没有父目录,则会报错,找不到路径
        if(!outfile.getParentFile().exists()){
            outfile.getParentFile().mkdirs();
        }

        InputStream in = null;
        BufferedInputStream bufIn = null;
        OutputStream out = null;
        BufferedOutputStream bufOut =null;
        try {
             in = new FileInputStream(infile);
             bufIn = new BufferedInputStream(in);
             byte [] bytes = new byte[102400];
             out = new FileOutputStream(outfile);
             bufOut = new BufferedOutputStream(out);
             int length;
             while ((length = bufIn.read(bytes)) != -1){
                 System.out.println(length);
                 bufOut.write(bytes,0,length);
                 bufOut.flush();
             }

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

            if(out != null){
                try {
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(bufIn != null){
                try {
                    bufIn.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(in != null){
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }
    }

    /**
     * 加缓存的、按字符输出
     */
    private static void bufferCharOutText() {
        File file = new File("G:/test/BufferedCharText.txt");
        String content = "汉皇重色思倾国,御宇多年求不得。\n杨家有女初长成,养在深闺人未识。\n天生丽质难自弃,一朝选在君王侧。\n回眸一笑百媚生,六宫粉黛无颜色。\n春寒赐浴华清池,温泉水滑洗凝脂。\n侍儿扶起娇无力,始是新承恩泽时。\n云鬓花颜金步摇,芙蓉帐暖度春宵。\n春宵苦短日高起,从此君王不早朝。\n承欢侍宴无闲暇,春从春游夜专夜。\n后宫佳丽三千人,三千宠爱在一身。\n金屋妆成娇侍夜,玉楼宴罢醉和春。\n姊妹弟兄皆列土,可怜光彩生门户。\n遂令天下父母心,不重生男重生女。\n骊宫高处入青云,仙乐风飘处处闻。\n缓歌慢舞凝丝竹,尽日君王看不足。\n渔阳鼙鼓动地来,惊破霓裳羽衣曲。\n九重城阙烟尘生,千乘万骑西南行。\n翠华摇摇行复止,西出都门百余里。\n六军不发无奈何,宛转蛾眉马前死。\n花钿委地无人收,翠翘金雀玉搔头。\n君王掩面救不得,回看血泪相和流。\n黄埃散漫风萧索,云栈萦纡登剑阁。\n峨嵋山下少人行,旌旗无光日色薄。\n蜀江水碧蜀山青,圣主朝朝暮暮情。\n行宫见月伤心色,夜雨闻铃肠断声。\n天旋地转回龙驭,到此踌躇不能去。\n马嵬坡下泥土中,不见玉颜空死处。\n君臣相顾尽沾衣,东望都门信马归。\n归来池苑皆依旧,太液芙蓉未央柳。\n芙蓉如面柳如眉,对此如何不泪垂。\n春风桃李花开夜,秋雨梧桐叶落时。\n西宫南苑多秋草,落叶满阶红不扫。\n梨园弟子白发新,椒房阿监青娥老。\n夕殿萤飞思悄然,孤灯挑尽未成眠。\n迟迟钟鼓初长夜,耿耿星河欲曙天。\n鸳鸯瓦冷霜华重,翡翠衾寒谁与共。\n悠悠生死别经年,魂魄不曾来入梦。\n临邛道士鸿都客,能以精诚致魂魄。\n为感君王辗转思,遂教方士殷勤觅。\n排空驭气奔如电,升天入地求之遍。\n上穷碧落下黄泉,两处茫茫皆不见。\n忽闻海上有仙山,山在虚无缥渺间。\n楼阁玲珑五云起,其中绰约多仙子。\n中有一人字太真,雪肤花貌参差是。\n金阙西厢叩玉扃,转教小玉报双成。\n闻道汉家天子使,九华帐里梦魂惊。\n揽衣推枕起徘徊,珠箔银屏迤逦开。\n云鬓半偏新睡觉,花冠不整下堂来。\n风吹仙袂飘飖举,犹似霓裳羽衣舞。\n玉容寂寞泪阑干,梨花一枝春带雨。\n含情凝睇谢君王,一别音容两渺茫。\n昭阳殿里恩爱绝,蓬莱宫中日月长。\n回头下望人寰处,不见长安见尘雾。\n惟将旧物表深情,钿合金钗寄将去。\n钗留一股合一扇,钗擘黄金合分钿。\n但令心似金钿坚,天上人间会相见。\n临别殷勤重寄词,词中有誓两心知。\n七月七日长生殿,夜半无人私语时。\n在天愿作比翼鸟,在地愿为连理枝。\n天长地久有时尽,此恨绵绵无绝期。\n#end\n";
        //此处创建不创建文件都可以,但是需要创建父目录,如果没有父目录,则会报错,找不到路径
        if(!file.getParentFile().exists()){
            file.getParentFile().mkdirs();
        }

        Writer writer = null;
        BufferedWriter bufferedWriter = null;
        try {
            writer = new FileWriter(file,true);
            //缓冲区大小默认是8K,查看源码defaultCharBufferSize = 8192;
            //每次直接写入磁盘,效率低,加上缓存后,先将内容写入到缓存中,等缓存满了在写入到文件中
            bufferedWriter = new BufferedWriter(writer);
            bufferedWriter.write(content);
            bufferedWriter.flush();//此处刷新会立即写入,如果此句不写,则在close时,写入文件
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(bufferedWriter != null){
                try {
                    bufferedWriter.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

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

    }

    /**
     * 使用字符输出流,将字符串输出到txt中
     */
    private static void charOutText() {
        File file = new File("G:/test/CharText.txt");
        //此处创建不创建文件都可以,但是需要创建父目录,如果没有父目录,则会报错,找不到路径
        if(!file.getParentFile().exists()){
            file.getParentFile().mkdirs();
        }

        Writer writer = null;
        try {
            writer = new FileWriter(file,true);
            //writer.write("输出字符!\n");
            writer.append('草');
        } catch (IOException e) {
            e.printStackTrace();
        }finally {

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

        }
    }

    /**
     * 使用字节方式向文件中追加内容
     */
    private static void appendText() {
        File file = new File("G:/test/outText1.txt");
        //此处创建不创建文件都可以,但是需要创建父目录,如果没有父目录,则会报错,找不到路径
       if(!file.getParentFile().exists()){
            file.getParentFile().mkdirs();
        }
        RandomAccessFile randomAccessFile = null;
        try {
            //第二个参数:r:只读;rw:读写;rws:写操作时,同步刷新到磁盘,刷新内容和元数据;rwd:写操作时,同步刷新到磁盘,刷新内容;
            randomAccessFile = new RandomAccessFile(file,"rw");
            //获取文件长度
            long fileLength = randomAccessFile.length();
            //将写文件的指针移到文件尾
            randomAccessFile.seek(fileLength);
            /**
             * 此处有中文乱码的坑
             * String.getBytes();默认会选取系统中的编码格式,而idea中的项目一般默认是UTF-8,获取此项目的编码即为UTF-8。
             * 但是windows(中国版)默认编码为GBK,向文件中输出时,输出的是UTF-8的字节数组,自然会中文乱码
             *
             * 一般此处不使用writeBytes(String str),因为底层转化成字节数组时,使用UTF-8编码
             * 此处建议使用write(Byte [] byte),使用程序控制编码
             */
            randomAccessFile.write("追加内容\n".getBytes("GBK"));//String.getBytes():会按照系统默认编码获取字符串的字节码

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

    }

    /**
     * 使用字节输出字符串到txt文件(或追加内容)
     */
    private static void outText() {
        File file = new File("G:/test/outTxt.txt");
        //此处创建不创建文件都可以,但是需要创建父目录,如果没有父目录,则会报错,找不到路径
        if(!file.getParentFile().exists()){
            file.getParentFile().mkdirs();
        }
        byte [] bytes = "OutPutStream输出到文件中\n".getBytes();
        OutputStream out = null;
        try {
            //FileOutputStream(File file):此种输出会覆盖原有内容
            //FileOutputStream(File file,String append):此种输出会追加内容
            //默认保存文件格式编码为UTF-8
            out = new FileOutputStream(file,true);
            out.write(bytes);

            bytes = "追加内容\n".getBytes();
            out.write(bytes);


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

    }




}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值