java文件流

File对象的三种创建方式

//方式1
File file = new File("E:\\test\\a.txt"); // "\"是正则表达式的符号,所以转义
//方式2
File file = new File("E:\\test", "a.txt");
//方式3
File file1 = new File("e:\\test");
File file2 = new File(file3, "a.txt");

常用API

创建:
    public boolean createNewFile():创建文件 如果存在这样的文件就不创建
    public boolean mkdir():创建文件夹 如果存在这样的文件夹就不创建
    public boolean mkdirs():创建文件夹,如果父文件夹不存在会创建出来

判断功能:
    public boolean isDirectory():判断是否是目录
    public boolean isFile():判断是否是文件
    public boolean exists():判断是否存在
    public boolean canRead():判断是否可读
    public boolean canWrite():判断是否可写
    public boolean isHidden():判断是否隐藏

获取功能:
    public String getAbsolutePath():获取绝对路径
    public String getPath():获取相对路径
    public String getName():获取名称
    public long length():获取长度。字节数
    public long lastModified():获取最后一次的修改时间,毫秒值
    public String[] list():获取指定目录下的所有文件或者文件夹的名称数组
    public File[] listFiles():获取指定目录下的所有文件或者文件夹的File数组

示例:判断E盘目录下是否有后缀名为.jpg的文件,如果有,就输出此文件名称

//方式1
File file = new File("e:\\");
File[] fileArray = file.listFiles();
for (File f : fileArray) {
    if (f.isFile()) {
        if (f.getName().endsWith(".jpg")) {
            System.out.println(f.getName());
        }
    }
}

//方式2
File file = new File("e:\\");
String[] strArray = file.list(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                // 把这个文件或者文件夹的名称加不加到数组中,取决于这里的返回值是true还是false
                return new File(dir, name).isFile() && name.endsWith(".jpg");
            }
        });
for (String s : strArray) {
    System.out.println(s);
}

IO流

IO用于在设备间进行数据传输的操作

分类:
    1. 流向
        输入流 读取数据
        输出流 写出数据
    2. 数据类型
        字节流 
                字节输入流
                字节输出流
        字符流
                字符输入流
                字符输出流
    注意:
        a:如果我们没有明确说明按照什么分,默认按照数据类型分。
        b:除非文件用windows自带的记事本打开我们能够读懂的,才采用字符流,否则建议使用字节流。

字节流

分类:
    1. 基本字节流
        FileOutputStream 写出数据
        FileInputStream 读取数据
    2. 字节缓冲区流(高效字节流)
        A:BufferedOutputStream
        B:BufferedInputStream

示例:字节流四种方式复制文件对比

/*
 * 基本字节流一次读写一个字节:       耗时:117235毫秒
 * 基本字节流一次读写一个字节数组:  耗时:156毫秒
 * 高效字节流一次读写一个字节:     耗时:1141毫秒
 * 高效字节流一次读写一个字节数组:  耗时:47毫秒
 */
public static void main(String[] args) throws IOException {
        long start = System.currentTimeMillis();

        method1("e:\\hello.mp4", "copy1.mp4");
        method2("e:\\hello.mp4", "copy2.mp4");
        method3("e:\\hello.mp4", "copy3.mp4");
        method4("e:\\hello.mp4", "copy4.mp4");

        long end = System.currentTimeMillis();
        System.out.println("耗时:" + (end - start) + "毫秒");
    }

    // 高效字节流一次读写一个字节数组:
    public static void method4(String srcString, String destString) throws IOException {
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcString));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destString));

        byte[] bys = new byte[1024];
        int len = 0;
        while ((len = bis.read(bys)) != -1) {
            bos.write(bys, 0, len);
        }

        bos.close();
        bis.close();
    }

    // 高效字节流一次读写一个字节:
    public static void method3(String srcString, String destString) throws IOException {
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcString));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destString));

        int by = 0;
        while ((by = bis.read()) != -1) {
            bos.write(by);
        }
        bos.close();
        bis.close();
    }

    // 基本字节流一次读写一个字节数组
    public static void method2(String srcString, String destString) throws IOException {
        FileInputStream fis = new FileInputStream(srcString);
        FileOutputStream fos = new FileOutputStream(destString);

        byte[] bys = new byte[1024];
        int len = 0;
        while ((len = fis.read(bys)) != -1) {
            fos.write(bys, 0, len);
        }
        fos.close();
        fis.close();
    }

    // 基本字节流一次读写一个字节
    public static void method1(String srcString, String destString) throws IOException {
        FileInputStream fis = new FileInputStream(srcString);
        FileOutputStream fos = new FileOutputStream(destString);

        int by = 0;
        while ((by = fis.read()) != -1) {
            fos.write(by);
        }
        fos.close();
        fis.close();
    }

字符流

Reader |– InputStreamReader |– OutputStreamWriter |– BufferedReader |– BufferedWriter |– FileReader |– FileWriter

字节流操作中文数据不是特别的方便,所以就出现了转换流。转换流的作用就是把字节流转换字符流来使用。
转换流其实是一个字符流 字符流 = 字节流 + 编码表

编码表
    A:就是由字符和对应的数值组成的一张表
    B:常见的编码表 ASCII ISO-8859-1 GB2312 GBK GB18030 UTF-8
    C:字符串中的编码问题 编码String -- byte[] 解码 byte[] -- String

IO流中的编码问题 
    A:OutputStreamWriter OutputStreamWriter(OutputStream os):默认编码,GBK OutputStreamWriter(OutputStream os,String charsetName):指定编码。 
    B:InputStreamReader InputStreamReader(InputStream is):默认编码,GBK InputStreamReader(InputStream is,String charsetName):指定编码 
    C:编码问题其实很简单 编码只要一致即可

示例:复制文本文件(5种方式)

/*
 * 分析:
 *      复制数据,如果用记事本打开并能够读懂,就用字符流,否则用字节流。
 *      通过该原理,应该采用字符流更方便一些。
 *      而字符流有5种方式。推荐掌握第5种。
 */
public class CopyFileDemo {
    public static void main(String[] args) throws IOException {
        String srcString = "c:\\a.txt";
        String destString = "d:\\b.txt";
        method1(srcString, destString);
        method2(srcString, destString);
        method3(srcString, destString);
        method4(srcString, destString);
        method5(srcString, destString);
    }

    //方式5:字符缓冲流一次读写一个字符串
    private static void method5(String srcString, String destString) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader(srcString));
        BufferedWriter bw = new BufferedWriter(new FileWriter(destString));

        String line = null;
        while ((line = br.readLine()) != null) {
            bw.write(line);
            bw.newLine();
            bw.flush();
        }

        bw.close();
        br.close();
    }

    //方式4:字符缓冲流一次读写一个字符数组
    private static void method4(String srcString, String destString) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader(srcString));
        BufferedWriter bw = new BufferedWriter(new FileWriter(destString));

        char[] chs = new char[1024];
        int len = 0;
        while ((len = br.read(chs)) != -1) {
            bw.write(chs, 0, len);
        }

        bw.close();
        br.close();
    }

    //方式3:字符缓冲流一次读写一个字符
    private static void method3(String srcString, String destString) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader(srcString));
        BufferedWriter bw = new BufferedWriter(new FileWriter(destString));

        int ch = 0;
        while ((ch = br.read()) != -1) {
            bw.write(ch);
        }

        bw.close();
        br.close();
    }

    //方式2: 基本字符流一次读写一个字符数组
    private static void method2(String srcString, String destString) throws IOException {
        FileReader fr = new FileReader(srcString);
        FileWriter fw = new FileWriter(destString);

        char[] chs = new char[1024];
        int len = 0;
        while ((len = fr.read(chs)) != -1) {
            fw.write(chs, 0, len);
        }

        fw.close();
        fr.close();
    }

    //方式1:基本字符流一次读写一个字符
    private static void method1(String srcString, String destString) throws IOException {
        FileReader fr = new FileReader(srcString);
        FileWriter fw = new FileWriter(destString);

        int ch = 0;
        while ((ch = fr.read()) != -1) {
            fw.write(ch);
        }
        fw.close();
        fr.close();
    }
}

打印流

可以操作任意类型的数据

种类:
    1. 字节流打印流:PrintStream
    2. 字符打印流:PrintWriter
特点:
    1. 只有写数据的,没有读取数据。只能操作目的地,不能操作数据源
    2. 可以操作任意类型的数据
    3. 如果启动了自动刷新,能够自动刷新
    4. 该流是可以直接操作文本文件的

看API,查流对象的构造方法,如果同时有File类型和String类型的参数,一般来说就是可以直接操作文件的,如:FileInputStream / FileOutputStream / FileReader / FileWriter / PrintStream / PrintWriter

/*
 * DataStreamDemo.java复制到Copy.java中
 * 启动自动刷新
 *      PrintWriter pw = new PrintWriter(new FileWriter("pw2.txt"), true);
 * 
 *      println()
 *      等价于:
 *      bw.write();
 *      bw.newLine();       
 *      bw.flush();
 */
public class CopyFile {
    public static void main(String[] args) throws IOException {
        // 以前的版本
        /* BufferedReader br = new BufferedReader(new FileReader("DataStreamDemo.java"));
         BufferedWriter bw = new BufferedWriter(new FileWriter("Copy.java"));

         String line = null;
         while ((line = br.readLine()) != null) {
             bw.write(line);
             bw.newLine();
             bw.flush();
         }

         bw.close();
         br.close();
        */

        // 打印流的改进版
        BufferedReader br = new BufferedReader(new FileReader("DataStreamDemo.java"));
        PrintWriter pw = new PrintWriter(new FileWriter("Copy.java"), true);

        String line = null;
        while((line=br.readLine())!=null){
            pw.println(line);
        }

        pw.close();
        br.close();
    }
}


/*
 * 合并文件:把ByteArrayStreamDemo.java和DataStreamDemo.java的内容复制到Copy.java中
 * SequenceInputStream(InputStream s1, InputStream s2)
 */
public class SequenceInputStreamDemo {
    public static void main(String[] args) throws IOException {

        InputStream s1 = new FileInputStream("ByteArrayStreamDemo.java");
        InputStream s2 = new FileInputStream("DataStreamDemo.java");

        SequenceInputStream sis = new SequenceInputStream(s1, s2);
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("Copy.java"));

        // 以前怎么读写,现在还是怎么读写
        byte[] bys = new byte[1024];
        int len = 0;
        while ((len = sis.read(bys)) != -1) {
            bos.write(bys, 0, len);
        }

        bos.close();
        sis.close();
    }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值