2012-12-24 154 views
0

我想根據我的代碼發送文件夾在網絡上,如果一個文件夾包含它發送成功的文件,但它不會在客戶端創建一個文件夾,如果文件夾包含內部文件夾?在Java網絡中創建文件夾

服務器代碼:

ObjectOutputStream oos = new ObjectOutputStream(connection.getOutputStream()); 
File file = new File("home/"); 
File[] children = file.listFiles(); 

if (children != null) { 
    for (File child : children) { 
    all.add(child); 

    if(!child.isDirectory()){ 
     oos.writeObject(child.getName()); 
     FileInputStream fis = new FileInputStream(child); 

     while ((bytesRead = fis.read(buffer)) > 0) { 
     oos.writeObject(bytesRead); 
     oos.writeObject(Arrays.copyOf(buffer, buffer.length)); 
     } 

    } 
    } 
} 

客戶端代碼:

oos = new ObjectOutputStream(theSocket.getOutputStream()); 
ois = new ObjectInputStream(theSocket.getInputStream()); 

out = new PrintWriter(theSocket.getOutputStream()); 

while (true) { 
    Object o = ois.readObject(); 

    File file = new File(o.toString()); 

    if(file.isDirectory()) 
    File Dir = new File("new/").mkdir(); 
    if(!file.isDirectory()){ 
    FileOutputStream fos = new FileOutputStream(o.toString());  

    do { 
     o = ois.readObject(); 
     bytesRead = (Integer) o; 
     o = ois.readObject(); 
     buffer = (byte[])o; 

     fos.write(buffer, 0, bytesRead); 
    } 
    while (bytesRead == BUFFER_SIZE); 
    fos.close(); 
    } 
} 

它不顯示任何錯誤,而是創建名稱在客戶端的匿名文件(在服務器端文件夾)。請告訴我我的代碼有什麼問題!

+0

你確定你需要這個斜線呢? 'new File(「new /」)。mkdir()' – theMarceloR

+0

是的,沒有問題,只是用它在同一個目錄中創建文件夾 –

+0

對不起,只是想澄清你想解釋什麼:「我想在網絡上發送文件夾「=您想通過網絡將File對象的實例(目錄)發送到給定的目的地。 「根據我的代碼,如果一個文件夾包含文件,它會發送成功」..你使用無限循環?爲什麼不創建計劃任務來不時驗證該文件夾? (http://quartz-scheduler.org/)。 「但它不會在客戶端創建文件夾,如果文件夾包含內部文件夾?」..什麼?對不起,我不明白這個問題。 – theMarceloR

回答

0

我認爲(的一部分)你的答案是遞歸。有幾種方法可以做到這一點。一種是發送bytesRead爲-1或NULL作爲目錄,並在客戶端進行遞歸,另一種,我將在下面顯示(有點低效),是發送相對路徑與文件並根據需要創建目錄客戶端。

服務器端:

void processFile(File file, String path) 
{ 
    if (file.isDirectory()) 
    { 
    File[] children = file.listFiles(); 
    for (File child : children) 
    { 
     all.add(child); 
     processFile(child, path + file.getName() + "/"); 
    } 
    } 
    else 
    { 
    oos.writeObject(path + child.getName()); 
    FileInputStream fis = new FileInputStream(child); 
    while ((bytesRead = fis.read(buffer)) > 0) 
    { 
     oos.writeObject(bytesRead); 
     oos.writeObject(buffer); 
    } 
    oos.writeObject(BUFFER_SIZE); 
    } 
} 

調用與processFile(file, "")processFile(file, "/")

在通話結束後說出類似於oos.writeObject("")的內容,並在類似於name.length() == 0的客戶端進行檢查以瞭解何時停止。

客戶端:

while (true) 
{ 
    String name = (String)ois.readObject(); 
    if (name.length() == 0) break; 
    // "/new/" is the absolute path of the directory where you want all these files to be created 
    name += "/new/"; 

    File dir = new File(name.substring(0, name.lastIndexOf('/'))); 
    if (!dir.exists()) 
    dir.mkdirs(); 

    FileOutputStream fos = new FileOutputStream(new File(name));  

    bytesRead = (Integer) ois.readObject(); 
    while (bytesRead != BUFFER_SIZE) 
    { 
    buffer = (byte[])ois.readObject(); 
    fos.write(buffer, 0, bytesRead); 
    bytesRead = (Integer) ois.readObject(); 
    } 
    fos.close(); 
} 
相關問題