暑期JAVA学习(22)字节流的使用

字节流的使用

    • 一、文件字节输入流:每次读取一个字节
      • (1)文件字节输入流:FileInputStream
      • (2)具体使用
    • 二、文件字节输入流:每次读取一个字节数组
      • (1)文件字节输入流:FileInputStream
      • (2)具体使用
    • 三、文件字节输入流:一次读完全部字节
      • (1)如何使用字节输入流读取中文内容输出不乱码呢?
      • (2)直接把文件数据全部读取到一个字节数组可以避免乱码,是否存在问题?
      • (3)方式一:
      • (4)方式二:
    • 四、文件字节输出流:写字节数据到文件
      • (1)文件字节输出流:FileOutputStream
      • (2)文件字节输出流(FileOutputStream)写数据出去的API
      • (4)具体使用
      • (5)总结
    • 五、文件拷贝
      • (1)案例

暑期JAVA学习(22)字节流的使用_第1张图片

一、文件字节输入流:每次读取一个字节

(1)文件字节输入流:FileInputStream

●作用:以内存为基准,把磁盘文件中的数据以字节的形式读取到内存中去。

暑期JAVA学习(22)字节流的使用_第2张图片

(2)具体使用

构造器 说明
public FileInputStream​(File file) 创建字节输入流管道与源文件对象接通
public FileInputStream​(String pathname) 创建字节输入流管道与源文件路径接通
方法名称 说明
public int read() 每次读取一个字节返回,如果字节已经没有可读的返回-1
public int read(byte[] buffer) 每次读取一个字节数组返回,如果字节已经没有可读的返回-1

暑期JAVA学习(22)字节流的使用_第3张图片
在这里插入图片描述
●一个一个字节读,效率太低,使用循环改进,改善如下:
暑期JAVA学习(22)字节流的使用_第4张图片
在这里插入图片描述

●读取中文字符时,由于一个中文字符占据三个字节,而文件字节输入流每次读取一个字节,故会出现乱码:

在这里插入图片描述
在这里插入图片描述

●综上所述:public int read() 每次读取一个字节性能较慢,并且读取中文字符输出无法避免乱码问题。

二、文件字节输入流:每次读取一个字节数组

(1)文件字节输入流:FileInputStream

●作用:以内存为基准,把磁盘文件中的数据以字节的形式读取到内存中去。
暑期JAVA学习(22)字节流的使用_第5张图片

(2)具体使用

方法名称 说明
public int read() 每次读取一个字节返回,如果字节已经没有可读的返回-1
public int read(byte[] buffer) 每次读取一个字节数组返回读取的字节数目,如果字节已经没有可读的返回-1

在这里插入图片描述

暑期JAVA学习(22)字节流的使用_第6张图片
暑期JAVA学习(22)字节流的使用_第7张图片
●用循环改善:
暑期JAVA学习(22)字节流的使用_第8张图片
在这里插入图片描述

●虽然与每次读取一个字节相比读取的性能得到了提升,但读取中文字符输出无法避免乱码问题

在这里插入图片描述
在这里插入图片描述

●综上所述:public int read(byte[] buffer) 每次读取一个字节数组,读取的性能得到了提升,但读取中文字符输出无法避免乱码问题。

三、文件字节输入流:一次读完全部字节

(1)如何使用字节输入流读取中文内容输出不乱码呢?

●定义一个与文件一样大的字节数组,一次性读取完文件的全部字节。

(2)直接把文件数据全部读取到一个字节数组可以避免乱码,是否存在问题?

●如果文件过大,字节数组可能引起内存溢出。

(3)方式一:

●自己定义一个字节数组与文件的大小一样大,然后使用读取字节数组的方法,一次性读取完成。

方法名称 说明
public int read(byte[] buffer) 每次读取一个字节数组返回,如果字节已经没有可读的返回-1

在这里插入图片描述
暑期JAVA学习(22)字节流的使用_第9张图片
在这里插入图片描述

(4)方式二:

●官方为字节输入流InputStream提供了如下API可以直接把文件的全部数据读取到一个字节数组中

方法名称 说明
public byte[] readAllBytes() throws IOException 直接将当前字节输入流对应的文件对象的字节数据装到一个字节数组返回

在这里插入图片描述
暑期JAVA学习(22)字节流的使用_第10张图片
在这里插入图片描述

四、文件字节输出流:写字节数据到文件

(1)文件字节输出流:FileOutputStream

●作用:以内存为基准,把内存中的数据以字节的形式写出到磁盘文件中去的流。
暑期JAVA学习(22)字节流的使用_第11张图片

构造器 说明
public FileOutputStream​(File file) 创建字节输出流管道与源文件对象接通
public FileOutputStream​(File file,boolean append) 创建字节输出流管道与源文件对象接通,可追加数据
public FileOutputStream​(String filepath) 创建字节输出流管道与源文件路径接通
public FileOutputStream​(String filepath,boolean append) 创建字节输出流管道与源文件路径接通,可追加数据

(2)文件字节输出流(FileOutputStream)写数据出去的API

方法名称 说明
public void write(int a) 写一个字节出去
public void write(byte[] buffer) 写一个字节数组出去
public void write(byte[] buffer , int pos , int len) 写一个字节数组的一部分出去
暑期JAVA学习(22)字节流的使用_第12张图片
流的关闭与刷新
方法名称 说明
:--------: :------------:
flush() 刷新流,还可以继续写数据
close() 关闭流,释放资源,但是在关闭之前会先刷新流。一旦关闭,就不能再写数据

(4)具体使用

暑期JAVA学习(22)字节流的使用_第13张图片
暑期JAVA学习(22)字节流的使用_第14张图片
运行第一次:
在这里插入图片描述
运行第二次:
暑期JAVA学习(22)字节流的使用_第15张图片
运行第三次:
暑期JAVA学习(22)字节流的使用_第16张图片

(5)总结

①字节输出流写数据的方法有哪些?

方法名称 说明
public void write(int a) 写一个字节出去
public void write(byte[] buffer) 写一个字节数组出去
public void write(byte[] buffer , int pos , int len) 写一个字节数组的一部分出去

②字节输出流如何实现数据追加?

public FileOutputStream​(String filepath,boolean append) 创建字节输出流管道与源文件路径接通,可追加数据

③字节输出流如何实现写出去的数据能换行?
●os.write(“\r\n”.getBytes())

④如何让写出去的数据能成功生效?
●flush()刷新数据
●close()方法是关闭流,关闭包含刷新,关闭后流不可以继续使用了。

五、文件拷贝

暑期JAVA学习(22)字节流的使用_第17张图片

(1)案例

需求:
●把某个视频复制到其他目录下的“b.avi”

思路:
①根据数据源创建字节输入流对象
②根据目的地创建字节输出流对象
③读写数据,复制视频
④释放资源

暑期JAVA学习(22)字节流的使用_第18张图片

暑期JAVA学习(22)字节流的使用_第19张图片
在这里插入图片描述
在这里插入图片描述

字节流适合做一切文件数据的拷贝吗?
●任何文件的底层都是字节,拷贝是一字不漏的转移字节,只要前后文件格式、编码一致没有任何问题。

你可能感兴趣的:(java,学习,开发语言)