创建基于文件的输入输出流
package JavaIOTest;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class BuildInputStream {
public static void main(String[] args) {
try {
File file = new File("d:/lol.txt");
//创建基于文件的输入流
FileInputStream fileInputStream = new FileInputStream(file);
File file1 = new File("d:/lol.txt");
//创建基于文件的输出流
FileOutputStream fileOutputStream = new FileOutputStream(file1);
}catch (Exception e) {
e.printStackTrace();
}
}
}
以字节流的形式读取文件内容
InputStream是字节输入流,同时也是抽象类,只提供方法声明,不提供方法的具体实现。
FileInputStream 是InputStream子类,以FileInputStream 为例进行文件读取
package JavaIOTest;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class BuildInputStream {
public static void main(String[] args) {
try {
//准备lol.txt其内容为AB ASCII:65 66
File file = new File("d:/lol.txt");
//创建基于文件的输入流
FileInputStream fileInputStream = new FileInputStream(file);
//创建字节数组,其长度就是文件的长度
byte[] all = new byte[(int)file.length()];
//以字节流的形式读取文件内容
fileInputStream.read(all);
for(byte b : all){
System.out.println(b);
}
//每次用完流都应进行关闭
fileInputStream.close();
}catch (Exception e) {
e.printStackTrace();
}
}
}
以字节流的形式向文件写数据
package JavaIOTest;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class BuildInputStream {
public static void main(String[] args) {
try {
File file1 = new File("d:/lol2.txt");
//创建基于文件的输出流
FileOutputStream fileOutputStream = new FileOutputStream(file1);
//准备长度为2的字节数组,初始化为88,89,对应X,Y
byte[] b1 = new byte[]{88,89};
//将数据写入输出流
fileOutputStream.write(b1);
//关闭输出流
fileOutputStream.close();
}catch (Exception e) {
e.printStackTrace();
}
}
}
使用mkdir创建多级目录
package JavaIOTest;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutPutStreamTest {
String[] path;
public static void main(String[] args) {
File file = new File("d:/xyz/z/zzz/zzzz/lol.txt");
File dir = file.getParentFile();
if (!dir.exists()){
dir.mkdirs();
}
try {
FileOutputStream fileOutputStream = new FileOutputStream(file);
byte[] b = new byte[]{89,87};
fileOutputStream.write(b);
fileOutputStream.close();
}catch (IOException e){
e.printStackTrace();
}
}
练习:分割文件
将一个13字节的文件按2字节分割为多份子文件
package JavaIOTest;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;
public class SplitFileTest {
public static void main(String[] args) {
//每次读的字节数
int eachReadSize = 2;
//子文件数量
int subFileNumber;
//每次读取的内容存放到eachContentzhong
byte[] eachContent;
//创建文件对象
File file = new File("d:/xyz/z/zzz/zzzz/lol.txt");
File dir = file.getParentFile();
//判断父目录是否存在,不存在则创建父目录
if (!dir.exists()){
dir.mkdirs();
}
try{
//创建输入流一次性读取文件中所有字节
FileInputStream fileInputStream = new FileInputStream(file);
byte[] bytes = new byte[(int)file.length()];
fileInputStream.read(bytes);
//判断子文件数量
if (0 == file.length()%eachReadSize){
subFileNumber = (int)file.length()/2;
}else{
subFileNumber = (int)file.length()/2 + 1;
}
for(int i = 0; i < subFileNumber;i++){
//判断每次写文件的长度,如果不是最后一个文件则长度为2字节,如果是最后一个文件则长度是文件剩余长度
if(subFileNumber-1 != i){
eachContent = Arrays.copyOfRange(bytes,eachReadSize * i,(i+1) * eachReadSize);
}else {
eachContent = Arrays.copyOfRange(bytes,eachReadSize * i,(int)file.length());
}
File subFile = new File(dir+"/lol"+"-"+i+".txt");
FileOutputStream fileOutputStream = new FileOutputStream(subFile);
fileOutputStream.write(eachContent);
fileOutputStream.close();
System.out.printf("输出子文件:%s,其大小是%d
",subFile,subFile.length());
}
fileInputStream.close();
}catch (IOException e){
e.printStackTrace();
}
}
}
练习:合并文件
将上一个练习中的文件全部合并,并验证能否打开
package JavaIOTest;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
//1、创建目标文件
//2、读一次子文件写一次子文件
//3、使用输出IO流输出
public class MergeFileText {
public static void main(String[] args) {
//创建最终写入的目标文件对象
File targetFile = new File("d:/xyz/z/zzz/zzzz/lol3.txt");
//创建一个文件列表对象用于存放子文件对象
List<File> subFiles = new ArrayList<>();
//获取当前目录对象
File dir = targetFile.getParentFile();
//得到当前目录下的所有文件和目录的数组
File[] allFiles = dir.listFiles();
//创建一个字节数组对象长度为2
byte[] b = new byte[2];
//读取文件的实际长度为len
int len = -1;
//找到所有的子文件并添加到列表中
for (File file : allFiles){
if (file.isFile()&& file.getName().startsWith("lol-")){
subFiles.add(file);
}
}
try{
//创建输出流
FileOutputStream fileOutputStream = new FileOutputStream(targetFile);
//每读一个写一个
for(File file : subFiles){
FileInputStream inputStream = new FileInputStream(file);
len = inputStream.read(b);
System.out.println(len);
inputStream.close();
fileOutputStream.write(b,0,len);
}
fileOutputStream.close();
}catch (IOException e){
e.printStackTrace();
}
}
}