Java IO流与文件(二)
IO流类
文件输入/出流
字节流
- FileInputStream和FileOutputStream负责完成对本地磁盘文件的顺序输出操作
- 构造方法
- 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 创建一个指定名称的文件中写入数据的输出文件流 - 当文件不存在时,创建新文件
- 当文件存在时,前两个构造方法删除文件原有内容,后两个方法则在文件原有内容上增加
- FileInputStream
字符流
- FileReader:读取文件
- 是Reader和InputStreamReader的子类,故也可用Reader或InputStreamReader创建对象
- 使用时,必须先调用FileReader()构造方法创建FileReader对象,再调用read()方法
- 构造方法:
- public FileReader(String name),据文件名创建可读取的输入流对象
- public FileReader(File file)
- 当文件不存在时,抛出java.io.FileNotFoundException
- 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时保留元原文件
缓冲流
- 作用:减少硬盘访问次数,提高效率
- 分为字节和字符缓冲流
- 字节缓冲流
- BufferedInputStream:字节输入缓冲流
- 构造方法:
- BufferedInputStream(InputStream in)
- BufferedInputStream(InputStream in,int size)
- size为设置缓冲区的大小
- 构造方法:
- BufferedOutputStream:字节输出流
- 构造方法
- BufferedOutputStream(OutputStream out)
- BufferedOutputStream(OutputStream out,int size)
- 构造方法
- 注意
- 缓冲流的源和目的地是字节输入流和字节输出流
- 只覆盖了基类方法
- BufferedInputStream:字节输入缓冲流
- 字符缓冲流
- 字符输入缓冲流: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()方法在每行数据后加回车,以保证目标文件与源文件一致
- 构造方法
- 源和目的地是字符输入流和字符输出流
- 字符输入缓冲流:BufferedReader
- 字节缓冲流
- 原理
- 在JVM中开辟一块缓冲区的内存空间,缓冲流将数据写/读到缓冲区,缓冲区满后再将数据写/读入至文件/程序里
- 缓冲区未满将不会被写入文件
- 需关闭输出流,释放该资源,或用flush()强制写入
IO特殊操作流
- 标准输入/出流
- 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; ``
- 字节打印流与字符打印流
- 字节打印流:PrintStream
- PrintStream(String fileName):使用指定的文件名创建新的打印流
- 使用继承父类的方法写数据,查看的时候会转码
- 使用自己的特有方法写数据,查看的数据原样输出可改变输出语句的目的地
- public static void setOut(PrintStream out):重新分配“标准”输出流
- PrintStream(String fileName):使用指定的文件名创建新的打印流
- 字符打印流:PrintWriter
- 构造方法
- PrintWriter(String fileName):使用指定文件名创建一个新的PrintWriter,而不需要自动执行刷新
- PrintWriter(Writer out,booleanautoFlush):创建一个新的PrintWriter out:字符输出流;autoFlush:一个布尔值,如果为真,则println或format方法刷新输出缓冲区
- 构造方法
- 打印流特点:
- 只负责输出流数据,不负责读取数据
- 永远不会抛出IOException
- 有自己的特有方法
- 字节打印流:PrintStream
- 对象序列化流
- 对象序列化:将对象保存到磁盘中,或在网络传输对象
- 这种机制就是使用一个字节序列表示一个对象
- 该字节序列含:对象类型、对象的数据和对象中存储的属性信息
- 字节写到文件后相当于文件中持久保存了一个对象的信息,反正也可从文件中读取,重构对象,对其进行反序列化
- 对象序列化流:ObjectOutputStream
- 将Java对象的原始数据类型和图形写入OutputStream。
- 可使用ObjectOutputStream读取(重构)对象
- 可通过使用流的文件来实现对象的持久存储
- 若流是网络套接字流,则可在另一个主机上或另一个进程中重构对象
- 构造方法:ObjectOutputStream(OutputStream)
- 创建一个写入指定OutputStream的ObjectOutputStream
- 序列化对象的方法:void writeObject(Object obj)
- 将指定的对象写入ObjectOutputStream
- 对象序列化:将对象保存到磁盘中,或在网络传输对象
- 对象反序列化流
- ObjectInputStream:反序列化先前使用ObjectOutputStream编写的原始数据和对象
- 构造方法:ObjectInputStream(InputStream in)
- 创建从指定的InputStream读取ObjectInputStream
- 反序列化对象方法:Object readObject()
- 从ObjectInputStream读取一个对象
- serialVersionUID和transient
- 用对象序列化后一个对象,若修改对象所属的类文件,读取数据会报无效类异常,需重新序列化或给对象所属的类加一个serialVersionUID
- private static final long serialVersionUID = 42;
- 若对象中某个成员变量不想被序列化,则给该成员变量加transient关键字修饰
- 该关键字标记的成员变量不参与序列化过程
- 用对象序列化后一个对象,若修改对象所属的类文件,读取数据会报无效类异常,需重新序列化或给对象所属的类加一个serialVersionUID
文件与目录管理
- 目录:
- 是管理文件的特殊机制
- 同类文件保存在同个目录下可简化文件管理,提高工作效率
- File类
- java.io包中定义了File专门管理磁盘和目录
- 每个File对象表示一个磁盘文件或目录
- 其对象属性中含文件或目录的相关信息
- 是文件或目录的抽象代表,并非真实存在,只是路径名,需通过操作转换为具体存在
- 并不打开文件或目录,仅指定要操作的文件或目录
- 一旦创建即不能更改,其路径无法改变
- 其对象属性中含文件或目录的相关信息
- 通过调用File类提供的各种方法,能创建、删除、重命名、判断文件读写权限及是否存在、设置和查询文件最近修改时间等操作
- 不同操作系统具不同的文件系统组织方式,通过使用File类对象,可用与平台无关、统一的方式处理文件和目录
- 其不属于Java流系统,而是文件流进行文件操作的辅助类
- 本身不能访问文件内容本身,而是输入/出流访问的文件内容
- 创建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实现在不同操作系统下都通用的路径
- 注意
- 获取属性和操作
- 借助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() 列出可用的文件系统根
文件随机读写
- java.io包提供了RandomAccessFile类用于随机文件的创建和访问
- 是Object的直接子类
- 作用
- 可跳转到文件任意位置读写数据
- 程序可在随机文件中插入数据,且不会破坏文件中其他数据
- 程序可更新或删除先前存储的数据,而不用重写整个文件
- 构造方法
方法 说明 public RandomAccessFile(String name,String mode) 指定随机文件流对象对应的文件名,以mode表示对文件的访问调用模式 public RandomAccessFile(File file,String mode) 以file指定随机文件流对象所对应的文件名,以mode表示访问模式 - mode表示创建的随机读/写文件的操作状态,其值包括
- r :表示以只读方式打开文件
- rw :表示以读写方式打开文件,该模式可对一个对象实现同时读写操作
- mode表示创建的随机读/写文件的操作状态,其值包括
- 常用方法
方法 说明 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) 写入一个字符,为两个字节