输入/输出
概述
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代表读取、写入,同步更新内容,不同步更新元数据