Java IO流与文件(二)

Java IO流与文件(二)

IO流类

文件输入/出流

字节流
  1. FileInputStream和FileOutputStream负责完成对本地磁盘文件的顺序输出操作
  2. 构造方法
    • FileInputStream
      方法说明
      FileInputStream(File file)通过打开实际存在的file文件的连接创建一个FileInputStream
      FileInputStream(FileDescriptor fdObj)通过使用文件描述符fdObj创建一个FileInputStream,该文件描述符表示到系统某实际文件的现有链接
      FileInputStream(String name)通过文件系统路径名name打开一个实际文件链接以创建一个FileInputStream
      • 当文件不存在时,系统抛出java.io.FileNotFoundException
    • FileOutputStream
      方法说明
      FileOutputStream(File file)创建一个向指定File对象文件中写入数据的文件流输出
      FileOutputStream(String name)创建一个向指定名称的文件中写入数据的输出文件流
      FileOutputStream(File file,boolean append)创建一个向指定File对象表示的文件中写入数据的文件输出流
      FileOutputStream(String name,boolean append创建一个指定名称的文件中写入数据的输出文件流
      • 当文件不存在时,创建新文件
      • 当文件存在时,前两个构造方法删除文件原有内容,后两个方法则在文件原有内容上增加
字符流
  1. FileReader:读取文件
    • 是Reader和InputStreamReader的子类,故也可用Reader或InputStreamReader创建对象
    • 使用时,必须先调用FileReader()构造方法创建FileReader对象,再调用read()方法
    • 构造方法:
      • public FileReader(String name),据文件名创建可读取的输入流对象
      • public FileReader(File file)
    • 当文件不存在时,抛出java.io.FileNotFoundException
  2. FileWrite:写入文件
    • 是Writer和OutputStreamWriter的子类,可用Writer或OutputStreamWriter创建FileWriter对象
    • 使用时,必须先调用FilterWriter()构造方法创建FilterWriter对象,再调用writer()方法
    • 构造方法:
      • public FileWriter(String name):据文件名创建可写输出流对象
      • public FileWriter(File file)
      • public FileWriter(String name,boolean append):append为真时,数据追加在文件后面
      • public FileWriter(File file,boolean append)
    • 注意
      • 若文件不存在,则创建新文件
      • 若文件存在,则前两个构造方法清除文件原有内容,后两个方法将参数append为true时保留元原文件

缓冲流

  1. 作用:减少硬盘访问次数,提高效率
  2. 分为字节和字符缓冲流
    • 字节缓冲流
      • BufferedInputStream:字节输入缓冲流
        • 构造方法:
          • BufferedInputStream(InputStream in)
          • BufferedInputStream(InputStream in,int size)
            • size为设置缓冲区的大小
      • BufferedOutputStream:字节输出流
        • 构造方法
          • BufferedOutputStream(OutputStream out)
          • BufferedOutputStream(OutputStream out,int size)
      • 注意
        • 缓冲流的源和目的地是字节输入流和字节输出流
        • 只覆盖了基类方法
    • 字符缓冲流
      • 字符输入缓冲流:BufferedReader
        • 构造方法:
          • BufferedReader(Reader in)
          • BufferedReader(Reader in,int size)
        • 相关方法
          • String readLine():读取一个文本行
          • int read():读取单个字符
          • int read(char[] cbuf,int off,int len):将字符读入数组的某部分
      • 字符输出缓冲流:BufferedWriter
        • 构造方法
          • BufferedWriter(Writer out)
          • BufferedWriter(Writer out,int size)
        • 相关方法
          • void close():关闭流,需先刷新
          • void flush():刷新流缓冲区
          • void newLine():写入一个行分隔符
          • void write(int c):写入单个字符
          • void write(String s,int off,int len):写入字符串的某一部分
          • void write(char[] cbuf,int off,int len):写入字符数组的某一部分
        • 调用out的write方法时,不会回车,需则使用newLine()方法在每行数据后加回车,以保证目标文件与源文件一致
      • 源和目的地是字符输入流和字符输出流
  3. 原理
    • 在JVM中开辟一块缓冲区的内存空间,缓冲流将数据写/读到缓冲区,缓冲区满后再将数据写/读入至文件/程序里
  4. 缓冲区未满将不会被写入文件
    • 需关闭输出流,释放该资源,或用flush()强制写入

IO特殊操作流

  1. 标准输入/出流
    • System类中的两个静态成员变量
    • public static final InputStream in:标准输入流,通常对应于键盘输入或由主机环境或用户指定的另一个输入源
    • public static final PrintStream out:标准输出流,通常对应于显示输出或由主机环境或用户指定的另一个输出目标
    //Scanne原理r
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));	//创建字符缓冲输入流对象
    //输入字符
    String str = br.readLine();
    //标准输出流
    PrintStream ps = System.out;
    ``
    
  2. 字节打印流与字符打印流
    • 字节打印流:PrintStream
      • PrintStream(String fileName):使用指定的文件名创建新的打印流
        • 使用继承父类的方法写数据,查看的时候会转码
        • 使用自己的特有方法写数据,查看的数据原样输出可改变输出语句的目的地
      • public static void setOut(PrintStream out):重新分配“标准”输出流
    • 字符打印流:PrintWriter
      • 构造方法
        • PrintWriter(String fileName):使用指定文件名创建一个新的PrintWriter,而不需要自动执行刷新
        • PrintWriter(Writer out,booleanautoFlush):创建一个新的PrintWriter out:字符输出流;autoFlush:一个布尔值,如果为真,则println或format方法刷新输出缓冲区
    • 打印流特点:
      • 只负责输出流数据,不负责读取数据
      • 永远不会抛出IOException
      • 有自己的特有方法
  3. 对象序列化流
    • 对象序列化:将对象保存到磁盘中,或在网络传输对象
      • 这种机制就是使用一个字节序列表示一个对象
      • 该字节序列含:对象类型、对象的数据和对象中存储的属性信息
      • 字节写到文件后相当于文件中持久保存了一个对象的信息,反正也可从文件中读取,重构对象,对其进行反序列化
    • 对象序列化流:ObjectOutputStream
      • 将Java对象的原始数据类型和图形写入OutputStream。
      • 可使用ObjectOutputStream读取(重构)对象
      • 可通过使用流的文件来实现对象的持久存储
      • 若流是网络套接字流,则可在另一个主机上或另一个进程中重构对象
    • 构造方法:ObjectOutputStream(OutputStream)
      • 创建一个写入指定OutputStream的ObjectOutputStream
    • 序列化对象的方法:void writeObject(Object obj)
      • 将指定的对象写入ObjectOutputStream
  4. 对象反序列化流
    • ObjectInputStream:反序列化先前使用ObjectOutputStream编写的原始数据和对象
    • 构造方法:ObjectInputStream(InputStream in)
      • 创建从指定的InputStream读取ObjectInputStream
    • 反序列化对象方法:Object readObject()
      • 从ObjectInputStream读取一个对象
  5. serialVersionUID和transient
    • 用对象序列化后一个对象,若修改对象所属的类文件,读取数据会报无效类异常,需重新序列化或给对象所属的类加一个serialVersionUID
      • private static final long serialVersionUID = 42;
    • 若对象中某个成员变量不想被序列化,则给该成员变量加transient关键字修饰
    • 该关键字标记的成员变量不参与序列化过程

文件与目录管理

  1. 目录:
    • 是管理文件的特殊机制
    • 同类文件保存在同个目录下可简化文件管理,提高工作效率
  2. File类
    • java.io包中定义了File专门管理磁盘和目录
    • 每个File对象表示一个磁盘文件或目录
      • 其对象属性中含文件或目录的相关信息
        • 是文件或目录的抽象代表,并非真实存在,只是路径名,需通过操作转换为具体存在
        • 并不打开文件或目录,仅指定要操作的文件或目录
      • 一旦创建即不能更改,其路径无法改变
    • 通过调用File类提供的各种方法,能创建、删除、重命名、判断文件读写权限及是否存在、设置和查询文件最近修改时间等操作
    • 不同操作系统具不同的文件系统组织方式,通过使用File类对象,可用与平台无关、统一的方式处理文件和目录
    • 其不属于Java流系统,而是文件流进行文件操作的辅助类
    • 本身不能访问文件内容本身,而是输入/出流访问的文件内容
  3. 创建File类对象
    • 需给出其对应的文件名或目录名
    • 构造方法
      方法说明
      public File(String path)指定与File对象关联的文件或目录名,path含路径及文件和目录名
      public File(String path,String name)以path为路径,以name为文件或目录名创建File对象
      public File(File dir,String name)用现有的File对象dir作为目录,以name作为文件名或目录名创建File对象
      public File(UR ui)使用给定的统一资源定位符来定位文件
      • 注意
        • path参数可为绝对路径,也可为相对路径,也可为磁盘上某个目录
        • 由不同操作系统使用的目录分隔符不同,可使用System类的一个静态变量System.dirSep实现在不同操作系统下都通用的路径
  4. 获取属性和操作
    • 借助FIle类对象,获取文件和相关目录属性信息,并可对其进行管理操作
    • 常用方法
      方法说明
      boolean canRead()如果文件可读,返回真,否则返回假
      boolean canWrite()如果文件可写,返回真,否则返回假
      boolean exists()判断文件或目录是否存在
      boolean createNewFile()若文件不存在,则创建指定文件名的空文件,并返回真;若文件存在,则返回假
      boolean isFile()判断对象是否为有效文件
      boolean isDirector()判断对象是否为有效目录
      boolean equals(FIle f)比较两个文件或目录是否相同
      String getName()返回文件名或目录名的字符串
      String getPath()返回文件或目录路径的字符串
      public String getAbsolutePath()获取文件的绝对路径
      public String getParent()获取文件父目录
      public boolean isHidden()判断文件是否为隐藏文件
      long length()返回文件的字节数,若File对象代表目录,则返回0
      long lastModified()返回文件或目录最近一次修改时间
      String[] list()将目录中所有文件名保存在字符串数组中并返回,若File对象不是目录则返回null
      boolean delete()删除文件或目录,目录必须是空目录;删除成功返回真,否则返回假
      boolean mkdir()创建当前目录的子目录,成功返回真,失败返回假
      public boolean mkdirs()创建由此抽象路径名命名的目录,包括必须但不存在的父目录,即可创建多级目录
      boolean renameTo(File fnewfile)将文件重命名为指定文件名
      static File createTempFile(String prefix,String suffix)创建一个临时文件以prefix为前缀,sufifix为后缀
      File[] listFiles()返回目录所列文件,是一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件
      static File[] listRoots()列出可用的文件系统根

文件随机读写

  1. java.io包提供了RandomAccessFile类用于随机文件的创建和访问
    • 是Object的直接子类
  2. 作用
    • 可跳转到文件任意位置读写数据
    • 程序可在随机文件中插入数据,且不会破坏文件中其他数据
    • 程序可更新或删除先前存储的数据,而不用重写整个文件
  3. 构造方法
    方法说明
    public RandomAccessFile(String name,String mode)指定随机文件流对象对应的文件名,以mode表示对文件的访问调用模式
    public RandomAccessFile(File file,String mode)以file指定随机文件流对象所对应的文件名,以mode表示访问模式
    • mode表示创建的随机读/写文件的操作状态,其值包括
      • r :表示以只读方式打开文件
      • rw :表示以读写方式打开文件,该模式可对一个对象实现同时读写操作
  4. 常用方法
    方法说明
    long length()返回文件长度
    void seek(long pos)移动文件位置指示器,pos指定从文件开头的偏离字节数
    int skipBytes(int n)跳过n个字节,返回数为实际跳过的字节数
    int read()从文件中读取一个字节,字节的高24位为0,若遇到文件结尾,则返回-1
    final byte readByte()从文件中读取带符号的字节值
    final char readChar()从文件中读取一个Unicode字符
    final void writeChar(inte c)写入一个字符,为两个字节
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值