Java基础篇IO流操作总结
CSDN话题挑战赛第1期
活动详情地址:活动传送门
参赛话题:Java学习记录
话题描述:可以记录一下平时学习Java中的一些知识点、心得、例题、常见的问题解决
说明:
接着上一篇文档,这一篇主要是总结对文件的操作,包括了通过FileInputStream、、FileOutputStream、FileReader、FileWriter以及处理流的一种实现对图片、文本、视频的复制
程序目录
-
- 1. FileInputStream、FileOutputStream对视频,图片的复制
- 1.2 FileReader、FileWriter对文本的复制
- 1.3 BufferedInputStream、BufferedOutputStream对图片、视频的复制
- 1.4 BufferedReader 、BufferedWriter 对文本的复制
1. FileInputStream、FileOutputStream对视频,图片的复制
说明:在这里使用的是相对路径
图片的复制
@Test public void FileInputStreamOutputStreamTest() { FileInputStream fis = null; FileOutputStream fos = null; try { //提供数据操作的对象 File srcfile = new File("爱情与友情.jpg"); File destfile = new File("爱情与友情3.jpg"); //创建数据流 fis = new FileInputStream(srcfile); fos = new FileOutputStream(destfile); //对数据的操作 byte[] buffer = new byte[10]; int len; while ((len = fis.read(buffer)) != -1){ fos.write(buffer,0,len); } } catch (IOException e) { e.printStackTrace(); } finally { //流资源的关闭 if (fis != null){ try { fis.close(); } catch (IOException e) { e.printStackTrace(); } } if (fos != null){ try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } } }
视频的复制
//实现通用的文件的赋值 public void copuFile(String srcPath,String destPath){ FileInputStream fis = null; FileOutputStream fos = null; try { //提供数据操作的对象 File srcfile = new File(srcPath); File destfile = new File(destPath); //创建数据流 fis = new FileInputStream(srcfile); fos = new FileOutputStream(destfile); //对数据的操作 byte[] buffer = new byte[1024]; int len; while ((len = fis.read(buffer)) != -1){ fos.write(buffer,0,len); } } catch (IOException e) { e.printStackTrace(); } finally { //流资源的关闭 if (fis != null){ try { fis.close(); } catch (IOException e) { e.printStackTrace(); } } if (fos != null){ try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } } } @Test public void test(){ long start = System.currentTimeMillis(); String srcfile = "C:\\Users\\Administrator\\Desktop\\项目运行视频.mp4"; String destfile = "C:\\Users\\Administrator\\Desktop\\项目运行视频2.mp4"; copuFile(srcfile,destfile); long end = System.currentTimeMillis(); System.out.println("复制视频花费了"+(end - start) + "毫秒"); }
1.2 FileReader、FileWriter对文本的复制
@Test public void testFileReaderWriter(){ FileReader fr = null; FileWriter fw = null; try { //1.提供File类的对象,指明读入和写出的对象 File srcfile = new File("hello.txt"); File destfile = new File("hello2.txt"); //2.创建输入流和输出流的对象 fr = new FileReader(srcfile); fw = new FileWriter(destfile); //3.数据的操作 char[] cbuf = new char[5]; int len;//记录每次从cbuf数组中读取数据的长度 while ((len = fr.read(cbuf)) != -1){ fw.write(cbuf,0,len);//每一次从cbuf写出len个字符 } } catch (IOException e) { e.printStackTrace(); } finally { //4.流资源的关闭 if (fr != null){ try { fr.close(); } catch (IOException e) { e.printStackTrace(); } } if (fw != null){ try { fw.close(); } catch (IOException e) { e.printStackTrace(); } } } }
1.3 BufferedInputStream、BufferedOutputStream对图片、视频的复制
图片
@Test public void BufferedTest(){ BufferedInputStream bis = null; BufferedOutputStream bos = null; try { //创建数据操作的对象 File srcfile = new File("爱情与友情.jpg"); File destfile = new File("爱情与友情3.jpg"); //创建流对象 FileInputStream fis = new FileInputStream(srcfile); FileOutputStream fos = new FileOutputStream(destfile); bis = new BufferedInputStream(fis); bos = new BufferedOutputStream(fos); //进行数据的处理 byte[] buffer = new byte[10]; int len; while ((len = bis.read(buffer)) != -1){ bos.write(buffer,0,len); } } catch (IOException e) { e.printStackTrace(); } finally { //要求:关闭的时候先关闭外层的流,再关闭内层的流,【在关闭外层流的时候,内层的流也会被关闭】 //流资源的关闭 if (bis != null){ try { bis.close(); } catch (IOException e) { e.printStackTrace(); } } if (bos != null){ try { bos.close(); } catch (IOException e) { e.printStackTrace(); } } } }
视频
public void testBufferCopy(String srcPath,String destPath){ BufferedInputStream bis = null; BufferedOutputStream bos = null; try { //创建数据操作的对象 File srcfile = new File(srcPath); File destfile = new File(destPath); //创建流对象 FileInputStream fis = new FileInputStream(srcfile); FileOutputStream fos = new FileOutputStream(destfile); bis = new BufferedInputStream(fis); bos = new BufferedOutputStream(fos); //进行数据的处理 byte[] buffer = new byte[1024]; int len; while ((len = bis.read(buffer)) != -1){ bos.write(buffer,0,len); } } catch (IOException e) { e.printStackTrace(); } finally { //要求:关闭的时候先关闭外层的流,再关闭内层的流,【在关闭外层流的时候,内层的流也会被关闭】 //流资源的关闭 if (bis != null){ try { bis.close(); } catch (IOException e) { e.printStackTrace(); } } if (bos != null){ try { bos.close(); } catch (IOException e) { e.printStackTrace(); } } } } @Test public void CopyBuffered(){ long start = System.currentTimeMillis(); String srcfile = new String("C:\\Users\\Administrator\\Desktop\\项目运行视频.mp4"); String destfile = new String("C:\\Users\\Administrator\\Desktop\\项目运行视频1.mp4"); testBufferCopy(srcfile,destfile); long end = System.currentTimeMillis(); System.out.println((end - start)); }
文本(实际上如果不输出,直接输入也可以实现对文本的操作)
@Test public void testBufferedReaderBufferedWriter(){ BufferedReader br = null; BufferedWriter bw = null; try { //1.创建操作文件的对象 File srcfile = new File("hello.txt"); File destfile = new File("hello3.txt"); //2.创建流对象 //节点流 FileReader fr = new FileReader(srcfile); FileWriter fw = new FileWriter(destfile); //处理流 br = new BufferedReader(fr); bw = new BufferedWriter(fw); //3.进行数据的处理 char[] cbuf = new char[1024]; int len; while ((len = br.read(cbuf)) != -1){ bw.write(cbuf,0,len); } } catch (IOException e) { e.printStackTrace(); } finally { //4.资源流的关闭 if (br != null){ try { br.close(); } catch (IOException e) { e.printStackTrace(); } } if (bw != null){ try { bw.close(); } catch (IOException e) { e.printStackTrace(); } } } }
1.4 BufferedReader 、BufferedWriter 对文本的复制
@Test public void testBufferedReaderBufferedWriter(){ BufferedReader br = null; BufferedWriter bw = null; try { //1.创建操作文件的对象 File srcfile = new File("hello.txt"); File destfile = new File("hello3.txt"); //2.创建流对象 //节点流 FileReader fr = new FileReader(srcfile); FileWriter fw = new FileWriter(destfile); //处理流 br = new BufferedReader(fr); bw = new BufferedWriter(fw); //3.进行数据的处理 char[] cbuf = new char[1024]; int len; while ((len = br.read(cbuf)) != -1){ bw.write(cbuf,0,len); } } catch (IOException e) { e.printStackTrace(); } finally { //4.资源流的关闭 if (br != null){ try { br.close(); } catch (IOException e) { e.printStackTrace(); } } if (bw != null){ try { bw.close(); } catch (IOException e) { e.printStackTrace(); } } } }
总结:
在使用的时候,使用缓冲流的情况下执行的速度会比较快,为了提高数据读写的速度,Java API提供了带缓冲功能的流类,在使用这些流类时,会创建一个内部缓冲区数组,缺省使用8192个字节(8Kb)的缓冲区。掌握两类字符流和字节流的操作之后,其余的都是雷同的。