输入流 输出流
字节流 : inputStream (字节输入流) OutputStream(字节输出流)
字符流 : Reader(字符输入流) Write(字符输出流)
写数据的原理(内存~硬盘):
java程序—>JVM(java虚拟机)—>os(操作系统)—>os调用写数据的方法—>把数据写入到文件中
字节流
一切文件数据(文本、图片、视频等)在存储时,都是以二进制数字的形式保存,都一个一个的字节,那么传输时一样如此。所以,字节流可以传输任意文件数据。在操作流的时候,我们要时刻明确,无论使用什么样的流对象,底层传输的始终为二进制数据。
FileOutputStream:文件字节输出流: 把内存中的数据写入到硬盘文件中
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N34kD43g-1611228981496)(C:\Users\kaixin\AppData\Roaming\Typora\typora-user-images\image-20210107182003455.png)]
字节输出流的使用步骤(重点):
-
创建一个FileOutputStream对象,构造方法中传递写入数据的目的
FileOutputStream fos = new FileOutputStream("09_IO\\a.txt")
-
调用FileOutputStream 对象中的方法write,把数据写入到文件中
fos.write(97)
-
释放资源(流使用会占用一定的没存,使用完毕后要把内存清空,提高程序效率)
fos.close
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gkoMEA4G-1611228981499)(C:\Users\kaixin\AppData\Roaming\Typora\typora-user-images\image-20210107184413467.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pgk5Pcc0-1611228981502)(C:\Users\kaixin\AppData\Roaming\Typora\typora-user-images\image-20210107184640402.png)]
一次写对个字节
-
public void write(byte[] b):将b.length字节从指定的字节数组写入此输出流。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Bf1oYDid-1611228981505)(C:\Users\kaixin\AppData\Roaming\Typora\typora-user-images\image-20210107185223944.png)]
-
public void write(byte[] b,int off, int len):从指定的字节数组写入Len字节,从偏移量off开始输出到此输出流。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wmU4adWa-1611228981507)(C:\Users\kaixin\AppData\Roaming\Typora\typora-user-images\image-20210107185346751.png)]
-
Byte[] getBytes() 把字符串转化为字节数组
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hDdm3tS9-1611228981508)(C:\Users\kaixin\AppData\Roaming\Typora\typora-user-images\image-20210107185625659.png)]
追加写/续写:使用两个参数的构造方法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PXW7n4lj-1611228981508)(C:\Users\kaixin\AppData\Roaming\Typora\typora-user-images\image-20210107190101487.png)]
换行符号 windows :\r\n Liuux:\n mac:\r
字节输入流:InputStream
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MNztVzVP-1611228981509)(C:\Users\kaixin\AppData\Roaming\Typora\typora-user-images\image-20210107190706711.png)]
FileInputStream:(继承InputStream )文件字节输入流 作用:把硬盘文件中的数据,读取到内存中使用
构造方法:
- FileInputStream(string name ) :读取文件的路径
- FileInputStream(File file ):直接读取文件
构造方法的作用:
- 会创建FileInputStream对象
- 会把FileInputStream对象指定构造方法中要读取的文件
读取数据的原理(硬盘~内存)
JAVA程序—>JVM -->OS —>OS读取方法—>读取文件
字节输入流的使用步骤(重点)
**一次读取一个字节的方法 **
-
创建FileInputStream对象,构造方法中绑定要读取的数据源
FileInputStream fis = new FileInputStream("...\a.txt")
-
使用FileInputStream对象中的方法read,读取文件 (读取到末尾文件返回-1)
int len = fis.read();
可以使用while循环遍历文件中的数据
Boolean中的表达式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V5JjUv8S-1611228981510)(C:\Users\kaixin\AppData\Roaming\Typora\typora-user-images\image-20210107194217602.png)]
-
释放资源
fis.close;
**一次读取多个字节的方法 **
明确两件事:
-
方法的参数Byte[] 作用?
起到缓冲作用,存储每次读取的多个字节
数组的长度一般定义为1024(1kb)或者1024的整数倍
-
方法的返回值int是什么?
每次读取的有效字节个数
-
创建FileInputStream对象,构造方法中绑定要读取的数据源
FileInputStream fis = new FileInputStream("...\a.txt")
2.使用FileInputStream对象中的方法read读取文件 “使用 int read(byte[] b)从输入流中读取一定量的字节,并存储在缓冲区数组b中”
byre[] bytes = new byte[2]; int len =fis.read(bytes); System.out.printf(len); System.out.printf(Arrays.toString(bytes));
3.释放资源
fis.close();
-
-
使用字节流读取中文可能会出线乱码的情况(应为它读取的每次就是1/3的的字符因此会出现乱码的情况)
字符流
Reader:输入流
FileReader:
-
创建FilerReader对象
FileReader fr= new FileReader("文件路径")
-
使用FilerReader对象的read读取文件
char[] cs = new char[1024]; int len =0; while((len=fr.read(cs)!=-1){ String(char[] value , int offset, int count) }
-
释放资源
fr.close();
write:输出流
-
创建FilerWrite对象
FilerWrite fw= new FilerWrite(“文件路径”)`
-
使用FilerWrite对象的write输出文件
char[] cs = new char[1024]; int len =0; while((len=fw.read(cs)!=-1){ String(char[] value , int offset, int count) }
-
释放资源
fw.close();
关闭和刷新的区别
flush()和close()方法的区别
-flush 刷新缓冲区,流对象可以继续使用
-close 先刷新缓冲区,然后通知系统释放资源,流对象就不可以使用了.
字符写数据的其他方法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jPrmTaus-1611228981510)(C:\Users\kaixin\AppData\Roaming\Typora\typora-user-images\image-20210108160256917.png)]
续写和换行:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yZJIcKLl-1611228981511)(C:\Users\kaixin\AppData\Roaming\Typora\typora-user-images\image-20210108160640864.png)]
例:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sit87FLc-1611228981512)(C:\Users\kaixin\AppData\Roaming\Typora\typora-user-images\image-20210108160809393.png)]
缓冲流:(就是一个数组)提高程序的执行效率
缓冲流,也叫高效流,是对4个基本的Filexxx
流的增强,所以也是4个流,按照数据类型分类:
- 字节缓冲流:
BufferedInputStream
,BufferedoutputStream
- 字符缓冲流︰
BufferedReader
,Bufferedwriter
缓冲流的基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统IO次数,从而提高读写的效率。
BufferedoutputStream
字节输出流
构造方法:
-
BufferedOutputStream(OutputStream out)创建一个新的缓冲输出流,以将数据写入指定的底层输出流。
-
BufferedOutputStream(OutputStream out,int size)创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的底层输出流
使用步骤:
1.创建FileoutputStream对象,构造方法中绑定要输出的目的地
⒉创建BufferedOutputStream对象,构造方法中传递FiLeOutputStream对象对象,提高FileOutputStream对象效率3.使用Bufferedoutputstream对象中的方法write,把数据写入到内部缓冲区中
4.使用BufferedOutputStream对象中的方法fLush,把内部缓冲区中的数据,刷新到文件中5.释放资源(会先调用flush方法刷新数据,第4部可以省略)
BufferedInputStream字节输出流(同理)
缓冲流的读写 速度要比一般的读写 速度要快
字符缓冲流:
Bufferedwriter字符缓存输出流
:构造方法:
Bufferedwriter (writer out)创建一个使用黑认大小输出缓冲区的缓冲字符输出流。
Bufferedwriter(writer out, int sz)创建一个使用给定大小输出缓冲区的新缓冲字符输出流。
Writer out:字符输出流我们可以传递FiLewriter,缓冲流会给Filewriter增加一个缓冲区,提高FiLewriter的写入效率
int sz:指定缓冲区的大小,不写默认太小
BufferedReader
字符缓存输入流
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P08Pj3rV-1611228981512)(C:\Users\kaixin\AppData\Roaming\Typora\typora-user-images\image-20210111145350515.png)]
使用步骤
1.出建字符缓冲输入流的对象
BufferedReader br = new BufferedReader(new FileReader("D:\\a.txt"));
2.使用字符缓冲输入流对象种的方法read/ readLine读取文本
String line = br.readLine();
System.out.println(Line);
3.释放资源
line.close();