文档章节

Java基础进阶_day10_(File类,IO,字节流)

S
 Sunmos
发布于 2017/05/13 00:18
字数 3851
阅读 3
收藏 0

Java基础进阶_day10_(File类,IO,字节流)

1. File类

File类:文件和目录(文件夹)路径名的抽象表示.

1.1 构造方法

public File(String pathname):根据路径名得到File对象,不论指向的文件是否存在都会创建对象;
public File(String parent,String child):根据一个目录和一个子文件夹/目录得到File对象;
public File(File parent,String child):根据一个父File对象和一个子文件夹/目录得到File对象.
# 注意事项:
 当参数没有盘符路径时,默认是在当前项目路径下;
 File的方法都是无参数的,则表示创建File对象时要指向要进行具体操作的文件或文件夹.

1.2 成员方法

1.2.1 创建功能

public boolean createNewFile():在指定文件夹下创建一个文件,指定的文件夹必须存在(否则报错),如果文件不存在就创建并返回true,如果文件已经存在,不创建并返回false;
public boolean mkdir():创建File对象指定的目录,父级目录必须存在(否则返回false),如果指定目录不存在就创建并返回true,如果目录已经存在,就不创建并返回false;
public boolean mkdirs():创建File对象指定的目录,包括所有必需但不存在的父目录,如果指定目录不存在就创建并返回true,如果目录已经存在,就不创建并返回false;
# 注意事项:
 File对象指向要创建的文件或目录名,调用对象的方法创建相应的文件或目录;
 File对象的创建功能的方法只能创建对应的文件或文件夹,mkdir和mkdirs方法只能创建文件夹.

1.2.2 删除功能

public boolean delete():删除File对象指定的文件或文件夹,删除成功返回true,否则返回false
# 注意:Java程序中删除文件是不进入回收站的,当要删除的文件夹还有子文件或文件夹时,不能删除(必须是空文件夹才能删除).

1.2.3 重命名功能

public boolean renameTo(File dest):对文件进行重命名
# 注意:当两个文件路径相同,就是对文件重命名,如果两个文件路径不同(dest对象中不能有不存在的目录,否则返回false),就是文件重命名并剪切移动到新的目录下.

1.2.4 判断功能

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

1.2.5 获取功能

public String getAbsolutePath():获取文件或文件夹绝对路径
public String getPath():获取文件或文件夹相对路径
public String getName():获取文件或文件夹的名称
public long length():获取文件的长度,字节数
public long lastModified():获取文件最后一次被修改的时间
public String[] list():获取指定目录下所有文件或者文件夹的名称的数组,相对路径
public File[] listFiles():获取指定目录下所有文件或文件夹的File数组,文件的绝对路径
public String[] list(FilenameFilter filter):按照指定文件名过滤器过滤后的文件名数组
public File[] listFiles(FilenameFilter filter):按照指定文件名过滤器过滤后的文件对象数组

1.3 文件过滤器

FilenameFilter类:文件过滤器接口:该接口只有一个抽象方法.

boolean accept(File dir,String name):测试指定文件是否应该包含在某一文件列表中.

1.4 案例代码

public class MyFileDemo {
    public static void main(String[] args) throws IOException {
        // 构造方法测试
        // test01();
        // 创建功能和删除功能测试
        // test02();
        // 重命名功能
        // test03();
        // 判断功能
        // test04();
        // 获取功能
        // test05();
        // 获取文件过滤器过滤后的文件
        // 获取F:目录下以.java结尾的文件
        // test06();
    }
    public static void test06() {
        File file = new File("F:");
        String[] list = file.list(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                // dir表示的是获取的文件夹,name表示获取的文件名称
                // 获取该文件的File对象
                // File file2 = new File(dir, name);
                // return file2.isFile() && name.endsWith(".java");
                return new File(dir, name).isFile() && name.endsWith(".java");
            }
        });
        // 输出符合条件的文件名
        for (String string : list) {
            System.out.println(string);
        }
    }
    public static void test05() {
        File file = new File("java\\java.java");
        System.out.println(file.getAbsolutePath());
        System.out.println(file.getParent());
        System.out.println(file.getName());
        System.out.println(file.length());
        long lm = file.lastModified();
        Date d = new Date(lm);
        String string = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(d);
        System.out.println(string);
        // public String[] list()
        File file2 = new File("F:");
        String[] list = file2.list();
        for (String s : list) {
            System.out.println(s);
        }
        // public File[] listFiles()
        File[] listFiles = file2.listFiles();
        for (File file3 : listFiles) {
            System.out.println(file3.getName());
        }
    }
    public static void test04() {
        File file = new File("a.txt");
        System.out.println(file.isDirectory());
        System.out.println(file.isFile());
        System.out.println(file.exists());
        System.out.println(file.canRead());
        System.out.println(file.canWrite());
        System.out.println(file.isHidden());
    }
    public static void test03() {
        File file = new File("java\\java.java");
        // File newFile = new File("F:\\demo\\java.txt"); // F:下没有demo文件夹,false
        // File newFile = new File("F:java\\java.txt"); // F:下没有demo文件夹,false
        File newFile = new File("F:java.txt"); // 将文件重命名并移动到F:根目录下,true
        System.out.println(file.renameTo(newFile));
    }
    public static void test02() throws IOException {
        // public boolean createNewFile()
        File file5 = new File("F:\\java.txt");
        System.out.println(file5.createNewFile()); // true
        // public boolean mkdir()
        File file6 = new File("F:\\demo\\java");
        System.out.println(file6.mkdir());
        // public boolean mkdirs()
        File file7 = new File("F:\\demo\\java\\develop");
        System.out.println(file7.mkdirs());
        File file8 = new File("F:\\demo\\java\\develop.txt");
        System.out.println(file7.mkdirs()); // 创建的是文件名为develop.txt的文件夹
        // public boolean delete()
        File file9 = new File("java");
        System.out.println(file9.delete()); // false
    }
    public static void test01() {
        // public File(String pathname):根据路径名得到File对象;
        // 将F:\\java\\hello.txt封装成File对象,file对象只是抽象的表示,需要调用相应的方法才能操作文件或文件夹
        File file = new File("F:\\java\\hello.txt");
        // public File(String parent,String child):根据一个目录和一个子文件夹/目录得到File对象;
        File file2 = new File("F:\\java", "hello.txt");
        // public File(File parent,String child):根据一个父File对象和一个子文件夹/目录得到File对象.
        File file3 = new File("F:\\java");
        File file4 = new File(file3,"F:\\java");
        // 上述三种创建File对象的效果相同,一般选用第一钟
    }
}

2. IO流

IO:用类处理设备间的数据传输(文件上传和下载)问题.

# 注意:
 Java对数据的操作是通过流的方式;
 Java用于操作流的对象都在IO包中;
 Java中的IO流的方向是相对于Java程序而言的.

2.1 IO流分类

# 按照数据流向:针对Java程序而言.
 输入流:读入数据
 输出流:写出数据
# 按照数据类型:
   * 字节流:
 字节输入流:InputStream抽象类是所有字节输入流的根类;
 字节输入流:OutputStream抽象类是所有字节输出流的根类.
   * 字符流:是在字节流的基础之上添加了编码表
 字符输入流:Reader抽象类是所有字符输入流的根类;
 字符输出流:Writer抽象类是所有字符输出流的根类.
# 注意事项:
 字节流和字符流的基类抽象类的子类均是以对象基类名为后缀(如:XxxInputStream,XxxReader);
 字节输出流写数据是将数据直接写到文件,可以不使用flush()刷新缓冲区的方式;
 字符输出流写数据是先将数据写到缓冲区,可以使用flush()将缓冲区的数据写到文件.
 输入流读取的文件必须先要存在,否则出现FileNotFoundException异常;
 输出流要输出的文件可以不存在,输出时会默认创建该文件,但是不能创建文件夹.

2.2 转义字符和路径问题

# 转移字符:\\代表单\,\t代表制表符,\r\n代表是回车键
# 路径:
 绝对路径:以盘符开始的完整路径(d:\\a.txt)
 相对路径:相对于当前项目而言,文件会创建在项目的根目录下(a.txt);

2.3 FileOutputStream类

FileOutputStream类:是字节输出流的具体实现类.

2.3.1 构造方法

FileOutputStream(File file):创建指向File对象的字节输出流,如果文件存在则将内容清空,不存在就创建文件;
FileOutputStream(File file, boolean append):创建指向File对象的字节输出流,追加写数据;
FileOutputStream(String name):创建指向具体文件的字节输出流,如果文件存在则将内容清空,不存在就创建文件;
FileOutputStream(String name, boolean append):创建指向具体文件的字节输出流,追加写数据;

2.3.2 字节输出流写文件步骤

# A:创建字节输出流对象(调用系统功能创建文件,创建输出流对象,将输出流对象指向文件)
# B:调用写数据方法(write方法,写字节数据),默认是追加写数据
# C:释放资源(将对象变为垃圾便于回收,通知系统释放与该文件相关的资源)

2.3.3 写数据方法

public void write(int b):写入一个字节,使用的是字符的ASCII值;
public void write(byte[] b):写入一个字节数组;
public void write(byte[] b,int off,int len):写入一个字节数组从off索引开始的len个字节.

2.3.4 注意事项

# 创建输出流对象执行操作:调用系统功能创建文件,创建输出流对象,将输出流对象指向文件
# 写入换行:写入换行符的字节形式(windows:\r\n,Linux:\n,mac:\r)
# 追加写数据:使用带有追加写数据的构造方法,参数为true
# close方法:将对象变为垃圾便于垃圾回收器的回收,通知系统释放与该文件相关的资源.

2.4 FileInputStream类

FileInputStream类:是字节输入流的具体实现类.

2.4.1 构造方法

FileInputStream(File file):创建指向File对象的字节输入流;
FileInputStream(String name):创建指向具体文件名的字节输入流.

2.4.2 字节输入流读取文件步骤

# A:创建字节输入流对象
# B:调用读数据方法
# C:释放资源

2.4.3 读数据方法

public int read():一次读取一个字节数据,没有数据时,返回-1,读取的是字符的ASCII值,要强制类型转换后才能变为字符,读取的中文会乱码,中文占用2个字节,强制转换时将中文拆为2个字节进行转换,会乱码;
public int read(byte[] b):一次读取一个字节数组,返回每次实际读取的字节数.

2.4.4 案例代码

public class MyIODemo01 {
    public static void main(String[] args) throws IOException {
        // 字节输出流测试
        // fileOutPutStreamDemo();
        // 字节输入流测试
        // fileInputStreamDemo();
        // 字节输入流和输出流复制文件案例
        copyFileTest();
    }
    public static void copyFileTest() throws IOException {
        // 将项目根目录下的指定文件的内容复制到指定的文件中
        // 创建输入流对象
        FileInputStream fis = new FileInputStream("IO流的分类.bmp");
        // 创建输出流对象
        FileOutputStream fos = new FileOutputStream("test.bmp");
        // 赋值文件
        // 定义存储读取的字节的数组,一般长度给1024,是1kb
        byte[] bs = new byte[1024];
        // 每次读取字节的实际长度
        int len;
        while((len = fis.read(bs)) != -1) {
            fos.write(bs, 0, len);
        }
        // 释放资源
        fis.close();
        fos.close();
    }
    public static void fileInputStreamDemo() throws IOException {
        // 测试读取数据方法
        FileInputStream fis = new FileInputStream("Demo.java");
        // read方法会每次读取一个字节,并自动移向下一个字节数据
        System.out.println((char)fis.read()); // s
        // 一次读取一个字节
        byte[] b = new byte[1024];
        int len;
        while((len=fis.read(b)) != -1) {
            // 将字节数组数据转换为字符串
            System.out.println(new String(b, 0, len));
        }
    }
    public static void fileOutPutStreamDemo() throws FileNotFoundException,
            IOException {
        // 测试构造方法
        test01();
        // 测试写数据方法
        test02();
        // 测试带有异常处理的字节输出流
        test03();
    }

    public static void test03() {
        // 要对fos进行初始化,否则调用close方法可能空,出现编译期异常
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream("fos3.txt");
            fos.write(23);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 如果输出流对象不为空才需要关闭
            if(fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    public static void test02() throws FileNotFoundException, IOException {
        FileOutputStream fos = new FileOutputStream("sof.java");
        // 写入数据
        // public void write(int b)
        fos.write('a'); // 代表的是字符a
        fos.write(97); // 代表的也是字符a,97是字符a的值
        // public void write(byte[] b)
        byte[] bs = "somnus".getBytes();
        fos.write(bs);
        // public void write(byte[] b,int off,int len)
        fos.write(bs, 3, 2); // 将字节数组从索引3开始的2个字节写入文件
        // 释放资源
        fos.close();
    }
    public static void test01() throws FileNotFoundException, IOException {
        // FileOutputStream(File file)
        // FileOutputStream fos1 = new FileOutputStream(new File("Demo.java"));
        // FileOutputStream(String name)
        /* * 此构造方法执行的操作: * 1.调用系统功能创建文件 * 2.创建fos对象 * 3.将fos对象指向该文件 */
        FileOutputStream fos2 = new FileOutputStream("Demo.java");
        // 调用写数据方法,只能写入字节数据
        fos2.write("somnus".getBytes());
        // 释放资源
        /* * 1.将字节输出流变为垃圾,便于垃圾回收器的回收; * 2.通知系统释放与该文件相关的资源. */
        fos2.close();
    }
}

2.5 高效字节缓冲流

高效的字节缓冲流:在基本的字节输入输出流的基础上添加了数组作为缓冲区,本质还是字节输入输出流对象进行操作文件.

2.5.1 BufferedInputStream类

字节输入缓冲流:BufferedInputStream类,是InputStream抽象类的间接子类,是在FileInputStream类基础上封装了数组作为缓冲区.

构造方法
public BufferedInputStream(InputStream in):创建字节输入缓冲流,参数是InputStream抽象类的实现类;
public BufferedInputStream(InputStream in,int size):创建指定缓冲区大小为size的字节输入缓冲流.
读取数据方法
public int read():一次读取一个字节放入输入缓冲流;
public void read(byte[] b,int off,int len):一次读取一个字节数组放入输入缓冲流.

2.5.2 BufferedOutputStream类

字节输出缓冲流:BufferedOutputStream类,是OutputStream抽象类的间接子类,是在FileOutputStream类基础上封装了数组作为缓冲区.

构造方法
public BufferedOutputStream(OutputStream in):创建字节输出缓冲流,参数是OutputStream抽象类的实现类;
public BufferedOutputStream(OutputStream in,int size):创建指定缓冲区大小为size的字节输出缓冲流.
写数据方法
public void write(int b):将一个指定字节写入输出缓冲流;
public void write(byte[] b,int off,int len):将指定字节数组的一部分字节下写入输出缓冲流.

2.5.3 flush方法和close方法的区别

# flush方法是将缓冲区的数据刷新到文件,后面还可以继续文件写入数据,频繁使用会降低程序效率;
# close方法是在关闭流之前执行flush方法,将数据刷新到文件,后面不能再向文件写入数据.

2.5.4 案例代码

public class MyIODemo02 {
    public static void main(String[] args) throws IOException {
        // 创建字节输入缓冲流对象
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("Demo.java"));
        // 创建字节输出缓冲流对象
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("test.java"));
        // 赋值文件
        byte[] bs = new byte[1024];
        int len;
        while((len = bis.read(bs)) != -1) {
            bos.write(bs, 0, len);
        }
        // 释放资源
        bos.close();
        bis.close();
    }
}

本文转载自:http://blog.csdn.net/l631106040120/article/details/70188520

共有 人打赏支持
S
粉丝 0
博文 34
码字总数 0
作品 0
成都
JavaIO/输出输入入门

IO称之为输入输出,Java的IO是通过java.io包下的类和接口来支持,包含两大类:输入,输出. 在整个Java.io包中最重要的就是5个类和一个接口。5个类指的是File、OutputStream、InputStream、Write...

Zhao-Qian
2013/01/04
0
0
JAVA基础再回首(二十一)——递归、IO流概述、字节流写数据、读取数据、复制数据、字节缓冲流

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m366917/article/details/52433489 JAVA基础再回首(二十一)——递归、IO流概述、字节流写数据、读取数据、复...

Aduroidpc
2016/09/04
0
0
关于Java编程基础学习输入输出IO的问题

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

Java小辰
05/23
0
0
第9章 文件IO操作、正则表达式与多线程

第9章 文件IO操作、正则表达式与多线程 我们在《第6章 扩展函数与属性》中已经介绍过Kotlin中的类扩展的特性。使用Kotlin的扩展函数功能,我们可以直接为 String 类实现一个 inc() 函数,这个...

程序员诗人
2017/10/18
0
0
Java: I/O(1/3)字节流与字符流的纵向与横向比较

Summary 总述 java.io包中的类非常繁多,但其实只要归成4类: & 、 & ,由于功能和命名上都相当接近,因此只要掌握了其中一种,将会很容易理解其他3种。 横向归类: & (字节流)、 & (字符...

大鱼BIG_FISH
2015/11/16
0
2

没有更多内容

加载失败,请刷新页面

加载更多

Android JNI 开发系列(九)JNI调用Java的静态方法&实例方法

JNI调用Java的静态方法&实例方法 package org.professor.jni.bean;import android.util.Log;/**- Created by peng on 2018/10/11. */ public class Person { /** ......

蔡小鹏
6分钟前
0
0
Flink 原理与实现:Window 机制

Flink 认为 Batch 是 Streaming 的一个特例,所以 Flink 底层引擎是一个流式引擎,在上面实现了流处理和批处理。而窗口(window)就是从 Streaming 到 Batch 的一个桥梁。Flink 提供了非常完...

xtof
8分钟前
0
0
Fabric.js高级点的教程2--添加表格的方法

有时候我们先在画布上画一个表格类似一下设计软件那种。一方面作为参考线,一方面给人一直专业的赶脚。。。 先贴上一段网上(不是我写的)可以运行的代码 https://codepen.io/rodan8888/pen/e...

xmqywx
9分钟前
0
0
Java中Lambda表达式的使用

Java中Lambda表达式的使用 简介 (译者注:虽然看着很先进,其实Lambda表达式的本质只是一个"语法糖",由编译器推断并帮你转换包装为常规的代码,因此你可以使用更少的代码来实现同样的功能。本人...

DemonsI
12分钟前
0
0
深入理解Java中停止线程

一.停止线程会带来什么? 对于单线程中,停止单线程就是直接使用关键字return或者break,但是在停止多线程时是让线程在完成任务前去开启另外一条线程,必须放弃当前任务,而这个过程是不可预...

Ala6
21分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部