2016-09-23 62 views
-3

我试图创建一个备份程序来使用。我可以备份小文件,但只要我尝试备份任何大文件,就会得到ArrayIndexOutOfBoundsException。Java传输文件arrayindexoutofboundsexception

 FileOutputStream fos = new FileOutputStream(dp.getPath() + ".jbackup"); 
    byte[] buffer = new byte[4096]; 
    int fileSize = (int)f.length(); 
    int read = 0; 
    int remaining = fileSize; 
    while((read = dis.read(buffer, 0, Math.min(buffer.length, remaining))) > 0) { 
     remaining -= read; 
     fos.write(buffer, 0, read); 
    } 

有什么建议吗?

+0

这是功课吗?如果没有,你应该使用类似['IOUtils']的库(https://commons.apache.org/proper/commons-io/javadocs/api-2.5/org/apache/commons/io/IOUtils.html)任务。 –

+0

不,但我通常会做所有没有库的东西(不包括反射,javassist) –

+1

嗯,我认为这个问题本身就表明也许你不应该这样做。看看'IOUtils'中的各种'copy()'方法;你可以在一行中做到这一点,并保证工作。 –

回答

-1

如果你想更快的方式,并能复制3GB大小的文件试试这样:

import java.io.IOException; 
import java.nio.file.Files; 
import java.nio.file.Paths; 
import java.nio.file.StandardCopyOption; 

public class Foo 
{ 
    public static void main(final String... args) 
     throws IOException 
    { 
     Files.copy(Paths.get("/home/your file path"), 
      Paths.get("/destination"), StandardCopyOption.REPLACE_EXISTING); 
    } 
} 
+0

他没有要求更快的方法。他问他现在的代码有什么问题。 – EJP

0
int fileSize = (int)f.length(); 

的问题是在这里。您刚刚创建了该文件。它的长度是零。使用它作为此副本的边界条件没有任何意义。

您的代码似乎来自here,其中fileSize来自发件人。您还应该注意,在该代码中,它是一个long。您的版本不会处理超过2GB的文件。

但很难相信这是真正的代码。这里没有什么会抛出IndexOutOfBoundsException

+0

谢谢。该代码不是从那里,但由于某种原因,我铸造诠释读取,而不是Math.min .. –

+0

@RichardPavlov我不能从'铸诠释读取而不是Math.min'任何意义。 – EJP