黑马程序员技术交流社区
标题:
关于文件合并与分割,分割视频出现问题。
[打印本页]
作者:
Eric1225
时间:
2014-10-17 23:01
标题:
关于文件合并与分割,分割视频出现问题。
学习了JAVA基础的sequenceInputStream后自己写个个分割视频和合并视频的程序,可是每次分割后大小就变化了。合并后也不是原视频了。求解?
public static void merge() throws IOException{
ArrayList<FileInputStream> list=new ArrayList<FileInputStream>();
for(int i=0;i<12;i++){
list.add(new FileInputStream("E:\\myeclipseJava\\day20\\"+(i+1)+".part"));
}
final Iterator<FileInputStream> it=list.iterator();
Enumeration<FileInputStream> en=new Enumeration<FileInputStream>() {
@Override
public boolean hasMoreElements() {
// TODO Auto-generated method stub
return it.hasNext();
}
@Override
public FileInputStream nextElement() {
// TODO Auto-generated method stub
return it.next();
}
};
SequenceInputStream sis=new SequenceInputStream(en);
BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("E:\\myeclipseJava\\day20\\temp.rmvb"));
byte[] byts=new byte[1024*1024];
int len=0;
while((len=sis.read(byts))!=-1){
bos.write(byts, 0, len);
}
sis.close();
bos.close();
}
public static void part(){
BufferedInputStream fis=null;
BufferedOutputStream fos=null;
try{
fis=new BufferedInputStream(new FileInputStream("E:\\myeclipseJava\\day20\\0.rmvb"));
byte[] byts=new byte[1024*1024*2];
int len=0;
int count=1;
int sum=0;
while((len=fis.read(byts))!=-1){
if(sum==0){
fos=new BufferedOutputStream(new FileOutputStream("E:\\myeclipseJava\\day20\\"+(count++)+".part"));
fos.write(byts, 0, len);
sum++;
}else if(sum<50&&sum>0){
fos.write(byts,0,len);
sum++;
}else{
fos.close();
sum=0;
}
}
}catch(IOException e){
throw new RuntimeException("wrong");
}finally{
if(fis!=null){
try{
fis.close();
}catch(IOException e){
e.getStackTrace();
}
}
if(fos!=null){
try{
fis.close();
}catch(IOException e){
e.getStackTrace();
}
}
}
}
复制代码
作者:
戏言丶
时间:
2014-10-18 02:35
本帖最后由 戏言丶 于 2014-10-18 02:52 编辑
你分割方法中的循环写入错了,只new了一次输出流,下面是我写的,可以参考参考
虽然懒了点,但是还是加下注释
import java.io.*;
import java.util.*;
class SplitFile
{
public static void main(String[] args) throws IOException
{
//splitFile();
merge();
}
public static void merge() throws IOException
{
File file = new File("E:\\HM\\day24");
//找出分割为.part的文件
File[] files = file.listFiles(new FilenameFilter()
{
public boolean accept(File dir, String name)
{
return name.endsWith(".part");
}
});
long l = 0;
//计算所有分割文件的总大小
for (int i=0;i<files.length ; i++)
{
l = l+files[i].length();
}
//算出分割文件的数量
int p = (int)l/(1024*1024*2)+1;
//创建集合,里面存放文件流
ArrayList<FileInputStream> list = new ArrayList<FileInputStream>();
//将分割的文件名存入集合中
for(int i=1;i<=p;i++)
{
list.add(new FileInputStream(i+".part"));
}
final Iterator<FileInputStream> it = list.iterator();
//枚举所有的分割文件
Enumeration<FileInputStream> en = new Enumeration<FileInputStream>()
{
public boolean hasMoreElements()
{
return it.hasNext();
}
public FileInputStream nextElement()
{
return it.next();
}
};
//将分割文件串联
SequenceInputStream sis = new SequenceInputStream(en);
//创建缓冲输出流,并关联目的文件
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("temp.avi"));
byte[] buf = new byte[1024*1024];
int len = 0;
//将分割文件读取并写入目的文件中
while((len=sis.read(buf))!=-1)
{
bos.write(buf, 0, len);
}
sis.close();
bos.close();
}
public static void splitFile() throws IOException
{
//创建缓冲流,并关联源文件
BufferedInputStream fis = new BufferedInputStream(new FileInputStream("1.avi"));
BufferedOutputStream fos = null;
byte[] byts = new byte[1024*1024*2];
int len = 0;
int count = 1;
//将源文件分割保存
while((len=fis.read(byts))!=-1)
{
fos = new BufferedOutputStream(new FileOutputStream((count++)+".part"));
fos.write(byts, 0, len);
fos.close();
}
fis.close();
fos.close();
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2