摘要: =i){eachContent=数组.copyOfRange(字节,eachReadSize*i,(i+1)*eachReadSize);}否则{eachContent=数组.copyOfRange(字节,eachReadSize*i,(int)file.length());}FilesubFile=newFile(dir+“/lol”+“-”+i+“.txt”);fileOutputStream=新文件输出流(子文件);文件输出流。写入(每个内容);文件输出流。close();系统出来printf(“输出子文件:%s,其大小为%d”,subFile,subFile.length());}}catch(IOExceptione){e.printStackTrace();}最后{if(fileInputStream!=null&&fileOutputStream!
分类在try中关闭 弊端是如果文件不存在或者读取的时候有问题而抛出异常,那么就不会执行流的关闭语句,存在资源占用隐患 在finally中关闭 这是标准的关闭流的方式 1、首先把引用声明在try外面,使其作用域达到finally 2、在finally中先判断应用是否为空 3、再使用一次try catch进行关闭 使用try()关闭 把流定义在try()里,try,catch或者finally结束的时候,会自动关闭 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 ( ) ;
}
FileInputStream fileInputStream = null;
FileOutputStream fileOutputStream = null;
try {
//创建输入流一次性读取文件中所有字节
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 = new FileOutputStream ( subFile) ;
fileOutputStream. write ( eachContent) ;
fileOutputStream. close ( ) ;
System. out. printf ( "输出子文件:%s,其大小是%d
" , subFile, subFile. length ( ) ) ;
}
} catch ( IOException e) {
e. printStackTrace ( ) ;
} finally {
if ( fileInputStream!= null && fileOutputStream != null ) {
try {
fileOutputStream. close ( ) ;
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) {
try ( FileInputStream inputStream = new FileInputStream ( file) ) {
len = inputStream. read ( b) ;
System. out. println ( len) ;
}
fileOutputStream. write ( b, 0 , len) ;
}
} catch ( IOException e) {
e. printStackTrace ( ) ;
}
}
}