IO流: 输入流 InputStream(抽象类):把数据读取到内存中(I) 输出流OutputStream:(抽象类):从内存中读取数据到硬盘中(O)
使用流的时候的注意事项:
所有导入 java.io下的jar包 需要注意异常 释放资源,关闭资源 流的分类: 按流向:分为输入流、输出流 按功能:字节流、字符流 OutputStream
公有的方法:
public void close() 关闭与释放资源 public void flush() 强制性刷新了缓存区 public void write(byte[] b) 将字节数据中的数据写入到输出流里 public void write(byte[] b,int off,int len) 将字节数组的数据指定区间写入到输出流里 public abstract void write(int b) 将字节写入到输出流里
子类:
ByteArrayOutputStream 字节输出流 FileOutputStream 文件输出流(重点) FilterOutputStream 过滤器输出流 ObjectOutputStream 对象输出流 PipedOutputStream 管道输出流
类:FileOutputStream: 用输出流写入数据:
1.实例化 FileOutputStream 2.调用其写的方法 3.关闭资源 构造方法:
public FileOutputStream(File file) public FileOutputStream(String name) 步骤: 1.实例化 FileOutputStream 2.如果这个文件不存在,会默认去常见这这个文件 3.把FileOutputStream 执行需要写入数据的位置(文件)
FileOutputStream写多个字节: public void write(byte[] b) 把字节数据里的数据写入到输出流里(硬盘里) 第一步需要实例化这个对象 写字符串 ==>需要把字符串转换成字节数组(getBytes()) 写入时,byte内容是负数时, 使用gbk的是两个负数表示一个汉字 使用utf-8的是三个负数是一个汉字 写入硬盘
向文件写入数据的一个原理: java–>jvm —>OS(操作系统)–>调用操作系统的写入方法
构造方法: 常规方法: public void close() throws IOException:关闭此输出流并释放与此流有关的所有系统资源。 public void flush() throws IOException:刷新此输出流并强制写出所有缓冲的输出字节。 public void write(byte[] b) throws IOException:将 b.length 个字节从指定的 byte 数组写入此输出流。 public abstract void write(int b) throws IOException:将指定的字节写入此输出流。 public void write(byte[] b, int off, int len): throws IOException将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。
InputStream:输入流(抽象方法) 无参构造。 常规方法:
返回的是当前输入流里的字节数:available() 关闭资源:close() 逐个字节读取:read() 把数据读取到字节数组:read(byte[] b) 读取指定区间的数据:read(byte[] b,int off,int len)
子类:FileInputStream 步骤:
创建 FileInputStream 把 FileInputStream 对象执行你要读取的文件的位置 原理:Java——> jvm——> OS(操作系统)——> 调用操作系统的读取方法 如果文件里的内容是 0-127 对应的ascall码表 如果是其它的对应是系统默认的 编码(GBK) 返回值读取的是具体的数据 (使用while循环来读取。) 构造方法 public FileInputStream(File file) public FileInputStream(String name) 常规方法: 同父类
public int read(byte[] b) 返回值 读取的有效字符的长度,-1表示读取到末尾。 read(byte[] b, int off, int len) 第一个参数是:把数据读取到数组里、第二个参数 从什么开始读、第三个参数是读取的长度、返回值是有效字节元素 read()和read(byte [ ] b)区别:
第一个是一个一个字节读。 读取到的数据放到缓冲区 第二个效率高 第一个返回的是具体的数据,后者是有效的字节数。 读取多个字节: 读取到的数据放到byte数组里, 使用String的构造方法把 byte[ ] bytes 转换成字符串。
BufferedInputStream: 带缓冲区,访问磁盘次数少,效率高 缓冲区不是越大越好,而是根据数据量来定的。 自带缓存区的类,内部封装了一个字节数组
构造方法 public BufferedInputStream(InputStream in); 常规方法: public int read() throws IOException;
BufferedOutputStream:
常规方法:
void flush()刷新此缓冲的输出流 (也就是把缓冲区的数据写入到文件里) void write(byte[] b, int off, int len)将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此缓冲的输出流。 void write(int b) flush();和close();: flush();调用流对象还可以使用 close();调用流对象不能使用,内部调用flush()方法;
使用bufferInputStream 与 bufferOutputStream 进行读写操作
先把四个类进行实例化 读取数据 写数据 关闭资源 死的步骤: flush() 一个是讲缓存区里的数据刷到文件中 close() 关闭资源 调用 flush() 方法之后流对象还可以使用 调用 close() 方法之后 流对象不能使用