脚本宝典收集整理的这篇文章主要介绍了【206天】黑马程序员27天视频学习笔记【Day20-下】,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
叨逼叨两句@H_126_2@
20-11:BufferedInputStream和BufferedOutputStream拷贝
-
缓冲思想
- 字节流一次读写一个数组的速度明显比一次读一个字节快很多
-
BufferedInputStream
- BufferedInputStream内置一个缓冲区(数组)
- Java程序读取硬盘上的文件数据时,不会直接从文件将字节往内存中的Java程序输送,而是使用BufferedInputStream作为缓冲区,先将文件中字节一次性装满BufferedInputStream的8192个字节数组,然后再由Java程序一个个读取缓冲区的数据
-
BufferedOutputStream
- BufferedOutputStream内置一个缓冲区(数组)
- Java向硬盘中写出文件数据时,不会直接从Java程序将数据往硬盘上写,而是使用BufferedOutputStream作为缓冲区,先由Java程序一个个将BufferedOutputStream的8192个字节装满,然后再将这些字节一次性写入硬盘上的文件
- 原理图如下:
package com.test.demo001; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileinputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class Demo009 { public static void main(String[] args) throws IOException{ //demo01(); FileInputStream fis = new FileInputStream("20.avi"); FileOutputStream fos = new FileOutputStream("copy.avi"); BufferedInputStream bis = new BufferedInputStream(fis); BufferedOutputStream bos = new BufferedOutputStream(fos); int b; while((b = bis.read())!= -1){ bos.wrITe(b); } bis.close(); bos.close(); } PRivate static void demo01() throws FileNotFoundException, IOException { FileInputStream fis = new FileInputStream("cccccc.txt"); FileOutputStream fos = new FileOutputStream("bbbbbb.txt"); byte[] arr = new byte[2]; int len; //读到的有效字符个数 while((len = fis.read(arr))!= -1){ fos.write(arr,0,len); } fis.close(); fos.close(); } }
20-12:flush和close方法的区别
- flush()方法可用来刷新缓冲区,刷新后再次写出
- close()方法用来关闭流释放资源,如果是带缓冲区的流对象的close方法,关闭流之前会对缓冲区进行刷新,关闭后也不能再写出。
- 为什么要刷新?因为不刷新数据会留在缓冲区一部分【小于8192字节的那部分】,导致拷贝的文件不完整。
public class Demo009 { public static void main(String[] args) throws IOException{ BufferedInputStream bis = new BufferedInputStream(new FileInputStream("20.avi")); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("copy.avi")); int b; while((b = bis.read())!= -1){ bos.write(b); } bis.close(); bos.close(); }
20-13:字节流读写中文
-
字节流读中文的问题:可能出现读到半个中文乱码的情况
package com.test.demo001; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class Demo009 { public static void main(String[] args) throws IOException{ FileInputStream fis = new FileInputStream("b.txt"); byte[] arr = new byte[2]; int len; while((len = fis.read(arr))!= -1){ System.out.println(new String(arr,0,len)); } } }
-
字节流写出中文的问题:
- 字节流直接操作的字节,所以写出中文必须将字符串转换成字节数组
- 写出回车换行write(“rn”.getBytes());
package com.test.demo001; import java.io.FileOutputStream; import java.io.IOException; public class Demo009 { public static void main(String[] args) throws IOException{ FileOutputStream fos = new FileOutputStream("b.txt"); fos.write("你好世界".getBytes()); fos.write("rn".getBytes()); fos.write("你好世界".getBytes()); } }
20-14:流的标准处理异常代码1.6版本及其以前
package com.test.demo001; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class Demo009 { public static void main(String[] args) throws IOException{ FileInputStream fis = null; FileOutputStream fos = null; try { fis = new FileInputStream("b.txt"); fos = new FileOutputStream("c.txt"); int b; while((b = fis.read())!= -1){ fos.write(b); } } finally { try { if(fis != null){ fis.close(); } } finally { fos.close(); } } } }
20-15:流的标准处理异常代码1.7版本
- ()中的对象必须实现AutoCloseable接口
package com.test.demo001; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class Demo009 { public static void main(String[] args) throws IOException{ try( FileInputStream fis = new FileInputStream("b.txt"); FileOutputStream fos = new FileOutputStream("c.txt"); ){ int b; while((b = fis.read())!= -1){ fos.write(b); } } } } class MyClose implements AutoCloseable { @override public void close() throws Exception { System.out.println("我自动关闭了"); } }
20-16:图片加密
- 将写出的字节异或一个数,这个数就是密钥,解密的时候再次异或就可以了。
package com.test.demo001; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class Demo009 { public static void main(String[] args) throws IOException{ BufferedInputStream bis = new BufferedInputStream(new FileInputStream("dd.jPEg")); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("ee.jpeg")); int len; while((len = bis.read())!= -1){ bos.write(len ^ 123); } bis.close(); bos.close(); } }
20-17:在控制台录入文件的路径,将文件拷贝到当前项目下
package com.test.demo001; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.Scanner; public class Demo009 { public static void main(String[] args) throws IOException{ File file = getFile(); BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file)); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file.getName())); int len; while((len = bis.read())!= -1){ bos.write(len); } bis.close(); bos.close(); } public static File getFile(){ Scanner sc = new Scanner(System.in); System.out.println("请输入一个文件路径"); while(true){ String line = sc.nextLine(); File file = new File(line); if(!file.exists()){ System.out.println("录入的路径文件不存在"); } else if(file.isDirectory()) { System.out.println("录入的路径是文件夹,请重新输入"); } else { return file; } } } }
20-18:录入数据,拷贝到文件
package com.test.demo001; import java.io.FileOutputStream; import java.io.IOException; import java.util.Scanner; public class Demo009 { public static void main(String[] args) throws IOException{ Scanner sc = new Scanner(System.in); FileOutputStream fos = new FileOutputStream("text.txt"); System.out.println("请输入数据:"); while(true){ String line = sc.nextLine(); if("quit".equals(line)){ break; } fos.write(line.getBytes()); fos.write("rn".getBytes()); } } }
以上是脚本宝典为你收集整理的【206天】黑马程序员27天视频学习笔记【Day20-下】全部内容,希望文章能够帮你解决【206天】黑马程序员27天视频学习笔记【Day20-下】所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。