[笔记] Java基础(9)-文件与IO流

225 阅读9分钟

1. File类

  • File类:java.io.File
  • File(String pathname):根据路径构造File对象
  • File(String parent, String child):根据父路径与子路径构造File对象
  • File(File parent, String child):根据父路径的File对象与子路径构造File对象
  • boolean createNewFile():创建文件,如果文件已存在则返回false
  • boolean exists():判断该路径是否存在
  • boolean mkdir():创建文件夹,不会创建父级目录
  • boolean mkdirs():创建文件夹,当父级目录不存在时会创建父级目录
  • boolean renameTo(File dest):重命名指定路径,路径不同时移动文件
  • boolean delete():删除文件或文件夹;如果删除文件夹,该文件夹必须为空
  • boolean isDirectory():判断是否是目录
  • boolean isFile():判断是否是文件
  • boolean canRead():判断是否可读;windows下所有文件都是可读的
  • boolean canWrite():判断是否可写
  • boolean isHidden():判断是否隐藏
  • boolean setReadable():设置是否可读;windows下无效
  • boolean setWritable():设置是否可写
  • String getAbsolutePath():获取绝对路径
  • String getPath():获取路径;路径为构造是传入的路径
  • String getName():获取名称
  • long length():获取长度,单位为字节数;文件夹的长度为0,获取文件夹大小可使用递归获取所有子文件大小再求和
  • long lastModified():获取最后一次修改时间
  • String[] list():获取指定目录下的所有文件与文件夹的名称
  • File[] listFiles():获取指定目录下的所有文件与文件夹组成的File对象数组
  • String list(FilenameFilter filter):获取满足过滤器的文件名
    • FilenameFilter接口:java.io.FilenameFilter
    • boolean accept(File dir, String name):根据结果决定文件列表是否包含;返回true时,文件列表包含该文件

2. IO流

  • IO流:用于处理设备之间的数据传输
  • 按流向分为:输入流与输出流
  • 按操作类型分为:字节流与字符流;字节流可操作任何数据,字符流只能操作文本数据
  • 超类:为抽象类
    • 字节流:InputStreamOutputStream
    • 字符流:ReaderWriter
  • IO流操作:导包 >> 异常处理 >> 释放资源
  • 简单文件加密:可利用一个数被另一个数异或两次结果不变原理
  • 字符流:字节读写字符;读取时将字节转成字符,写入时将字符转为字节

3. FileInputStream类

  • FileInputStream类:java.io.FileInputStream
  • 该类继承于InputStream
  • FileInputStream(File file):通过File对象创建输入流
  • FileInputStream(String name):通过文件名创建输入流
  • int read():读取一个字节,到末尾时返回-1
  • int read(byte[] buf):读取最多buf.length个字节到数组中,返回读取到的字节个数,到末尾时返回-1
  • int available():获取该输入流剩余的字节数
  • void close():关闭输入流
  • 典型语句:int n; while((n = f.read()) != -1) { ... }

4. FileOutputStream类

  • FileOutputStream类:java.io.FileOutputStream
  • 该类继承于OutputStream
  • FileOutputStream(File file):通过File对象创建输出流,若没有文件则新建文件
  • FileOutputStream(String name):通过文件名创建输入流,若没有文件则新建文件
  • FileOutputStream(String name, boolean append)appendtrue时为追加写入;appendfalse时会将原有的文件清空再写入,默认为false;若没有文件则新建文件
  • void write(byte[] buf):将数组写入到输出流
  • void write(byte[] buf, int off, int len):将bufoff开始的len个字节写入到输出流
  • void write(int b):将b去掉前3个字节写入到输出流
  • void close():关闭输出流

5. BufferedInputStream类

  • BufferedInputStream类:java.io.BufferedInputStream
  • BufferedInputStream(InputStream in):由InputStream对象创建缓冲输入流
  • int read():读取1个字节
  • int read(byte[] buf, int off, int len):读取len个字节到数组
  • void close():关闭缓冲输入流;关闭后对应的InputStream流也关闭
  • 默认内置数组大小为8192字节

6. BufferedOutputStream类

  • BufferedOutputStream类:java.io.BufferedOutputStream
  • BufferedOutputStream(OutputStream out):由OutputStream对象创建缓冲输出流
  • void write(int b):写入1个字节,自动去掉b的高24
  • void write(byte[] buf, int off, int len):将bufoff开始的len个字节写入
  • void flush():刷新缓冲输出流
  • void close():关闭缓冲输入流,close之前会将剩余的数据刷新;关闭后对应的InputStream流也关闭
  • 字节流读取中文时,可能会出现乱码;写中文时必须先使用getBytes()方法转成字节数组

7. IO流异常处理

  • JDK1.7之前

    FileInputStream fis = null;
    FileOutputStream fos = null;
    try {
        fis = new FileInputStream("xxx");
        fos = new FileOutputStream("xxx");
        ...
    } finally {
        try {
            if (fis != null) {
                fis.close();
            }
        } finally {
            if (fos != null) {
                fos.close();
            }
        }
    }
    
  • JDK1.7之后

    /* 执行完大括号内语句后,自动调用对象的close()方法 */
    /* 该格式需要小括号内的对象实现AutoCloseable接口,否则会报错 */
    try (FileInputStream fis = new FileInputStream("xxx");
    	FileOutputStream fos = new FileOutputStream("xxx")) {
            ...
    	}
    

8. FileReader类

  • FileReader类:java.io.FileReader
  • 该类继承于InputStreamReader
  • FileReader(File file):根据File对象构造字符输入流
  • FileReader(String filename):根据文件名构造字符输入流
  • int read():读取单个字符,末尾返回-1
  • int read(char[] buf, int offset, int length):读入字符到数组
  • void close():关闭字符输入流

9. FileWriter类

  • FileWriter类:java.io.FileWriter
  • 该类继承于OutputStreamWriter
  • FileWriter(File file):根据File对象构造字符输出流
  • FileWriter(String filename):根据文件名构造字符输出流
  • FileWriter(String filename, boolean append):根据文件名构造字符输出流;appendtrue时为追加写入文件,默认为false,为清空文件
  • void write(int c):写入单个字符,自动去掉int的高16
  • void write(char[] buf, int off, int len):写入数组的一部分到字符输出流
  • void write(String s, int off, int len):写入字符串的一部分到字符输出流
  • void flush():刷新缓冲区
  • void close():关闭字符输出流
  • 默认字符流的内置数组大小为1024个字符(2048字节)
  • 字符流不可以用于拷贝非纯文本文件,因为在将字节转为字符是若找不到对应的字符就会用?代替,写出时相当于写出的是?

10. BufferedReader类

  • BufferedReader类:java.io.BufferedReader
  • BufferedReader(Reader in):根据Reader对象构造缓冲字符输入流
  • String readLine():读取一行,末尾时返回null;行结束符\r\n

11. BufferedWriter类

  • BufferedWriter类:java.io.BufferedWriter
  • BufferedWriter(Writer out):根据Writer对象构造缓冲字符输出流
  • void newLine():写入一个行分隔符;Windows下为\r\nLinux下为\nMac下为\r
  • 默认内置数组大小为8192个字符(16K字节)

12. LineNumberReader

  • LineNumberReader类:java.io.LineNumberReader
  • 该类继承于BufferedReader
  • LineNumberReader(Reader in):根据Reader对象构造LineNumberReader
  • int getLineNumber():获取当前行号,默认从0开始
  • void setLineNumber():设置当前行号,不会改变流中的读取位置

13. InputStreamReader类

  • InputStreamReader类:java.io.InputStreamReader
  • InputStreamReader(InputStream in, String charset):创建指定字符集的InputStreamReader对象,如utf-8gbk
  • 该对象可将字符流与字节流相互转换
  • 可使用BufferedReader对该对象进行再次包装

14. OutputStreamWriter类

  • OutputStreamWriter类:java.io.OutputStreamWriter
  • OutputStreamWriter(OutputStream out, String charset):创建指定字符集的InputStreamWriter对象,如utf-8gbk
  • 该对象可将字符流与字节流相互转换
  • 可使用BufferedWriter对该对象进行再次包装

15. SequenceInputStream类

  • SequenceInputStream类:java.io.SequenceInputStream
  • SequenceInputStream(InputStream s1, InputStream s2):由s1s2构造序列流,先读取s1再读取s2,该方法整合两个输入流
  • SequenceInputStream(Enumeration<? extens InputStream> e):将多个输入流整合为一个输入流
    • Enumeration对象可通过Vector类的elements方法获取,即先将InputStream添加到Vector集合中,再返回相应的对象
  • int read():读取
  • int read(bytep[] b, int off, int len):读取指定长度
  • void close():关闭序列流,会将s1s2都关闭

16. ByteArrayOutputStream类

  • ByteArrayOutputStream类:java.io.ByteArrayOutputStream
  • ByteArrayOutputStream():创建内存输出流,数据写入到内存中的数组
  • void write(int b):写入单个字节
  • void write(byte[] b, int off, int len):写入指定长度的字节
  • int size():获取当前缓冲区的大小
  • byte[] toByteArray():将缓冲区的内容存入数组并返回
  • String toString():使用默认字符集,将缓冲区的内容转为字符串
  • void close():无效,不用关闭
  • 内存输出流是将数据全部存放在内存中再读出来,可解决中文乱码

17. RandomAccessFile类

  • RandomAccessFile类:java.io.RandomAccessFile
  • 该类继承于Object类,不属于流
  • RandomAccessFile(File file, String mode):通过File对象构造
  • RandomAccessFile(String name, String mode):通过文件名构造
  • int read():读取
  • int read(byte[] b):读取
  • int read(byte[] b, int off, int len):读取
  • String readLine():读取一行
  • void write(int b):写入
  • void write(byte[] b):写入
  • void write(byte[] b, int off, int len):写入
  • void seek(long pos):设置访问位置指针,从0开始
  • 该类可以读取或写入一个ByteCharDoubleIntFloatLongBoolean
  • 该类包含InputStreamOutputStream的功能,支持对文件的随机访问

18. ObjectOutputStream类

  • ObjectOutputStream类:java.io.ObjectOutputStream
  • ObjectOutputStream(OutputStream out):由out创建对象输出流
  • void writeObject(Object obj):将对象写入流,即序列化,被写入的对象必须实现Serializable接口
  • 实现Serializable的类可以添加serialVersionUID常量,用于标识类的版本,默认id号是随机的
  • 序列化:将对象写出到文件中
  • 反序列化:从文件中读出对象

19. ObjectInputStream类

  • ObjectInputStream类:java.io.ObjectInputStream
  • ObjectInputStream(InputStream in):由in创建对象输入流
  • Object readObject():从流中读取对象,即反序列化
  • 序列化时有多个对象时,可先将这些对象存入到集合中,再把集合序列化,这样只需要读取一次即可,避免出现EOFException

20. DataOutputStream类

  • DataOutputStream类:java.io.DataOutputStream
  • DataOutputStream(OutputStream out):创建数据输出流对象
  • void write(int b):写入
  • void write(byte[] b, int off, int len):写入
  • void writeBoolean(boolean value):写值,占1B
  • void writeChar(char value):写值,占2B
  • void writeShort(short value):写值,占2B
  • void writeInt(int value):写值,占4B
  • void wirteLong(long value):写值,占8B
  • void wirteByte(byte value):写值,占1B
  • void writeFloat(float value):写值,占4B
  • void writeDouble(double value):写值,占8B

21. DataInputStream类

  • DataInputStream类:java.io.DataInputStream
  • DataInputStream(InputStream in):创建数据输入流对象
  • boolean readBoolean(boolean value):读值,占1B
  • char readChar(char value):读值,占2B
  • short readShort(short value):读值,占2B
  • int readInt(int value):读值,占4B
  • long readLong(long value):读值,占8B
  • byte readByte(byte value):读值,占1B
  • float readFloat(float value):读值,占4B
  • double readDouble(double value):读值,占8B

22. PrintStream类

  • PrintStream类:java.io.PrintStream
  • PrintStream(OutputStream out):创建打印流字节流
  • void print():打印
  • void println():打印并换行,支持自动刷出,即该方法会刷新缓冲区
  • void write(int b):写入字节

23. PrintWriter类

  • PrintWriter类:java.io.PrintWriter
  • PrintWriter(OutputStream out):创建打印字符流
  • void print():打印
  • void println():打印并换行,支持自动刷出,即该方法会刷新缓冲区
  • void write(int b):写入字符

24. Properties类

  • Properties类:java.util.Properties
  • 该类继承于Hashtable
  • Properties():创建无默认值的属性列表
  • Object put(Object key, Object value):添加,键值都为String
  • Object setProperty(String key, String value):底层调用put方法
  • String getProperty(String key):获取key对应的属性
  • Enumeration<?> propertyNames():返回所有键的枚举
    • Enumeration类:java.util.Enumeration
    • boolean hasMoreElements():判断是否有元素
    • E nextElement():获取下一个元素
  • void load(InputStream in):从输入流中读取属性
  • void store(OutputStream out, String comments):将属性写入输出流;comments为描述,可传入null
  • 该类没有泛型,键值类型为String
  • 配置文件建议后缀为.properties