IO流
-
什么是IO:就是将数据的传输看做是一种数据的流动 按照流动的方向 以内存为基准 分为 输入
input
和 输出output
即流向内存是输入流 流出内存的输出流 Java中I/O操作主要是指使用java.io
包下的内容,进行输入、输出操作 输入也叫做读取数据 输出也叫做作写出数据 -
IO的分类:不同的分类标准有不同种的分类
- 根据数据的流向分为:输入流和输出流
- 输入流 :把数据从
其他设备
上读取到内存
中的流 - 输出流 :把数据从
内存
中写出到其他设备
上的流
- 输入流 :把数据从
- 根据数据的类型分为:字节流和字符流
- 字节流 :以
字节
为单位,读写数据的流 - 字符流 :以
字符
为单位,读写数据的流
- 字节流 :以
- 根据数据的流向分为:输入流和输出流
-
字节流
-
java.io.OutputStream
抽象类是表示字节输出流的所有类的超类 将指定的字节信息写出到目的地- 定义了字节输出流的基本共性功能方法: (这五种方法都常用)
public void close()
:关闭此输出流并释放与此流相关联的任何系统资源 当完成流的操作时 必须调用此方法 释放系统资源public void flush()
:刷新此输出流并强制任何缓冲的输出字节被写出public void write(byte[] b)
:将 b.length字节从指定的字节数组写入此输出流public void write(byte[] b, int off, int len)
:从指定的字节数组写入 len字节,从偏移量 off开始输 出到此输出流public abstract void write(int b)
:将指定的字节输出流
- 定义了字节输出流的基本共性功能方法: (这五种方法都常用)
-
FileOutputStream类
是java.io.FileOutputStream
子类是文件输出流 用于将数据写出到文件- 构造方法:
public FileOutputStream(File file)
:创建文件输出流以写入由指定的 File对象表示的文件public FileOutputStream(String name)
: 创建文件输出流以指定的名称写入文件
- 注意:当你创建一个流对象时,必须传入一个文件路径 该路径下,如果没有这个文件,会创建该文件 如果有这个文 件,会清空这个文件的数据 要是想要数据进行追加使用以下的构造方法:(就是在参数中传入一个boolean类型的值
true
表示的是追加数据false
表示清空原有数据public FileOutputStream(File file, boolean append)
: 创建文件输出流以写入由指定的 File对象表示的 文件public FileOutputStream(String name, boolean append)
: 创建文件输出流以指定的名称写入文件
- 写出中换行 和 回车:
- 回车符
\r
和换行符\n
:- 回车符:回到一行的开头(return)
- 换行符:下一行(newline)。
- 系统中的换行:
- Windows系统里,每行结尾是 回车+换行 即
\r\n
- Unix系统里,每行结尾只有 换行 ,即
\n
- Mac系统里,每行结尾是 回车 ,即 \r 从 Mac OS X开始与Linux统一
- Windows系统里,每行结尾是 回车+换行 即
- 回车符
- 构造方法:
-
InputStream
类java.io.InputStream
抽象类是表示字节输入流的所有类的超类,可以读取字节信息到内存中- 定义了字节输入 流的基本共性功能方法:
- public void close() :关闭此输入流并释放与此流相关联的任何系统资源
- public abstract int read() : 从输入流读取数据的下一个字节
- public int read(byte[] b) : 从输入流中读取一些字节数,并将它们存储到字节数组 b中 。
- 定义了字节输入 流的基本共性功能方法:
-
FileInputStream
类 是文件输入流 从文件中读取字节- 构造方法
public FileInputStream(File file)
: 通过打开与实际文件的连接来创建一个FileInputStream
,该文件由文件系统中的 File对象 file命名public FileInputStream(String name)
: 通过打开与实际文件的连接来创建一个FileInputStream
,该文件由文件 系统中的路径名name命名 当你创建一个流对象时,必须传入一个文件路径。该路径下,如果没有该文件 会抛出 FileNotFoundException
- 读取字节数据:
- 读取字节:
read
方法,每次可以读取一个字节的数据
,提升为int类型
,读取到文件末尾,返回-1
- 使用read方法 读取到一个字节 会自动的进行类型的提升 提升为int型 另外的一点就是在进行流的操作完成之后 需要使用close 方法进行流的关闭
- 上面的方式执行的效率非常的低 极高效率的方式就是使用字节数组进行读取:
read(byte[] b)
,每次读取b
的长度个字节到数组中,返回读取到的有效字节个数,读取到末尾时,返回 -1 使用返回值能防止以前读取的数据没有进行完全替换 这样的方式减少了系统间的IO操作次数,从而提高了读写的效率 - 注意: 多个流之间的关闭顺序 就是先开的后关闭 后开的先关闭
- 读取字节:
- 构造方法
-
使用字节流的对拷实现图片的复制 :
public class Copy { public static void main(String[] args) throws IOException { // 1.创建流对象 // 1.1 指定数据源 FileInputStream fis = new FileInputStream("D:\\test.jpg"); // 1.2 指定目的地 FileOutputStream fos = new FileOutputStream("test_copy.jpg"); // 2.读写数据 // 2.1 定义数组 缓冲 byte[] b = new byte[1024]; // 2.2 定义长度 int len; // 2.3 循环读取 while ((len = fis.read(b))!=‐1) { // 2.4 写出数据 fos.write(b, 0 , len); } // 3.关闭资源 这里为了简便直接将异常抛出 fos.close(); fis.close(); } }
-
-
字符流:使用字节流可能出现的问题就是在进行中文字符的读取的时候 可能不会出现完整的字符(主要的原因就是中文是多个字节进行存储的)
Reader
java.io.Reader
抽象类是表示用于读取字符流的所有类的超类,可以读取字符信息到内存中- 定义了字符输入 流的基本共性功能方法:
public void close()
:关闭此流并释放与此流相关联的任何系统资源public int read()
: 从输入流读取一个字符public int read(char[] cbuf)
: 从输入流中读取一些字符,并将它们存储到字符数组 cbuf中
FileReader
类java.io.FileReader
类是读取字符文件的便利类 构造时使用系统默认的字符编码和默认字节缓冲区- 注意:Windows系统的中文编码默认是GBK编码表。 idea中UTF-8
- 构造方法:类似于
FileOutputStream
public FileReader(File file)
: 创建一个新的 FileReader ,给定要读取的File对象public FileReader(String fileName)
: 创建一个新的 FileReader ,给定要读取的文件的名称
- 读取字符数据:
- 读取字符:
read
方法,每次可以读取一个字符的数据,自动提升为int类型,读取到文件末尾,返回 -1 - 使用字符数组读取:
read(char[] cbuf)
,每次读取b的长度个字符到数组中,返回读取到的有效字符个数, 读取到末尾时,返回 -1
- 读取字符:
Writer
java.io.Writer
抽象类是表示用于写出字符流的所有类的超类,将指定的字符信息写出到目的地。- 定义了字节输出流的基本共性功能方法:
void write(int c)
写入单个字符void write(char[] cbuf)
写入字符数组abstract void write(char[] cbuf, int off, int len)
写入字符数组的某一部分,off数组的开始索引,len 写的字符个数void write(String str)
写入字符串void write(String str, int off, int len)
写入字符串的某一部分,off字符串的开始索引,len写的字符个数void flush()
刷新该流的缓冲void close()
关闭此流,但要先刷新它
- 定义了字节输出流的基本共性功能方法:
FileWriter
类java.io.FileWrite
r 类是写出字符到文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区- 构造方法:,类似于
FileOutputStream
public FileWriter(File file)
: 创建一个新的 FileWriter,给定要读取的File对象public FileWriter(String fileName)
: 创建一个新的 FileWriter,给定要读取的文件的名称
- 基本写出数据
- 写出字符:
write(int b)
方法,每次可以写出一个字符数据 没有调用close
方法,数据只是保存到了缓冲区
并未写出到文件中
- 写出字符:
- 关闭和刷新
- 因为内置缓冲区的原因,如果不关闭输出流,无法写出字符到文件中。但是关闭的流对象,是无法继续写出数据 的。如果我们既想写出数据,又想继续使用流,就需要 flush 方法了
- flush :刷新缓冲区,流对象可以继续使用。
- close :先刷新缓冲区,然后通知系统释放资源。流对象不可以再被使用了
- 因为内置缓冲区的原因,如果不关闭输出流,无法写出字符到文件中。但是关闭的流对象,是无法继续写出数据 的。如果我们既想写出数据,又想继续使用流,就需要 flush 方法了
- 写出其他数据
- 写出字符数组 :
write(char[] cbuf) 和 write(char[] cbuf, int off, int len)
,每次可以写出字符数组中的数据,用法类似FileOutputStream
- 写出字符串:
write(String str) 和 write(String str, int off, int len)
,每次可以写出字符串中的数据 - 续写和换行 类似于
FileOutputStream
- 写出字符数组 :
- 构造方法:,类似于
-
try-with-resource
语句:该语句确保了每个资源在语句结束时关闭- 使用格式:
try (创建流对象语句,如果多个,使用';'隔开) { // 读写数据 } catch (IOException e) { e.printStackTrace(); }
- 使用格式:
-
使用流进行
properties
文件的加载:(在使用Druid数据库连接池的时候会使用到)-
概述
java.util.Properties
继承于Hashtable
,来表示一个持久的属性集。它使用键值对存储数据,每个键及其对应值都是一个字符串 该类也被许多Java类使用,比如获取系统属性时, System.getProperties 方法就是返回 一个 Properties 对象
-
构造方法:
public Properties()
:创建一个空的属性列表
-
基本的存储方法:
public Object setProperty(String key, String value)
: 保存一对属性public String getProperty(String key)
:使用此属性列表中指定的键搜索属性值public Set<String> stringPropertyNames()
:所有键的名称的集合
-
与流相关的方法 :
public void load(InputStream inStream)
: 从字节输入流中读取键值对。 参数中使用了字节输入流,通过流对象,可以关联到某文件上,这样就能够加载文本中的数据了- 注意:文本中的数据,必须是键值对形式,可以使用空格、等号、冒号等符号分隔
-
代码演示:
//3.加载配置文件 Properties pro = new Properties(); InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties"); pro.load(is); //4.获取连接池对象(需要传入一个Properties对象) DataSource ds = DruidDataSourceFactory.createDataSource(pro); //5.获取连接 Connection conn = ds.getConnection(); // 进行jdbc的操作...
-
来源:CSDN
作者:上山打小鼠
链接:https://blog.csdn.net/qq_41922608/article/details/103984528