IO流

Java IO输入输出流

1.什么是IO

IO:Input/Output,输入/输出流
作用:通过IO流可以完成硬盘文件的读写操作

 2.io流的分类

按传输流的方向分为:输入流和输出流

按传输流的数据格式分为:字节流(stream)和字符流(reader/writer)

 输入输出流

输入(Input):也就是从外部文件中获取数据(即读取外部数据)

输出(Output):也就是把内存中的文件保存到硬盘上(即把数据写到电脑中)

字节字符流 

字节流:一次传送一个字节byte(即一次传送8个二进制位)
              注意:它是一个万能流,什么数据都可以传输,如:视频、文本、语音、图片(以Stream结尾的类都是字节流)

字符流:以字符为单位进行数据的传输,一次传输一个字符
             注意:它只能传输普通的文本信息,不能读取非文本信息(以Reader/Writer结尾的类都是字符流)

例如:一个文件的内容为:abc你好

一个字母占用1个字节,汉字占用两个字节

用字节流的方式读取的话,第一次会读取到97(a对应的字节码),第二次读取到98(b对应的字节码),第三次是99(c),第四次...

用字符流的方式读取的话,第一次会读取到’a’,第二次会读取到’b’,第三次是’c’,第四次是’你’,第五次是’好’(一个汉字也是一个字符)

3.File类

它也是java.io下的一个类,file是文件的意思,也就是一个文件类,它里面就是包括一下文件的基本方法,文件的基本属性

    首先了解什么是相对路径和绝对路径
    相对路径:就是相对于当前文件来说的,例如你在IDEA的一个项目里创建了一个temp文件,那你路径名就可以直接写成temp,这就是相对路径
    绝对路径,是在哪里都可以用这个路径,这个路径指的就是在电脑硬盘里真正的路径,如:D:\java\lib\fonts就是绝对路径

File文件其实就是文件和目录路径名的抽象表示形式

       1)public boolean exists( ) 判断文件或目录是否存在
       2)public boolean isFile( ) 判断是文件还是目录
       3)public boolean isDirectory( ) 判断是文件还是目录
       4)public String getName( ) 返回文件名或目录名
       5)public String getPath( ) 返回文件或目录的路径。
       6)public long length( ) 获取文件的长度
       7)public String[ ] list ( ) 将目录中所有文件名保存在字符串数组中返回。
       File类中还定义了一些对文件或目录进行管理、操作的方法,常用的方法有:
       1) public boolean renameTo( File newFile );    重命名文件
       2) public void delete( );   删除文件
       3)  public boolean mkdir( ); 创建目录

常用类

字节流

字节输入流InputStream主要方法:

    read() :从此输入流中读取一个数据字节。
    read(byte[] b) :从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。
    read(byte[] b, int off, int len) :从此输入流中将最多 len 个字节的数据读入一个 byte 数组中。
    close():关闭此输入流并释放与该流关联的所有系统资源。

字节输出流OutputStream主要方法:

    write(byte[] b) :将 b.length 个字节从指定 byte 数组写入此文件输出流中。
    write(byte[] b, int off, int len) :将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此文件输出流。
    write(int b) :将指定字节写入此文件输出流。
    close() :关闭此输入流并释放与该流关联的所有系统资源。

字符流

字符输入流Reader主要方法:

    read():读取单个字符。
    read(char[] cbuf) :将字符读入数组。
    read(char[] cbuf, int off, int len) : 将字符读入数组的某一部分。
    read(CharBuffer target) :试图将字符读入指定的字符缓冲区。
    flush() :刷新该流的缓冲。
    close() :关闭此流,但要先刷新它。

字符输出流Writer主要方法:

    write(char[] cbuf) :写入字符数组。
    write(char[] cbuf, int off, int len) :写入字符数组的某一部分。
    write(int c) :写入单个字符。
    write(String str) :写入字符串。
    write(String str, int off, int len) :写入字符串的某一部分。
    flush() :刷新该流的缓冲。
    close() :关闭此流,但要先刷新它。

 

文件流

    java.io.FileInputStream:文件字节输入流
    java.io.FileOutputStream:文件字节输出流
    java.io.FileReader:文件字符输入流
    java.io.FileWriter:文件字符输出流

FileInputStream:文件字节输入流

FileInputStream是一个万能流,可以读取任意文件的数据,首先要定义一个文件字节输入流对象,把要读取的文件地址传进去,然后调用read()方法来进行字节的读取,read()方法返回的是一个int型的字节码数,当读完数据的时候回返回-1;我们也可以让它一下读取一个bye数组,读取的字节长度是byte[].length个字节,read(byte [])方法返回的是读取了几个字节,读取的字节码存储在byte[]数组中,读完数据压缩会返回-1,读取的时候建议采用循环来读取,最后不要忘记关闭流

 FileOutputStream:文件字节输出流

首先创建一个 FileOutputStream字节输出流对象,将写入文件的地址信息传进去,如果文件不存在系统会自动新建,调用write()方法开始写,参数为要写入数据的字节码数,一次只能写一个;也可以一下写一个byte[]数组,调用read(byte[])方法;要写入字符串的时候可以调用getBytes()方法将字符串转化为byte[]数组,输出流最后要记得刷新flush()一下,清空要写入的数据以防止数据丢失,记得还要close()关闭一下。
 

FileReader:文件字符输入流 

 FileReader是一个纯文本的输入流,只能进行文本文件的读入,输入时,首先创建一个文件字符输入对象,把要读的文件地址放进去,调用read()方法开始读,它一次读取一个字符,返回的是int型的字符编码,读到最后无数据会返回-1,;也可以一下读取一个char[]数组,读取的长度为char[].length个长度,调用read(char[])开始读,返回的是读取了几个字符,读到最后也是返回-1,可以利用String的一个构造器String(char value[], int offset, int count)来进行char[]与String的转换,最后不要忘记关闭流

 FileWriter:文件字符输出流

FileWriter是文件字符输出流,首先创建一个文件字符输出流对象,传入要写入的文件地址,调用write()方法,可以一次一个字符的形式写入,参数为字符码;也调用write(String str, int off, int len)这个方法,传进去一个String字符串;或者一次写一个char[]数组,长度为char[].length个字符,想要换行的时候可以调用write(String str)方法–>即writer("\n")以换行,最后记得刷新flush()+关闭close()

 缓冲流

    当一个流的构造器中需要一个流时,被传进来的这个流叫做节点流
    外部负责包装的这个流称为包装流,又叫处理流
    Java缓冲流本身并不具有IO流的读取与写入功能,只是在别的流(节点流或其他处理流)上加上缓冲功能提高效率就像是把别的流包装起来一样,缓冲流是一种处理流(包装流)

当对文件或者其他数据源进行频繁的读写操作时,效率比较低,这时如果使用缓冲流就能够更高效的读写信息。
BufferedInputStream带缓冲的字节输入流

BufferedInputStream是一个缓冲字节输入流,其实跟普通的字节输入流的方法差不多,因为它也实现了InputStream接口,有着同样的方法,那为什么会出现这种缓冲流呢,因为普通的输入流它与其他数据源进行频繁的读写操作时,效率较低,使用缓冲流的话就能够更高效的读写信息

 BufferedOutputStream带缓冲的字节输出流

BufferedOutputStream是带缓冲的字节输出流,在我们使用的时候感觉跟普通的输出流差不多,其实他的底层是为我们知道创建了一个缓冲区,我们在想文件中写入数据的时候,数据会被先存放在缓冲区,等缓冲区满的时候,它会将缓冲区的数据一下子传输到输出流中,避免了一个字节一个字节地频繁与底层交互,提高了效率。

 BufferedReader带缓冲的字符输入流

BufferedReader是带缓存的字符缓存输入流,比普通的输入流多了一个readLine()方法,一下读取一行数据,显然比普通的效率要更快

 BufferedWriter带缓冲的字符输出流

BufferedWriter是带缓冲区的字符输出流,写入数据的时候更加的方便,它提供了 write(String str)的方法,可以直接写入一个字符串,还有newLine()方法写入一个换行符,当然也可以用write("\n"),还有write(char cbuf[])方法写入一个char[]数组,底层也是有一个缓冲区来存放将要写入数据

字符缓冲流两个独特的方法:

    BufferedWriter类newLine() :写入一个行分隔符。这个方法会自动适配所在系统的行分隔符。
    BufferedReader类readLine() :读取一个文本行。

 

转换流

它用于字节流转为字符流,eg:在缓冲流中,一个字节输出流想要用Writer字符流,这就可以用到我们的转换流
注意:字符流不能转为字节流(万能字节流才可以转换)

 InputStreamReader实现了字节输入流(InputStream)向字符输入流(Reader)的转变

OutputStreamWriter实现了字节输出流(OutputStream)向字符输出流(Writer)的转变

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值