关于一个用JAVA进行文件分割的问题(100分)

  • 主题发起人 snowrain
  • 开始时间
S

snowrain

Unregistered / Unconfirmed
GUEST, unregistred user!
Filename是被分割的文件的全路径文件名
disksize是被分割成的小文件的大小
filenum是这个被分割的文件要被分成的块数
……
try{
for (int i=0 ;i<filenum;i++)
{
FileInputStream fileinputstream =new FileInputStream(Filename);
FileOutputStream fileoutputstream =new FileOutputStream(Filename+Integer.toString(i) );
BufferedInputStream bufferedinputstream =new BufferedInputStream(fileinputstream);
BufferedOutputStream bufferedoutputstream =new BufferedOutputStream(fileoutputstream);
int n,currentsize=0;
byte[] buff=new byte[disksize];
if ((n=bufferedinputstream.read(buff,disksize*i,buff.length))!=-1)
bufferedoutputstream.write(buff,0,n);
bufferedoutputstream.flush();
bufferedoutputstream.close();
bufferedinputstream.close();
}
}
catch( Exception e3){e3.printStackTrace();}
……
上面我想利用read(buff,disksize*i,……)中disksize*i来标明每次产生的小文件在被分割文件中的offset。
但是不能正常生成各个小文件,只能生成2个,而且第二个是0byte的。
不知我上面的程序哪个地方错了,请指教!(我刚刚开始学习JAVA,请各位大侠讲仔细点)
BTW:
程序同时报出这个异常:
java.lang.IndexOutOfBoundsException
at java.io.BufferedInputStream.read(BufferedInputStream.java:275)
at testui.MainForm.StartSplit_actionPerformed(MainForm.java:199)
at testui.MainForm$4.actionPerformed(MainForm.java:94)
at java.awt.Button.processActionEvent(Button.java:329)
at java.awt.Button.processEvent(Button.java:302)
at java.awt.Component.dispatchEventImpl(Component.java:2595)
at java.awt.Component.dispatchEvent(Component.java:2499)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:319)
at java.awt.EventDispatchThread.pumpOneEvent(EventDispatchThread.java:103)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:84)
不知道怎么去分析这个错误输出?
 
大侠们给点帮助嘛~
 
试试看,不一定对 :)
try
{
FileInputStream fileinputstream =new FileInputStream(Filename);
BufferedInputStream bufferedinputstream =new BufferedInputStream(fileinputstream);
for (int i=0 ;i<filenum;i++)
{
FileOutputStream fileoutputstream =new FileOutputStream(Filename+Integer.toString(i) );
BufferedInputStream bufferedinputstream =new BufferedOutputStream(fileoutputstream);
int n,currentsize=0;
byte[] buff=new byte[disksize];
if ((n=bufferedinputstream.read(buff,disksize*i,buff.length))!=-1)
bufferedoutputstream.write(buff,0,n);
bufferedoutputstream.flush();
bufferedoutputstream.close();
fileoutputstream.close();
}
bufferedinputstream.close();
fileinputstream.close();
}
catch( Exception e3){e3.printStackTrace();
}
 
还是不对,问题还没有解决!
 
try
{ FileInputStream fileinputstream =new FileInputStream(Filename);
BufferedInputStream bufferedinputstream =new BufferedInputStream(fileinputstream);
for (int i=0 ;i<filenum;i++)
{
FileOutputStream fileoutputstream =new FileOutputStream(Filename+Integer.toString(i) );
BufferedOutputStream bufferedoutputstream =new BufferedOutputStream(fileoutputstream);//修改
int n,currentsize=0;
byte[] buff=new byte[disksize];
if ((n=bufferedinputstream.read(buff,disksize*i,buff.length))!=-1)
bufferedoutputstream.write(buff,0,n);
bufferedoutputstream.flush();
bufferedoutputstream.close();
fileoutputstream.close();
}
bufferedinputstream.close();
fileinputstream.close();
}
catch( Exception e3){e3.printStackTrace();
}
这段代码也有问题。经过跟踪测试,我发现在第二次读取数据流时发生错误,
n=bufferedinputstream.read(buff,disksize*i,buff.length)
可能是溢出错误(IndexOutOfBoundsException),由于我刚学java几天,无法更正。
 
to snowrain,
总算找到错误了,原来是你对bufferedinputstream.read(buff,off,len)这个函数
理解不对,它是从数据流中读取len个字节的数据放在buff数组中(从off位置开始放),
off不是读取文件的起始地址。现在你明白了吗》?
 
这个问题,我已经知道,但现在还有个问题,
大家谁能控制一个BufferedInputStream读到一个固定的位置,然后停下来?
 
happyloner说得对。
这里有个将文件分块多线程复制的: [8D]
http://www.delphibbs.com/delphibbs/DispQ.asp?LID=1909652
 
顶部