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

Posted 胡乐天

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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();
                }
            }
        }

    }




}

以上是关于java输出流_缓存_复制文件的主要内容,如果未能解决你的问题,请参考以下文章

Java_流

阶段1 语言基础+高级_1-3-Java语言高级_07 缓冲流_4_缓冲流的效率测试_复制文件

java _io_文件输出

IT十八掌作业_java基础第十四天_IO

0425-使用文件输入和输出流复制文件

Java输入输出练习