-2

以下のような数千の小さなファイルを送信するサーバーがあります。

static File file = null;

static File temp = null;
private static ServerSocket serverSocket;
private static Socket socket;


public static void main(String[] args) throws FileNotFoundException, IOException 
{

    serverSocket = new ServerSocket(3000);
    socket = serverSocket.accept();
    System.out.println("Connected");



    File folder = new File("C:...\\Desktop\\thousands_of_tiny_files");
    File[] listOfFiles = folder.listFiles();
    File result[]=new File[listOfFiles.length];


    byte [] bytearray  = null;
    FileInputStream fin =null;
    BufferedInputStream bin = null; 



    for(int j=0;j<listOfFiles.length;j++){

        String path= listOfFiles[j].getPath();

        result=sendFile(path);
        for(int i=0;i<result.length;i++)   
        {
            fin = new FileInputStream(result[i]);
            bin = new BufferedInputStream(fin); 
            bytearray  = new byte [(int)result.length];
            bin.read(bytearray,0,bytearray.length);
            OutputStream os = socket.getOutputStream();
            System.out.println("Sending Files "+ result[i]);

            os.write(bytearray,0,bytearray.length);
            os.flush();

            System.out.println("File transfer completed");        

        }
    }
 fin.close();
 bin.close();
 socket.close();
}

public static File[] sendFile(String path)
{
    File folder = new File(path);
    File[] listOfFiles = folder.listFiles();

    File[] resultt = new File[listOfFiles.length];
    for(int i=0;i<listOfFiles.length;i++)
    {
        temp=listOfFiles[i];
        if(temp.isFile() && temp!=null)
            resultt[i]=temp;

    }
    return resultt;
}

成功しましたが、私の問題はクライアント側にあります。ファイルを区別してクライアントに個別に書き込む方法がわかりません。

EDIT2:ZipOutputStream を使用して次のようにサーバー側のコードを変更しましたが、クライアントで解凍して書き込む方法がわかりません(ほとんどの場合、クライアントでFileOutputStreamを定義する方法がわかりません:

    for(int i=0;i<result.length;i++)   
        {
            fin = new FileInputStream(result[i]);

            bytearray  = new byte [(int)result.length];

            ZipOutputStream zipOpStream = new ZipOutputStream(socket.getOutputStream());
            zipOpStream.putNextEntry(new ZipEntry(result[i].getName()));


            System.out.println("Sending Files "+ result[i]);

            zipOpStream.write(bytearray,0,bytearray.length);
            zipOpStream.flush();

            System.out.println("File transfer completed");        

        }
    }

 socket.close();
} 

および受信者コード:

          socket = new Socket("127.0.0.1",3000);

         String outDir = "C:...\\Desktop\\here";



         BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());            


          ZipInputStream zips = new ZipInputStream(bis);
          ZipEntry zipEntry = null;

          while(null != (zipEntry = zips.getNextEntry())){
          String fileName = zipEntry.getName();
          File outFile = new File(outDir + "/" + fileName);
          System.out.println("----["+outFile.getName()+"], filesize["+zipEntry.getCompressedSize()+"]");

    if(zipEntry.isDirectory()){
    File zipEntryFolder = new File(zipEntry.getName());
    if(zipEntryFolder.exists() == false){
     outFile.mkdirs();
    }

        continue;
    }else{
    File parentFolder = outFile.getParentFile();
    if(parentFolder.exists() == false){
     parentFolder.mkdirs();
    }
   }

   System.out.println("ZipEntry::"+zipEntry.getCompressedSize());



   FileOutputStream fos = new FileOutputStream(outFile);
   int fileLength = (int)zipEntry.getSize();

   byte[] fileByte = new byte[fileLength];
   zips.read(fileByte);
   fos.write(fileByte);
   fos.close();


        socket.close();

     }

今、私は例外 "負のNegativeArraySizeException "を取得します

Exception in thread "main" java.lang.NegativeArraySizeException
    at recieve.Reciever.<init>(Reciever.java:71)
    at recieve.Recieve$1.<init>(Recieve.java:28)
    at recieve.Recieve.main(Recieve.java:28)
ZipEntry::-1

これはおそらく

   int fileLength = (int)zipEntry.getSize();

しかし、どうすればこれを解決できますか?ファイルに書き込むには、zip フォルダーの次のエントリのサイズが必要です。ただし、サイズはintではなくLongです

4

1 に答える 1

1

反対側のファイルを単一のストリームとして受信できる ZipOutputStream に書き込むのはどうですか。出力全体を取得したら、リバース コードを記述して zip ファイルを圧縮し、すべてのファイルを取得できます。Zip をソケット ストリームに書き込むためのサンプル コードを提供すると、これを基にコードを作成できます。

ZipOutputStream Stick2Codeを使用してファイルを送信するサーバーとクライアントのサンプル実装については、この長さを参照してください。

于 2014-05-30T12:11:56.540 に答える