天天看点

【Java基础】I/O流输入/输出

输入/输出

概述

java.io包

输入、输出两种IO流

  • 字节流和字符流

使用装饰器模式

java7的java.nio

File类——访问文件和目录

访问文件名相关的方法

  • String getName():返回此File对象所表示的文件名或路径名
  • String getPath():返回此File对象的绝对路径
  • File getAbsoluteFile():返回此File对象的绝对路径
  • String getAbsoltePath():返回此File对象所对应的绝对路径名
  • String getParent():返回此File对象所对应目录的父目录名
  • boolean renameTo(File newName):重命名此File对象所对应的文件或目录,如果重命名成功返回true,可以用于移动文件

文件检测相关的方法

  • boolean exists():文件或目录是否存在
  • boolean canWrite():文件或目录是否可写
  • boolean canRead():
  • boolean isFile():是否是文件,不是目录
  • boolean isDirectory():是否是目录,不是文件
  • boolean isAbsolute():文件或目录是否是绝对路径,跨平台,UNIX/linux/BSD的绝对路径以“/”开头,windows则以盘符开头

获取常规文件信息

  • long lastModified():返回文件的最后修改时间
  • long length():返回文件内容的长度

文件操作相关的方法

  • boolean createNewFile():当此File对象所对应的文件不存在时,新建一个新文件,成功则返回true
  • boolean delete():删除File对象所对应的文件或路径
  • static File createTempFile(Strng prefix,String suffix):
  • static File createTempFile(String prefix,String suffix,File directory)
  • void deleteOnExit():注册一个删除钩子,指定当Java虚拟机退出时,删除File对象所对应的文件和目录

目录操作相关的方法

  • boolean mkdir():创建文件夹,成功则返回true
  • String[] list():列出所有文件名和路径名
  • File[] listFiles():列出所有子文件和路径
  • static File[] listRoots():列出系统所有的根路径

文件过滤器

  • FilenameFilter接口包含 accept(File dir,String name)
  • File file = new File("");

    file.list((dir,name)->name.endsWith(".java")||new File(name).isDirectory());

流的分类

输入流和输出流

  • 输入流:只能从中读取数据,不能写入数据
  • 输出流:只能向其写入数据,不能读取数据

字节流和字符流

  • 字节流和字符流的用法几乎完全一样,区别在于两者所操作的单元不同,字节流操作的数据单元是8位的字节,而字符流操作的数据单元是16位的字符
  • 字节流主要由InputStream和OutputStream作为基类,而字符流则主要由Reader和Writer作为基类

节点流和处理流

  • 可以从/向一个特定的IO设备读/写数据的流,称为节点流,也叫低级流
  • 处理流用于对一个已存在的流进行连接或封装,通过封装后的流来实现数据读/写功能,也叫高级流

概念模型

  • InputStream/Reader
  • OutputStream/Writer
  • 功能
    • 性能的提高
    • 操作的便捷

字节流和字符流

字节流(最小数据单元是8位的字节byte)InputStream和OutputStream

  • int read()读取单个字节
  • int read(byte[] b)读取最多b.length个字节
  • int read(byte[] b,int offset,int len)读取最多len个字节,从offset开始
  • void write(int i)指定字节/字符到输出流
  • void write(byte[] b)读取最多b.length个字节到输出流
  • void write(byte[] b,int offset,int len)读取最多len个字节到输出流,从offset开始

字符流(最小数据单元是16位的字符char)Reader和Writer

  • int read()读取单个字节
  • int read(char[] c)读取最多b.length个字符输出流
  • int read(char[] c,int offset,int len)读取最多len个字符,从offset开始
  • void write(int i)指定字节/字符到输出流
  • void write(char[] c)读取最多b.length个字符
  • void write(char[] c,int offset,int len)读取最多len个字符到输出流,从offset开始

移动记录指针

输入/输出流体系

处理流的用法

  • 在创建处理流时传入一个节点流作为构造器参数即可,包装该节点流的处理流

体系

文本内容——字符流

二进制内容——字节流

转换流

  • BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  • OutputStreamWriter

推回流(推回缓冲区,重新再读,优先读取刚被退回的内容)

  • PushbackInputStream和PushbackReader

重定向标准输入/输出

Java虚拟机读写其他进程的数据

InputStream getErrorStream():获取子进程的错误流

InputStream getInputStream():获取子进程的输入流

OutputStream getOutputStream():获取子进程的输出流

RandomAccessFile

可以任意位置访问,raf.seek(位置)

mode

  • r代表只读
  • rw代表读取、写入,如果文件不存在则尝试创建
  • rws代表读取、写入,需要同步更新文件和元数据,一次写入文件
  • rwd代表读取、写入,同步更新内容,不同步更新元数据

对象序列化

概述

使用对象流实现序列化

对象引用的序列化

自定义序列化

另一种自定义序列化机制

NIO

Java7的NIO.2