java基础:12.3 字节流 InputStream、OutputStream、文件合并拆分
发布日期:2022-04-04 06:36:30 浏览次数:20 分类:博客文章

本文共 5554 字,大约阅读时间需要 18 分钟。

 

不同介质间进行数据交互,使用数据来实现。

InputStream字节输入流,同时也是抽象类,只提供方法声明,不提供方法的具体实现。

FileInputStream 是InputStream子类。

OutputStream字节输出流,同时也是抽象类,只提供方法声明,不提供方法的具体实现。

FileOutputStream 是OutputStream子类。

关闭流

注意一点,输入流输出流使用完之后都应该关闭。如果不关闭,会产生对资源占用的浪费。一般关闭有两种方式。

一. try中关闭xx.close()

在try的作用域里关闭文件输入流,但这样做有一个弊端;如果文件不存在,或者读取的时候出现问题而抛出异常,那么就不会执行这一行关闭流的代码,存在巨大的资源占用隐患。 不推荐使用

二. finally关闭

标准的关闭流的方式

  1. 首先把流的引用声明在try的外面,如果声明在try里面,其作用域无法抵达finally.
  2. 在finally关闭之前,要先判断该引用是否为空
  3. 关闭的时候,需要再一次进行try catch处理
    这种方式严谨,但是看上去很繁琐,所以写不重要的或者测试代码的时候,都会采用try的方式。

三. try()方式

把流定义在try()里,try,catch或者finally结束的时候,会自动关闭。所有的流,都实现了一个接口叫做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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:java基础:12.4 字符流 Reader Writer
下一篇:java基础:12.2 文本I/O(二)File类、遍历

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月22日 13时15分04秒