Java--第2天--IO流(二)

1.以字节流的形式读取文件内容

InputStream是字节输入流,同时也是抽象类,只提供方法声明,不提供方法的具体实现。
FileInputStream是InputStream子类,以FileInputStream进行文件读取。

package io;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

/**
 * 以字节流的形式读取文件内容
 * @author eleven
 *思路:
 *1.准备文件eleven.txt,并在里面写入A和B,结果是65和66
 *2.创建文件的输入流
 *3.创建字节数组,其长度就是文件的长度
 *4.以字节流的形式读取文件的所有内容
 *5.关闭流	
 */
public class IoDemo2 {
	public static void main(String[] args) {
		try {
			//1.找到文件eleven.txt,并在里面写入A和B两个数字
			File f = new File("F:/eleven.txt");
			
			//2.创建文件的输入流
			FileInputStream fis = new FileInputStream(f);
			
			//3.创建字节数组,字节数组的长度就是文件的长度
			byte[] all =  new byte[(int)f.length()];
			
			//4.以字节流的形式读取文件的所有内容
			fis.read(all);
			for (byte b : all) {
				System.out.println(b);
			}
			
			//5.关闭流
			fis.close();
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
}

打印结果:

65
66

2.写入数据到文件中

package io;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 *  要求:以字节流形式向文件写入数据
 * @author eleven
 *
 */
public class TestStream {
	
	public static void main(String[] args) {
		try {
		File f = new File("F:/eleven/abc.txt");
		
		//默认情况下,目录不存在,会报错
		//1.获取文件所在的目录
		File dir = f.getParentFile();
		
		//2.如果该目录不存在,就创建该目录
		if(!dir.mkdirs()) {
			dir.mkdirs();
		}
		
		byte data[] = { 88,89 };
		FileOutputStream fos = new FileOutputStream(f);
		
		//3.将data数据写入txt文件中
		fos.write(data);
		System.out.println("写入成功");
		fos.close();
		}
		catch(IOException e){
			e.printStackTrace();
		}
	}

}

运行结果:
在这里插入图片描述
因为在ASCll中:
在这里插入图片描述
3.分解、合并文件
要求:找到一个大于100k的文件,按照100k为单位,拆分成多个子文件,并且以编号作为文件名结束。

拆分:

package io;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;

public class IoDemo3 {
	public static void main(String[] args) {
		int eachSize = 100 * 1024;//100k
		File srcFile = new File("C:\\Users\\Administrator\\Desktop\\西游记.wmv");
		splitFile(srcFile,eachSize);
	}

	/**
	 * 拆分思路:
	 * 1.先把源文件的所有内存读取到内存中,然后从内存中挨个分到子文件夹中
	 * 
	 * @param srcFile 要拆分的源文件
	 * @param eachSize 按照这个大小,拆分
	 */
	private 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);
		}catch(IOException e){
			e.printStackTrace();
		}
		//计算需要被划分成多少份子文件
		int fileNumber;
		//文件是否能被整除得到的子文件个数是不一样的
		//假设文件长度是25,每份的大小是5,那么就应该是5个
		//假设文件长度是26,每份的大小是5,那么就应该是6个
		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(), eachFileName);
			 byte[] eachContent;
			 // 从源文件的内容里,复制部分数据到子文件
	            // 除开最后一个文件,其他文件大小都是100k
	            // 最后一个文件的大小是剩余的
	            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();
	            }
	        }
	    }
	}

合并

package io;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.security.auth.DestroyFailedException;
public class IoDemoHeBing {

	public static void main(String[] args) {
		murgeFile("C:\\\\Users\\\\Administrator\\\\Desktop", "西游记.wmv");
	}

	/**
	 * 合并的思路,就是从eclipse.exe-0开始,读取到一个文件,就开始写出到 eclipse.exe中,直到没有文件可以读
	 * @param folder
	 *            需要合并的文件所处于的目录
	 * @param fileName
	 *            需要合并的文件的名称
	 * @throws FileNotFoundException
	 */
	private static void murgeFile(String folder, String fileName) {

		try {
			// 合并的目标文件
			File destFile = new File(folder, fileName);
			FileOutputStream fos = new FileOutputStream(destFile);
			int index = 0;
			while (true) {
				//子文件
				File eachFile = new File(folder, fileName + "-" + index++);
				//如果子文件不存在了就结束
				if (!eachFile.exists())
					break;

				//读取子文件的内容
				FileInputStream fis = new FileInputStream(eachFile);
				byte[] eachContent = new byte[(int) eachFile.length()];
				fis.read(eachContent);
				fis.close();
				
				//把子文件的内容写出去
				fos.write(eachContent);
				fos.flush();
				System.out.printf("把子文件 %s写出到目标文件中%n",eachFile);
			}

			fos.close();
			System.out.printf("最后目标文件的大小:%,d字节" , destFile.length());
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

}

猜你喜欢

转载自blog.csdn.net/qq_41293896/article/details/86553450