JavaIO--BIO操作

核心五个类(File Outputstream Inputstream Reader Writer)与一个接口(Serializable)

  • File文件(真实文件、或路径)操作类
    java.io包中唯一一个与文件本身操作有关(创建、删除、取得信息),与文件内容无关的程序类

File类的基本使用

  1. File类的实例化方式
    public File(String pathname)
    public File(String parent, String child)
  2. 创建新文件
    public boolean createNewFile() throws IOException
  3. 判断文件是否存在
    public boolean exists()
  4. 删除文件
    public boolean delete()
  5. 分隔符
    File.separator

目录操作

  1. 取得父路径与父File对象
    public String getParent()
    public File getParentFile()
  2. 创建目录(无论多少级父目录,都会一次创建)
    public boolean mkdirs()
  3. 取得文件信息
  • 判断File对象是否存在
    public boolean isFile()
  • 判断File对象是否是路径
    public boolean isDirectory()
  • 取得文件大小
    public long length()
  • 取得最后修改日期
    public long lastModifiled()
  • 列举一个目录下全部组成
    public File[] listFiles()

IO相关处理属于阻塞式的耗时操作,一般放在子线程中进行

  • 字节流与字符流
字节流字符流
输入流InputstreamReader
输出流OutputStreamWriter
区别字节流是原生操作字符流是处理后操作
使用途径一般使用字节流(无论是网络传输还是磁盘保存均以字节为单位)只有处理中文文本时才会使用字符流
  • 流操作流程

无论是字节流还是字符流,操作流程几乎一样,以文件操作为例

  1. 取得file对象
  2. 取得file对象的输入、输出流
  3. 进行数据的读取或写入
  4. 关闭流

注意:IO操作属于资源处理,所有资源处理(IO、数据库、网络)使用后都必须关闭

  • 字节流输出(OutputStream)
public abstract class OutputStream implements Closeable,Flushable
		Closeable:public void close() throws IOException
		Flushable:public void flush() throws IOException

输出方法–write

  1. 将指定的字节数组全部输出
    public void write(byte[] b) throws IOException
  2. 将部分字节数组内容输出
    public void write(byte b[], int offset, int len) throws IOException
  3. 输出单个字节
    public abstract void write(int b) throws IOException
  4. 进行文件内容的输出,使用FileOutputStream
  • 接收File类(覆盖)
    public FileOutputStream(File file) throws FileNotFoundException
  • 接收File类(追加)
    public FileOutputStream(File file, boolean append)
  1. 当使用FileOutputStream进行文件内容输出时,只要文件的父路径存在,FileOutputStream会自动创建文件

AutoCloseable自动关闭支持–JDK1.7,使用自动关闭接口有一个前提,需要结合try…catch…

  • 字节输入流(Inputstream)

输入方法–read
public int read(byte b[]) throws IOException 最常用方法

  1. 返回值三种情况
  • 返回b长度
    当读取的数据大小>字节数组大小
  • 返回大于0但小于b长度
    读取数据大小<字节数组大小
  • 返回-1
    读取完毕
  1. 读取单个字节
    public abstract int read() throws IOException
  • 字符输出流Writer
public abstract class Writer implements Appendable, Closeable, Flushable

与OutputStream相比多了一个Appendable接口

  1. 除了参数为字符数组外,多了一个传入String对象的方法
    public void write(String str) throws IOException
  • 字符输入流Reader
  1. Reader类中没有方法可以直接读取字符串,只能通过字符数组来读取
  2. 字符流适合处理中文,字节流适合处理一切数据类型(对中文支持不好)
  • 字节流与字符流对比
  1. 如果从实际开发来讲,字节流一定是优先考虑的,只有在处理中文时才会考虑字符流
  2. 所有字符流的操作,无论是写入还是输出,数据都先保存在缓存中。
  • 转换流:将字节流变为字符流

转换流用于将底层的字节流转为字符流供子类使用。

  1. OutputStreamWriter:字节输出流->字符输出流
  2. InputStreamReader:字节输入流->字符输入流
  • 字符编码
  1. GBK、GB2312:国标编码。GBK既包含简体中文也包含繁体中文,而GB2312只包含简体中文。
  2. UNICODE:java提供的16进制编码,可以描述世界上任意的文字。由于采用16进制编码,导致编码体积过大,造成网络传输负担
  3. ISO-8859-1:浏览器默认编码,国际通用编码,不支持中文。
  4. UTF编码(UTF-8):相当于结合了ISO-8859和UNICODE编码,支持所有语言且体积较小。

注意:乱码产生原因(95%):编解码不一致

  • 内存流
    除了文件之外,IO操作也可能发生在内存中,发生在内存中的操作流称为内存流。

内存流也分为两类

  1. 字节内存流
    ByteArrayInputStream、ByteArrayOutputStream
  2. 字符内存流
    CharArrayReader、CharArrayWriter

public ByteArrayOutputStream()
public ByteArrayInputStream(byte buf[ ])

  • 打印流(输出流进化版)
    打印流应用的是装饰设计模式(基于抽象类设计模式):核心依然是某个类(OutputStream)的功能(write( ))但是为了得到更好的操作效果,让其支持的功能更多。

系统提供的两大打印流

  1. PrintStream:字节打印流

  2. PrintWriter:字符打印流

  3. 优点:扩展功能特别方便,需要不同的功能、时只需要更换装饰类即可。

  4. 缺点:类结构复杂。

  • 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类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值