核心五个类(File Outputstream Inputstream Reader Writer)与一个接口(Serializable)
- File文件(真实文件、或路径)操作类
java.io包中唯一一个与文件本身操作有关(创建、删除、取得信息),与文件内容无关的程序类
File类的基本使用
- File类的实例化方式
public File(String pathname)
public File(String parent, String child)- 创建新文件
public boolean createNewFile() throws IOException- 判断文件是否存在
public boolean exists()- 删除文件
public boolean delete()- 分隔符
File.separator目录操作
- 取得父路径与父File对象
public String getParent()
public File getParentFile()- 创建目录(无论多少级父目录,都会一次创建)
public boolean mkdirs()- 取得文件信息
- 判断File对象是否存在
public boolean isFile()- 判断File对象是否是路径
public boolean isDirectory()- 取得文件大小
public long length()- 取得最后修改日期
public long lastModifiled()- 列举一个目录下全部组成
public File[] listFiles()IO相关处理属于阻塞式的耗时操作,一般放在子线程中进行
- 字节流与字符流
字节流 | 字符流 | |
---|---|---|
输入流 | Inputstream | Reader |
输出流 | OutputStream | Writer |
区别 | 字节流是原生操作 | 字符流是处理后操作 |
使用途径 | 一般使用字节流(无论是网络传输还是磁盘保存均以字节为单位) | 只有处理中文文本时才会使用字符流 |
- 流操作流程
无论是字节流还是字符流,操作流程几乎一样,以文件操作为例
- 取得file对象
- 取得file对象的输入、输出流
- 进行数据的读取或写入
- 关闭流
注意:IO操作属于资源处理,所有资源处理(IO、数据库、网络)使用后都必须关闭
- 字节流输出(OutputStream)
public abstract class OutputStream implements Closeable,Flushable
Closeable:public void close() throws IOException
Flushable:public void flush() throws IOException
输出方法–write
- 将指定的字节数组全部输出
public void write(byte[] b) throws IOException- 将部分字节数组内容输出
public void write(byte b[], int offset, int len) throws IOException- 输出单个字节
public abstract void write(int b) throws IOException- 进行文件内容的输出,使用FileOutputStream
- 接收File类(覆盖)
public FileOutputStream(File file) throws FileNotFoundException- 接收File类(追加)
public FileOutputStream(File file, boolean append)
- 当使用FileOutputStream进行文件内容输出时,只要文件的父路径存在,FileOutputStream会自动创建文件
AutoCloseable自动关闭支持–JDK1.7,使用自动关闭接口有一个前提,需要结合try…catch…
- 字节输入流(Inputstream)
输入方法–read
public int read(byte b[]) throws IOException 最常用方法
- 返回值三种情况
- 返回b长度
当读取的数据大小>字节数组大小- 返回大于0但小于b长度
读取数据大小<字节数组大小- 返回-1
读取完毕
- 读取单个字节
public abstract int read() throws IOException
- 字符输出流Writer
public abstract class Writer implements Appendable, Closeable, Flushable
与OutputStream相比多了一个Appendable接口
- 除了参数为字符数组外,多了一个传入String对象的方法
public void write(String str) throws IOException
- 字符输入流Reader
- Reader类中没有方法可以直接读取字符串,只能通过字符数组来读取
- 字符流适合处理中文,字节流适合处理一切数据类型(对中文支持不好)
- 字节流与字符流对比
- 如果从实际开发来讲,字节流一定是优先考虑的,只有在处理中文时才会考虑字符流
- 所有字符流的操作,无论是写入还是输出,数据都先保存在缓存中。
- 转换流:将字节流变为字符流
转换流用于将底层的字节流转为字符流供子类使用。
- OutputStreamWriter:字节输出流->字符输出流
- InputStreamReader:字节输入流->字符输入流
- 字符编码
- GBK、GB2312:国标编码。GBK既包含简体中文也包含繁体中文,而GB2312只包含简体中文。
- UNICODE:java提供的16进制编码,可以描述世界上任意的文字。由于采用16进制编码,导致编码体积过大,造成网络传输负担
- ISO-8859-1:浏览器默认编码,国际通用编码,不支持中文。
- UTF编码(UTF-8):相当于结合了ISO-8859和UNICODE编码,支持所有语言且体积较小。
注意:乱码产生原因(95%):编解码不一致
- 内存流
除了文件之外,IO操作也可能发生在内存中,发生在内存中的操作流称为内存流。
内存流也分为两类
- 字节内存流
ByteArrayInputStream、ByteArrayOutputStream- 字符内存流
CharArrayReader、CharArrayWriterpublic ByteArrayOutputStream()
public ByteArrayInputStream(byte buf[ ])
- 打印流(输出流进化版)
打印流应用的是装饰设计模式(基于抽象类设计模式):核心依然是某个类(OutputStream)的功能(write( ))但是为了得到更好的操作效果,让其支持的功能更多。
系统提供的两大打印流
PrintStream:字节打印流
PrintWriter:字符打印流
优点:扩展功能特别方便,需要不同的功能、时只需要更换装饰类即可。
缺点:类结构复杂。
- System对IO的支持
输出(均是打印流PrintStream的对象)
- 标准输出(显示器)
System.out- 错误输出
System.err输入(输入流InputStream的对象)
- 标准输入(键盘)
System.in
- 两种输入流(原生InputStream的进化版)
BufferedReader(了解即可)
- readLine():读取一行输入
Scanner(主要用它)-java.util.Scanner
- 判断是否有指定类型数据输入:public boolean hasNextXXX( )
- 取得指定类型数据:public 数据类型 nextXXX( )
- 自定义分隔符:public Scanner useDelimiter(Pattern pattern)
总结:输出流就是用打印流,输入就用Scanner类