对字节输入输出流的理解以及几道练习题
关于输入输出流,准确的来将应该是字节输入输出流,我草草总结了一下.使用的xmind思维导入工具(是锁哥给我们的),放上来吧.后续有学习到的话,再去添加修改吧.
1.将一个文件切割之后再合并
分割:将文件按照2M的大小来进行分割
因为要分割成多个文件,所以要设置一个变量,用来动态的生成新的用来存储分割后文件的文件
1 FileInputStream fis = new FileInputStream("D:\\test\\123\\1.mp3"); 2 int name = 1; 3 int len = 0; 4 byte[] b = new byte[1024*1024]; 5 while((len = fis.read(b))!= -1){ 6 FileOutputStream fos = new FileOutputStream("D:\\test\\456\\parts\\" + name + ".mp3"); 7 fos.write(b,0,len); 8 fos.close(); 9 name++; 10 }
合并:将分割下的文件来合并成完整的文件(我这边有8个文件,所以循环8次)
只需要生成一个最终的文件来存储之前的8个碎片
1 //先创建输入流对象,用循环把文件都读入到内存中 2 FileOutputStream fos = new FileOutputStream("D:\\test\\123\\aa.mp3"); 3 for(int i = 1;i <= 8;i++){ 4 byte[] b = new byte[1024*1024]; 5 int len = 0; 6 FileInputStream fis = new FileInputStream("D:\\test\\456\\parts\\" + i + ".mp3"); 7 while((len = fis.read(b))!= -1){ 8 fos.write(b,0,len); 9 } 10 fis.close(); 11 } 12 fos.close();
2.把指定目录下D:\test1(不包含子目录)的所有图片,复制到另一个指定目录下D:\test1\pic(使用文件过滤器来过滤图片)
应用了局部内部类,在以后的使用中会越来越多
注意: 当时解这道题目的时候,对我来说,主要的难点就是复制之后,怎么样生成新的目录,去保存他们
两种办法:
1.使用一个变量n.这个n用来控制复制之后的文件的名字,之后的命名为1,2,3,....jpg
2.使用后来的目的地目录和文件的名字拼接成一个File对象,把之前的文件名字也一并复制过来.
这两种在我下面的代码中都有体现
1 public static void main(String[] args) throws Exception { 2 //先使用过滤器过滤 3 File dir = new File("D:\\test1"); 4 //使用匿名内部类实现构造器 5 File[] names = dir.listFiles(new FileFilter() { 6 7 @Override 8 public boolean accept(File pathname) { 9 //复写accept函数 10 return pathname.isFile() && pathname.getName().endsWith(".JPG"); 11 } 12 }); 13 //name代表的是符合条件的文件的路径,数量是names.length; 14 //使用一个n作为名字的变量的控制器 15 int n =1; 16 for(File name : names){ 17 // if(n >1) 18 // n++; 19 String s = n + ".JPG"; 20 method(name,s); 21 n++; 22 } 23 24 } 25 26 private static void method(File name,String s) throws FileNotFoundException, IOException { 27 //根据具体的name获得对应的输入流对象 28 FileInputStream fis = new FileInputStream(name.getAbsolutePath()); 29 //将输入流对象读入到内存中 30 byte[] b = new byte[1024]; 31 int len = 0; 32 // File file = new File("D:\\test1\\pic\\",name.getName()); 33 File file = new File("D:\\test1\\pic\\",s); 34 FileOutputStream fos = new FileOutputStream(file); 35 while((len = fis.read(b))!= -1){ 36 fos.write(b,0,len); 37 } 38 //System.out.println("1"); 39 fos.close(); 40 }
3.需求:使用文件队列的方式遍历指定目录下(包含子目录)的所有.java文件的路径写入到txt中
使用递归,一层一层的向下遍历
1 public static void main(String[] args) throws Exception { 2 // 3 File dir = new File("D:\\test2"); 4 File dest = new File("D:\\test1\\java.txt"); 5 6 findFolderAndFile(dir,dest); 7 System.out.println("Done"); 8 } 9 10 11 private static void findFolderAndFile(File dir,File dest) throws Exception { 12 //列出目标文件中的所有的文件或文件夹,写过滤器 13 File[] files = dir.listFiles(new FileFilter() { 14 15 @Override 16 public boolean accept(File pathname) { 17 //要获得的是父目录以及其下的子目录,只要满足.java或者是文件夹就可以放行 18 return pathname.isDirectory() || pathname.getName().endsWith(".java"); 19 } 20 }); 21 //对files进行遍历 22 for(File file : files){ 23 if(file.isFile()){ 24 //这个file就是已经找到的符合条件的.java文件.创建输出流输出到目标文件 25 FileOutputStream fos = new FileOutputStream(dest,true); 26 String name = file.getAbsolutePath(); 27 String line_separator = System.getProperty("line.separator"); 28 fos.write((name + line_separator).getBytes()); 29 }else{ 30 findFolderAndFile(file,dest); 31 } 32 } 33 }
4.复制指定目录下的以及子目录子子目录下的文件和文件夹到其他目录下
这道题目解起来也是挺费劲的,中间涉及到的判断比较多.
主要卡住我的点是,因为是复制所有的文件和文件夹以及子目录中的等等,因此没有使用过滤器.
复制的目标路径的获得是一个重点.目标路径中,没有这个文件的话,就要创建这个文件,没有这个文件夹的话,就要创建这个文件夹.通过多层的判断来实现
遍历源目录下所有文件对象
判断每一个文件对象 属于文件 还是文件夹
是文件:
获取文件的父路径,判断父路径是否存在
存在:把源文件写入目标文件中(创建目标文件对象)
不存在:创建父路径,再把把源文件写入目标文件中
是文件夹:
判断文件夹是否存在,存在:不执行任何操作, 不存在:创建文件夹
再次获取源文件夹下所有的文件对象
1 public static void main(String[] args) throws Exception { 2 // 3 File dir = new File("D:\\test1"); 4 File dest = new File("D:\\test3"); 5 6 findFoldersAndCopy(dir,dest); 7 System.out.println("done"); 8 9 } 10 11 private static void findFoldersAndCopy(File dir, File dest) throws Exception { 12 //遍历源文件下所有的文件/文件夹对象 13 File[] files = dir.listFiles(); 14 for(File file : files){ 15 File destFileName = new File(dest,file.getName()); 16 if(file.isFile()){ 17 if(!destFileName.exists()) destFileName.createNewFile(); 18 FileInputStream fis = new FileInputStream(file.getAbsolutePath()); 19 FileOutputStream fos = new FileOutputStream(destFileName); 20 byte[] b = new byte[1024]; 21 int len = 0; 22 while ((len = fis.read(b)) != -1) { 23 fos.write(b, 0, len); 24 } 25 } 26 if(file.isDirectory()){ 27 if(!destFileName.exists()) destFileName.mkdir(); 28 findFoldersAndCopy(file, destFileName); 29 } 30 } 31 32 33 }
以上的这些代码,我很多都没有进行异常的捕获,太多了,比较复杂,不利于解题.因此也就没有写了.
使用输入输出流的过程中,有很多是没有对控制台输出的.后来我为了提示我自己程序完成了,可以在程序的最后加上一道输出语句.例如"Done".也可以执行一些计算运行时长的功能.
关于复制的问题,嗯,比如说,把A文件夹下的a文件--->复制到B文件下.这时的输出流的构造函数中是不能直接写B的路径的,需要给出在B文件夹下的具体哪个文件,文件叫什么名字.
1.new FileInputStream("D:\\test\\1.txt") 输入流中,如果这个1.txt文件是不存在的,那么系统会自动帮忙创建;
2.new FileOutputStream("D:\\test\\1.txt"); 输出流中,如果没有给定1.txt的话,这样是肯定会报错的,系统不知道要将数据写到哪里去.
3.如果是把文件从源文件夹中复制到目标文件夹中,那么在目标文件夹中一定要给定具体的接收复制过来数据的新的文件名称.例如上面的第一题.经过测试,如果不给定的话,会报错.xxxx文件夹没有访问权限.
4.如果是要复制文件夹的话,其中会多一步去创建文件夹的过程.在练习第4题中有体现.
转载于:https://www.cnblogs.com/leevanes/p/6546036.html
对字节输入输出流的理解以及几道练习题相关推荐
- java学习笔记IO之字节输入输出流
IO字节输入输出流 OutputStream:字节输出流 该抽象类是所有字节输出流的超类: 定义了一些共性的成员方法: 1.写入一个字节 void write(int b);//b表示字节 2.写入字 ...
- java 字节输出流_Java IO详解(三)------字节输入输出流
那么这篇博客我们讲的是字节输入输出流:InputStream.OutputSteam(下图红色长方形框内),红色椭圆框内是其典型实现(FileInputSteam.FileOutStream) 1.字 ...
- 字节输入输出流,文件输入输出流
1.字节输入输出流 1.1 字节输入流 InputStream 类及其子类的对象表示字节输入流,InputStream 类的常用子类如下. ByteArrayInputStream 类:将字节数组转换 ...
- IO流基本知识总结【字节输入输出流、字符输入输出流、转换流、对象流】
1.概述: 流是可以承载东西的数据流:java中io流也是用来承载运输数据的. 2.分类: 1.按流向分:[参考内存:进入内存叫做输入,出内存叫做输出] 1.输入流:承载数据进入内存的流叫做输入流 2 ...
- 1.6 Java字节流的使用:字节输入/输出流、文件输入/输出流、字节数组输入/输出流
InputStream 是 Java 所有字节输入流类的父类, OutputStream 是 Java 所有字节输出流类的父类, 它们都是一个抽象类,因此继承它们的子类要重新定义父类中的抽象方法. 下 ...
- 字节输入输出流,字符输入输出流
IO流按功能分为节点流 处理流 节点流:可以从或向一个特定的地方读写字节数据: 处理流:对一个已经存在的流的连接和封装,通过所封装的流的功能调用实现数据重写. 1.字节输入流InputStream, ...
- Java-IO流(File操作,字符输入输出流,字节输入输出流,缓冲流,对象流)
File对象 File的介绍 File 类 就是当前系统中 文件或者文件夹的抽象表示 通俗的讲 就是 使用File对象 来操作我们电脑系统中的文件或者文件夹 学习File类 其实就是学习 ...
- java的输出流包括_【转】输入/输出流 - 深入理解Java中的流 (Stream)
基于流的数据读写,太抽象了,什么叫基于流,什么是流?Hadoop是Java语言写的,所以想理解好Hadoop的Streaming Data Access,还得从Java流机制入手.流机制也是JAVA及 ...
- Java中字节输入输出流
这里的输入和输出是相对于我们的java代码而言的,所谓字节输入流,也就是读取到我们的程序中,字节输出流是写入到我们的文件中 字节输入流 InputStream:这个抽象类是表示输入字节流的所有类的超类 ...
- java字节输出流方法,Java-IO:File和字节输入输出流
一. File类 我们可以通过File类的一个接受字符串类型的构造方法来创建一个File实例 File(String pathname)// 通过将给定路径名字符串转换为抽象路径名来创建一个新 Fil ...
最新文章
- 获取服务端https证书
- 2019中国大学生程序设计竞赛(CCPC) - 网络选拔赛 Fishing Master
- python怎么调用navicat_三十七、python操作mysql,和navicat
- 改善Python程序的91个建议(二)
- Web开发秘方(WEB DEVELOPMENT RECIPES)[47.5MB] PDF扫描版
- 微软开源其 C++ 标准库实现 STL
- PyTorch 模型训练实用教程(附代码)
- PostgreSQL 查看数据库,索引,表,表空间大小
- 在Ubuntu 16.04上增加Swap分区
- redis数据库的基础
- 拓端tecdat|R语言使用Rasch模型分析学生答题能力
- spring5.0学习笔记3
- labview csv文件处理_Labview搭建Web服务器
- 使用Hackintool工具生成全新的序列号及更改黑苹果SN三码序列号简易版教程
- Ubuntu安装兄弟打印机驱动
- Adaptive AUTOSAR和Classic AUTOSAR
- 3-2Java数组----一维数组的使用----练习1(电话)
- 构造虚假栈帧 | 花式栈溢出
- 使用“soup.h1.text”爬虫提取标题会多一个\
- [转] 程序员才懂的58张图片,哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈
热门文章
- 一例WINDOWS系统上的JAVA UI卡死
- OpenCV绘制半透明效果的代码
- 解决办法:下列软件包有未满足的依赖关系,依赖。。。但是。。。正要被安装
- 将RGB转换为JPG格式到内存的代码
- 大数据面试3分钟自我介绍_大数据开发工程师面试主要面试内容
- QT 静态链接库和动态链接库
- android notify,android4.0 MediaPlayer的notify监听机制的全面剖析
- python装饰器举例_Python学习笔记:装饰器(Decorator)
- excel vba系统下载_作品分享:《Excel VBA实用程序集(第2版)》下载
- zookeeper 阿里滴滴 有点用 zookeeper主从选举方式