Java中的IO流也是也是我们经常用的的比较重要的类,下面就简单介绍下我们常用的几种IO流。
其中比较重要的流就是字节/字符输入(I)和字节/字符输出流(O),这里说的输入和输出的基准是针对计算机的内存,把数据写入内存就是输入,把数据写出内存就是输出,下图就是关于字节输入/输出流,字符输入/输出流以及常用子类的示意图。
1.字节输出流(OutputStream 抽象父类):将内存中的数据写入到磁盘中
常用方法:
void write(int i);//写出一个字节的数据
void write(byte[] b);//将byte数组中的数据写出去
void write(byte[] b,int offset,int len);//将byte数组中从索引值offset位置开始,长度为len的数据写出到磁盘中
void flush();//刷新(清空)缓冲区,在字节缓冲输出流用的比较多
void close();//释放资源
因为它是一个抽象父类,没有办法直接new,所以还需先介绍一下它的常用子类:
常用子类1:FileOutputStream 以下是它常用的几个构造方法
public FileOutputStream(String pathname)//传入String类型的参数
public FileOutputStream(File patname);//传入File类型参数
public FileOutputStream(String pathname,boolean append);//传入String类型参数,并判断是否覆盖原来数据,覆盖为false,不覆盖为true
public FileOutputStream(File Pathname,boolean append);//传入File类型的参数,并判断是否覆盖原来数据,覆盖为false,不覆盖为true
(需要注意的是,以上四个构造方法底层其实都是第四个构造方法,后面没有写布尔值参数,所以默认都是false覆盖),下图中就是几个常用方法的使用。
常用子类2:BufferedOutputStream(字节缓冲输出流) 以下是它常用的构造方法:
public BufferOutputStream(OutputStream os);//传入字节输出流类型对象
调用此构造方法时,底层会创建一个长度是8192的byte数组,当调用write方法写出数据时,数据会被存储在这个8192的数组中,当该数组存满时,或者调用close(flush)方法时,就会把缓冲区中的数据写出去(如果没有存满,并且不调用close/flush方法时,数据是不能写出到磁盘中的)
public BufferedOutputStream(OutputStream os,int size);//传入字节输出流类型对象,并且可以指定缓冲区大小 ![](https://img-blog.csdnimg.cn/089d5f08d2e34723a3de1e076ee1ac89.png)
构造方法:public ObjectOutputStream(OutputStream os);//传入字节输出流类型对象
成员方法:void writeObject(对象名);//写出对象
常用子类3:打印流(PrintStream)
成员方法:①void println();//无参构造,默认打印到控制台
② void println(参数);//有参构造,默认打印到控制台
构造方法:①public PrintStream(String pathname);//传入打印地址,String类型参数
②public PrintStream(File Pathname);//传入File类型对象,改变打印地址
在配合上System.SetOut(PrintStream ps)方法,就可以改变我们打印的流向
2.字节输入流(InputStream 抽象父类):将磁盘中的数据读取到内存中
常用方法:
① int read();//读取一个字节的数据,返回读取的一个字节,如果没有则返回-1;
② int read(byte[] b);//读取数据存入byte类型的数组中,返回读取的长度,如果没有则返回-1;
③void close();//释放资源
如下图所示,我在桌面建了文件,里面存储了一些dadafafaf数据,然后如下图所示,利用read方法读取数据,结果如下:
常用子类1:FileInputStream,以下是它常用的两个构造方法:
构造方法:public FileInputStream(String Pathname)//传入String类型的文件地址
public FileInputStream(File Pathname)//传入file类型参数
常用子类2:BufferedInputStream(字节缓冲输入流)以下是它常用的两个构造方法:
构造方法:①public BufferedInputStream(InputStream is)//传入InputStream类型的对象
调用这个构造方法的时候,底层会创建一个长度为8192的byte的数组,当第一次数据的时候读取的数据会先存入这个8192的byte数组中,然后从对应的位置获取元素进行操作。
②public BufferedInputStream(InputStream is,int size)//同样可以传入InputStream类型的对象,但是这个构造方法可以指定缓冲去的大小,可以传入对应数组长度
3.字符输出流(Writer 抽象父类)
成员方法: ①void writer(int b);//写出一个字符
② void writer(char[] ch);//将char数组中的数据写出去
③ void writer(char[] ch,int offset,int len);//将char数组中索引值为offset长度为len的数据写出去
④ void writer(String str);//写出一个字符串类型的数据
⑤void writer(String str,int offset,int len);//将字符串中的数据从offset开始,长度为len的数据写出去
⑥void flush();//把缓冲区中的数据写出去
⑦void close();//关闭流,释放资源,在关闭流之前会把缓冲区的数据写出去
常用子类1:FileWriter:
需要注意的是FileWriter在调用构造方法的时候,底层会创建一个长度是8192的byte数组(缓冲区),当缓冲区的数据存满了之后就会把缓冲区的数据写出去
构造方法:
① public FileWriter(String pathname,boolean append);//传入String类型参数,并判断是否覆盖原来数据,默认是不覆盖就是true,如果要覆盖就传入false
②public FileWriter(File Pathname,boolean append);//传入File类型参数,并判断是否覆盖默认是不覆盖就是true,如果要覆盖就传入false
常用实现类2:BufferedWriter(字符缓冲输出流)
构造方法:
①public BufferedWriter(Writer w);//传入Writer类型对象
调用此方法时,底层会创建一个8192的char数组,当调用writer()写出方法时,会把数据写出到8192的char数组中,当char数组中存不下数据时,会将这些数据统一进行转换成byte数组,然后存入8192的byte数组中,然后再把byte数组中的数据写出去
②public BufferedWriter(Writer w,int size);//传入Writer类型的数据,并且可以指定缓冲区的大小
常用实现类3:字符转换输出流(OutputStreamWriter)
构造方法:
①public OutputStreamWriter(OutputStream os);//传入字节输出流类型参数,使用默认的字符编码写出数据
②public OutputStreamWriter(OutputStream os,String charsetname);//使用自己指定的字符编码写出数据
4.字符输入流(Reader 抽象父类)
常用方法:①int read();//读取一个字符的数据,如果没有读取到就返回-1
②int read(char [] ch);//读取数据存入char数据中,返回读取的长度,如果没有数据返回-1
③void close();//释放资源
常用子类1:FileReader
构造方法:
需要注意的是我们在调用以下构造方法时,底层会创建一个长度为8192的byte类型数组,当数据量大的时候,每次会读取8192字节的数据,数据量小有多少读多少
①public FileReader(String pathname);//传入String类型参数
②public FileReader(File pathname);//传入File类型参数
常用子类2:字符缓冲输入流(BufferedrReader)
构造方法:
和字符缓冲输出流的原理相似,在调用构造方法时,底层会创建一个长度为8192char数组,在读取数据时,会先把读取的数据存储到长度为8192的byte数组中,然后再把char数组中的数据全部转换成char类型,然后从char数组中对应的位置来获取元素进行操作
①public BufferedReader(Reader r);//传入字符输入流类型参数
②public BufferedReader(Reader r,int size);//传入字符输入流类型参数,并且指定缓冲区大小
成员方法:String readLine();//读取一行数据,没有则返回null
常用子类3:字符转换输入流(InputStream)
构造方法:①public InputStreamReader(InputStream is);//使用默认字符编码读取数据
②public InputStreamReader(InputStream is,String charsetName);//使用指定的字符编码读取数据
版权归原作者 你不懂我的风花雪月 所有, 如有侵权,请联系我们删除。