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();
}
}
}
版权声明:本文为qq_41293896原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。