需求:
有一个文件,对文件拆分,按照256的char进行拆分,允许超出10%溢出范围
例如:一个文件516char,理论说拆分3个 1个256 1个256 1个4
最后一个会造成资源的,最后剩余的在256的10%的范围内,写入到前一个文件中
思路:
对于字符溢出 256*10%=26;256+26=282;设置字节数组大小为282,对读取满和读取不满另作分析;
public static void main(String[] args) throws Exception{
InputStreamReader isr = new InputStreamReader(new FileInputStream("E:\\IdeaFile\\BigData\\data\\Test.txt"));
//给定数组大小,每读一次存储一个小文件
// 256 256+256*10%=282
// 大小给上282,方便与读取判断是否在溢出的10%的范围内
int flag=0;//标记切分文件的个数
int index=0;//用于获取线标,方便元素前移和读取数据
int len=282;//控制第一次读取的长度为282;
OutputStreamWriter osw = null;
char[] chars=new char[282];
int i;
while((i=isr.read(chars,index,len))!=-1){
//选择每次读取282个字符,但是不全部写入
if(i==282||i=256){
osw=new OutputStreamWriter(
new FileOutputStream("E:\\IdeaFile\\BigData\\slipt\\part-" + flag));
osw.write(new String(chars,0,256));
//会多余出来26个字符 在下一次读取时候会存储到下一个文件中
//对元素进行偏移
index=0;
for(int j=256;j<=281;j++){
chars[index]=chars[j];
index++;
}
osw.close;
} else{
//若读取不满256和282,则有两种可能
//1.加上26也没有溢出直接存储,满足需求
//2.加上26溢出了,但是没有超过282,同样满足需求
i=i+26;
osw=new OutputStreamWriter(
new FileOutputStream("E:\\IdeaFile\\BigData\\slipt\\part-" + flag));
osw.write(new String(chars,0,i));
osw.close();
}
flag++;
}
isr.read();
isr.close();
}
}