java.io.*的使用(详解)


一、File

  • jva.io.File (文件和目录的抽象表现形式)对象主要用来获取文件本身的信息,例如文件所在目录、文件的长度和文件的读/写权限等,不涉及对文件的读/写操作。
  • 这个类实际上隐藏了大量的与系统相关的复杂因素和细节。例如,在 Windows 系统中目录名和文件名被字符 \ 分开,在 UNIX 系统中用分隔符 /,而在 Macintosh 计算机中用 : 分隔。无论是哪个系统,在 Java 程序中,可以使用 File.separator 作为分隔符。这个字符串包含单个字符,它在当前的 Java 虚拟机所处的操作系统下总是正确的分隔符。

1.创建 File 类的对象

  • 注意:无论这个文件/目录是否存在都无所谓,这只是创建的一个 路径名 的抽象表现形式而已,不会在磁盘上创建一个具体的文件/目录。
    public File(String pathname)
    public File(String parent, String child)
    public File(File parent, String child)
    
  • 将路径和名称分开的好处是相同路径的文件或目录可共享一个路径字符串,这样管理和修改都方便。
  • 传递的参数可以是绝对路径也可以是相对路径。 ====> 相对路径和绝对路径

2.获取文件或目录属性

- public boolean exists():File标识的文件或目录是否实际存在
- public boolean isDirectory():此File标识的是否为文件夹
- public boolean isFile():此file表示的是否为文件
- public String getAbsolutePath():返回File的绝对路径名 字符串
- public String getPath():将此File转换为路径名 字符串,获取构造路径(就是获取你构造方法时候放入的路径)
- public String getName():返回此File表示的文件或目录的名称
- public long length():返回此File表示的文件的字节大小,不能获取目录的字节大

3.文件或目录操作

- public boolean creatNewFile():当且仅当不存在该名称的文件时,创建一个新的空文件
- public boolean mkdir():创建由File表示的目录
- public boolean mkdirs():创建由File表示的目录,包括任何必须但不存在的父目录
- public boolean delete():删除抽象路径名定义的文件或目录。 如果要删除的是目录,目录必须为空。
- public String[] list():返回一个String数组,表示该File目录中的所有子文件或目录的名称
- public File[] listFiles():返回一个File数组,表示File目录中的所有子文件或目录的路径

二、IO流

  • 输入流输出流是相对于程序(内存)而言的。将数据读入程序(内存)就是输入,把数据从程序(内存)中输出就是输出流。
  • 的最大特点是数据的获取和发送均按照数据序列进行:每一个数据都必须等待排在它前面的数据读入或送出后才能被读写,不能随意选择输入输出的位置。
  • java.io 包中IO流有着四大家族:InputStream类OutputStream类Reader类Writer类
    • 这四个类都是抽象类,下面有很多的实现类可以使用。
    • 在java中只要 类名Stream 结尾的都是字节流。以Reader/Writer结尾的都是字符流
  • 注意:
    • 所有的流都实现了:java.io.Closeable接口,都是可关闭的,都有close()方法。流是一个管道,这个是内存和硬盘之间的通道,用完之后一定要关闭,不然会耗费(占用)很多资源。养成好习惯,用完流一定要关闭。
    • 所有的输出流都实现了:java.io.Flushable接口,都是可刷新的,都有flush()方法。养成一个好习惯,输出流在最终输出之后,一定要记得flush()刷新一下。这个刷新表示将通道/管道当中剩余未输出的数据强行输出完(清空管道!)刷新的作用就是清空管道如果没有flush()可能会导致丢失数据。
  • System.in标准输入设备是键盘。
  • System.out 标准输出设备是终端或监视器。
  • System.err标准错误输出设备。

1.Java要掌握的流(16个)

  • 文件专属:
    • java.io.FileInputStream(掌握)√
    • java.io.FileOutputStream(掌握)√
    • java.io.FileReader
    • java.io.FileWriter
  • 转换流:(将字节流转换成字符流)
    • java.io.InputStreamReader
    • java.io.OutputStreamWriter
  • 缓冲流专属:
    • java.io.BufferedReader
    • java.io.BufferedWriter
    • java.io.BufferedInputStream
    • java.io.BufferedOutputStream
  • 数据流专属:
    • java.io.DataInputStream
    • java.io.DataOutputStream
  • 标准输出流:
    • java.io.PrintWriter
    • java.io.PrintStream(掌握)
  • 对象专属流:
    • java.io.ObjectInputStream(掌握)
    • java.io.ObjectOutputStream(掌握)

2.字节流

  • 按照 字节 的方式读取数据,一次读取1个字节byte,等同于一次读取8个二进制位。
  • 这种流是万能的,什么类型的文件都可以读取。包括:文本文件,图片,声音文件,视频文件 等…

(1)java.io.FileInputStream

  • 文件字节输入流,万能的,任何类型的文件都可以采用这个流来读。
    // 若File类对象的所代表的文件不存在;不是文件是目录;或者其他原因不能打开的话,则会抛出FileNotFoundException
    FileInputStream(String name)	name为文件路径
    FileInputStream(File file)
    
    int read()	读取一个字节,返回值为该字节ASCII码;读到文件末尾返回-1
    int read(byte[] b)	读b数组长度的字节到b数组中,返回值为读到的字节个数;读到文件末尾返回-1
    int read(byte[] b, int off, int len)	从b数组off位置读len长度的字节到b数组中,返回值为读到的字节个数;读到文件末尾返回-1
    int available()	返回文件有效的字节数
    long skip(long n)	跳过n个字节
    void close()	关闭文件输入流
    
    import java.io.FileInputStream;
    import java.io.IOException;
    
    public class FileInputStreamTest04 {
        public static void main(String[] args) {
            FileInputStream in = null;
            try {
                in = new FileInputStream("test/test.txt");
                // 开始读,采用byte数组,一次读取多个字节。最多读取“数组.length”个字节。
                byte[] bytes = new byte[4];// 准备一个4个长度的byte数组,一次最多读取4个字节。
                int readCount;
                // 这个方法的返回值是:读取到的字节数量。(不是字节本身);1个字节都没有读取到返回-1(文件读到末尾)
                while((readCount = in.read(bytes)) != -1) {
                    // 不应该全部都转换,应该是读取了多少个字节,转换多少个。
                    System.out.print(new String(bytes, 0, readCount));
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                // 在finally语句块当中确保流一定关闭。
                if (in != null) {// 避免空指针异常!
                    // 关闭流的前提是:流不是空。流是null的时候没必要关闭。
                    try {
                        in.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    
    import java.io.FileInputStream;
    import java.io.IOException;
    
    public class FileInputStreamTest05 {
        public static void main(String[] args) {
            FileInputStream in = null;
            try {
                in = new FileInputStream("test/test.txt");
                System.out.println("总字节数量:" + in.available());
                /*int readByte = in.read();
                System.out.println("剩下多少个字节没有读:" + in.available());*/
                // 这个方法有什么用?
                byte[] bytes = new byte[in.available()]; // 这种方式不太适合太大的文件,因为byte[]数组不能太大。
                // 不需要循环了。
                // 直接读一次就行了。
                /*in.read(bytes);
                System.out.println(new String(bytes)); */
    
                // skip跳过几个字节不读取,这个方法也可能以后会用!
                in.skip(3);
                System.out.println(in.read());
    
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (in != null) {
                    try {
                        in.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    

(2)java.io.FileOutputStream

  • 文件字节输出流,万能的,任何类型的文件都可以采用这个流来写。
  • // FileOutputStream流中的构造方法说明提到的是不存在且无法创建才会报FileNotFoundException异常。也就是意味着若不存在但可创建的情况下是不会有异常产生的,因此FileOutputStream流的构造方法可以用于生成系统文件
    // java中建立文件输出流,当文件不存在时会新建一个文件,但是父目录必须存在才会创建一个新的文件,如果不存在会出现 ClassNotFoundException异常。
    // 如果有同名文件,写入内容的时候默认是自动覆盖。
    FileOutputStream(String name)	name为文件路径
    FileOutputStream(String name, boolean append)	name为文件路径,append为true表示在文件末尾追加;为false表示清空文件内容,重新写入,默认为false
    FileOutputStream(File file)	
    FileOutputStream(File file, boolean append)	append为true表示在文件末尾追加;为false表示清空文件内容,重新写入,默认为false
    
    void write(int b)	将指定字节写入文件中
    void write(byte[] b)	将b.length个字节写入文件中
    void write(byte[] b, int off, int len)	将b素组off位置开始,len长度的字节写入文件中
    void flush()	刷新此输出流并强制写出所有缓冲的输出字节
    void close()	关闭文件输出流
    
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    public class FileOutputStreamTest01 {
        public static void main(String[] args) {
            FileOutputStream out = null;
            try {
                // myfile文件不存在的时候会自动新建!
                // 这种方式谨慎使用,这种方式会先将原文件清空,然后重新写入。
                //out = new FileOutputStream("myfile");
    
                // 以追加的方式在文件末尾写入。不会清空原文件内容。
                out = new FileOutputStream("test/myfile", true);
                // 开始写。
                byte[] bytes = {48, 49, 50, 51, '\n'};
                // 将byte数组全部写出!
                out.write(bytes);
                // 将byte数组的一部分写出!
                out.write(bytes, 1, 4);
    
                // 字符串
                String s = "my name is Jack!!!\n";
                // 将字符串转换成byte数组。
                byte[] bs = s.getBytes();
                // 写
                out.write(bs);
    
                // 写完之后,最后一定要刷新
                out.flush();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (out != null) {
                    try {
                        out.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    

3.字符流

  • 字符 的方式读取数据的,一次读取一个字符。
  • 这种流是为了方便读取 普通文本文件 而存在的,这种流不能读取:图片、声音、视频等文件。只能读取 纯文本文件,连word文件都无法读取。
    • 注意:纯文本文件,不单单是.txt文件,还包括 .java.ini.py 。总之只要 能用记事本打开 的文件都是普通文本文件。


  • 7
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小宝945

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值