二.三.五 read(byte[]b ,int offset, int len) 循环读取内容
@Test public void read6Test() throws Exception{ File file=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc" +File.separator+"Hello3.txt"); InputStream inputStream=new FileInputStream(file); StringBuilder sb=new StringBuilder(); byte[] bytes=new byte[10]; int len=-1; while((len=inputStream.read(bytes))!=-1){ //依次读取的内容 String temp=new String(bytes,0,len); sb.append(temp); } System.out.println("输出读取的内容:"+sb.toString()); inputStream.close(); }
控制台打印输出:
可以读取全部的内容信息,但是发现,产生了中文乱码的问题。
这是由于在读取中文时,准确地说在读取到 汉字’个’时, 正好将个这个词的字节给分开了, 一半在 bytes[9], 另一半在下一次bytes数组的 的bytes[0]位置。
如果将字节数组bytes的长度扩大,如扩大到 1024, 就不会产生乱码问题了。
二.四 字节读取时,中文乱码问题
在fileSrc目录下,新创建一个 rz.txt 文件, 填充内容为:
你好我是两个蝴蝶飞你好我是两个蝴蝶飞
我们读取这个文件,来演示中文乱码问题。
二.四.一 字节数组长度为奇数时
字节数组为奇数时,很容易造成中文乱码。
@Test public void read7Test() throws Exception{ File file=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc" +File.separator+"rz.txt"); InputStream inputStream=new FileInputStream(file); StringBuilder sb=new StringBuilder(); byte[] bytes=new byte[5]; int len=-1; while((len=inputStream.read(bytes))!=-1){ //依次读取的内容 String temp=new String(bytes,0,len); sb.append(temp); } System.out.println("输出读取的内容:"+sb.toString()); inputStream.close(); }
运行程序:
有很大概率,会将中文进行拆分。
这个例子时,将 byte[5] 转换成 byte[6],换成偶数时:
这个时候,就可能不乱码了。
二.四.二 字节数组长度不被3整除时
上面的字节长度为6时,不乱码,为10时就乱码了。
为12时,就不乱码了,为 14时乱码了,为18时不乱码了。
老蝴蝶建议,接收的字节数组的长度最好是能被3整除的偶数。 读取时,为了方便,常常是1024的整数被。
所以,综合起来就是: 能同时被1024和3整除的偶数。
为了方便,老蝴蝶还是以 1024为主。
二.五 读取文件内容综合
@Test public void read8Test() throws Exception{ File file=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc" +File.separator+"Hello3.txt"); InputStream inputStream=new FileInputStream(file); //长度设置成1024 byte[] bytes=new byte[1024]; int len=-1; while((len=inputStream.read(bytes))!=-1){ //依次读取的内容 System.out.println("读取的内容为:"+new String(bytes,0,len)); } inputStream.close(); }
三. OutputStream和InputStream的应用: 文件复制
文件复制,实际上就是将 InputStream和 OutputStream 结合起来使用, 两者共同使用同一个 字节数组, InputStream将读出的内容批量写入到字节数组里面, OutputStream将字节数组批量写入到文件里面。
三.一 文件复制方法
/** * 复制字节文件 * @param src 源文件 * @param desc 目标文件 * @return */ public static boolean copyBin(String src,String desc) throws Exception{ //定义两个文件 File srcFile=new File(src); File descFile=new File(desc); if(!srcFile.exists()||!srcFile.isFile()){ throw new RuntimeException("源文件不存在或者源文件是目录"); } //定义InputStream 和 OutputStream InputStream inputStream=new FileInputStream(srcFile); OutputStream outputStream=new FileOutputStream(descFile); //1M 1M的读取 byte[] bytes=new byte[1024]; int len=-1; //将内容写入到 bytes字节数组里面 while((len=inputStream.read(bytes))!=-1){ //将bytes字节数组写入到文件里面 outputStream.write(bytes,0,len); } outputStream.flush(); //关闭流 outputStream.close(); inputStream.close(); return true; }
三.二 测试文件复制
复制文件和复制图片类型都可以。
@Test public void copyTest(){ //复制普通文件 /* String src="E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc" +File.separator+"rz.txt"; String desc="E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc" +File.separator+"rzcopy.txt";*/ //复制图片 String src="E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc" +File.separator+"129.png"; String desc="E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc" +File.separator+"129copy.png"; try { CopyUtils.copyBin(src,desc); System.out.println("文件复制成功"); } catch (Exception e) { e.printStackTrace(); } }
运行程序,查看文件系统
谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!