2016-09-23 68 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