java基础:12.3 字节流 InputStream、OutputStream、文件合并拆分
发布日期:2022-04-04 06:36:30
浏览次数:20
分类:博客文章
本文共 5554 字,大约阅读时间需要 18 分钟。
不同介质间进行数据交互,使用数据
流
来实现。 InputStream
是字节输入流
,同时也是抽象类,只提供方法声明,不提供方法的具体实现。
OutputStream
是字节输出流
,同时也是抽象类,只提供方法声明,不提供方法的具体实现。
关闭流
注意一点,输入流输出流使用完之后都应该关闭。如果不关闭,会产生对资源占用的浪费。一般关闭有两种方式。一. try
中关闭xx.close()
;
不推荐使用
二. finally
关闭
- 首先把流的引用声明在try的外面,如果声明在try里面,其作用域无法抵达finally.
- 在finally关闭之前,要先判断该引用是否为空
- 关闭的时候,需要再一次进行try catch处理这种方式严谨,但是看上去很繁琐,所以写不重要的或者测试代码的时候,都会采用try的方式。
三. try()
方式
AutoCloseable
,任何类实现了这个接口,都可以在try()中进行实例化。 并且在try, catch, finally结束的时候自动关闭,回收相关资源。try (FileInputStream fis = new FileInputStream(f))
{ … }
学习例程,使用输入流读出txt中的内容;使用输出流将指定字符输出到txt
package stream;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;public class Main { public static void main(String[] args) { try { File f1 =new File("f:/testfile/file.txt"); FileInputStream fis =new FileInputStream(f1); //创建基于文件的输入流 byte[] all =new byte[(int) f1.length()]; //创建字节数组,其长度就是文件的长度 fis.read(all); //以字节流的形式读取文件所有内容 for (byte b : all) { System.out.print(b); System.out.print(','); } fis.close(); //每次使用完流,都应该进行关闭 File f2 = new File("f:/testfile/stream-out.txt"); byte data[] = {73,32,76,79,86,69,32,67,104,101,110,103,68,117,46}; FileOutputStream fos = new FileOutputStream(f2); // 创建基于文件的输出流 fos.write(data); // 把数据写入到输出流 fos.close(); // 关闭输出流 } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
学习例程:输出流-当文件目录不存在时
package stream;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;public class Main { public static void main(String[] args) { String realPath = ""; String filepath = "f:/testfile/0319/file.txt"; String SplitPath[] = filepath.split("/"); for(int i=0; i < SplitPath.length - 1 ;i++) { realPath = realPath + SplitPath[i]; File f = new File(realPath); if(f.exists()); else f.mkdir(); realPath += "/"; } System.out.println(realPath); try { File f = new File(filepath); byte data[] = {73,32,76,79,86,69,32,67,104,101,110,103,68,117,46}; FileOutputStream fos = new FileOutputStream(f); // 创建基于文件的输出流 fos.write(data); // 把数据写入到输出流 fos.close(); // 关闭输出流 } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
合并文件,拆分文件
测试了一个.pptx的文件,程序能正确拆分,并能正确合并(打开无错误)。package stream;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.util.Arrays;public class OperateFile { /** * @param srcFile 要拆分的源文件 * @param eachSize 按照这个大小,拆分 */ public static void splitFile(File srcFile,int eachSize) { if (0 == srcFile.length()) throw new RuntimeException("文件长度为0,不可拆分"); byte[] fileContent = new byte[(int) srcFile.length()]; try { FileInputStream fis = new FileInputStream(srcFile); fis.read(fileContent); fis.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 计算需要被划分成多少份子文件 int fileNumber; if (0 == fileContent.length % eachSize) fileNumber = (int) (fileContent.length / eachSize); else fileNumber = (int) (fileContent.length / eachSize) + 1; for (int i = 0; i < fileNumber; i++) { String eachFileName = srcFile.getName() + i; File eachFile = new File(srcFile.getParent()+"//splitfile", eachFileName); byte[] eachContent; if (i != fileNumber - 1) eachContent = Arrays.copyOfRange(fileContent, eachSize * i, eachSize * (i + 1)); else eachContent = Arrays.copyOfRange(fileContent, eachSize * i, fileContent.length); try { FileOutputStream fos = new FileOutputStream(eachFile); // 写出去 fos.write(eachContent); fos.close(); System.out.printf("输出子文件%s,其大小是 %d字节%n", eachFile.getAbsoluteFile(), eachFile.length()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } /* 合并文件 * @param part 合并的文件共几份 * @param eachhsize 每一份文件的大小 */ public static void mergeFile(int part,int eachsize) { File destDirectory = new File("f:/testfile/splitfile/0321.pptx"); if(destDirectory.canExecute()) destDirectory.delete(); try { FileOutputStream fos = new FileOutputStream(destDirectory,true); int count = 0; while(count
public class Main { public static void main(String[] args) { int eachSize = 100 * 1024; // 100k File srcFile = new File("f:/testfile/0321.pptx"); OperateFile.splitFile(srcFile, eachSize); OperateFile.mergeFile(8,eachSize); } }
转载地址:https://www.cnblogs.com/l20902/p/10610886.html 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月22日 13时15分04秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Unity编辑器扩展——标签属性Attribute
2019-04-27
Unity中实现拖拽操作
2019-04-27
Unity中的UGUI事件系统
2019-04-27
C#中的常量
2019-04-27
C#中的静态变量与非静态变量
2019-04-27
C#中的ref、out、params关键字
2019-04-27
C#中的多态性
2019-04-27
C#中的命名空间
2019-04-27
设计模式——状态模式
2019-04-27
设计模式——工厂模式
2019-04-27
Unity中实现有限状态机FSM
2019-04-27
Unity中实现反弹
2019-04-27
U3D游戏开发框架(九)——事件序列
2019-04-27
Unity中解决“SetDestination“ can only be called on an active agent that has been placed on a NavMesh
2019-04-27
Unity中的刚体
2019-04-27
Unity中的坐标转换
2019-04-27
Unity中为什么不能对transform.position.x直接赋值?
2019-04-27
Unity中物体移动方法详解
2019-04-27
使用对象池优化性能
2019-04-27