首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

socket输入流连续文件,怎么把各个文件的数据分开来

2012-01-22 
socket输入流连续文件,如何把各个文件的数据分开来?我在些一个局域网传输文件夹的程序,在连续传送文件时,

socket输入流连续文件,如何把各个文件的数据分开来?
我在些一个局域网传输文件夹的程序,在连续传送文件时,发送端连续写入文件,接受端接收时却无法鉴别各个文件,将所有数据写入了一个文件,请各位指教。

接收端代码:
private   void   output(BufferedReader   br,BufferedInputStream   bis,Socket   s)
{
    String   readStr;
    byte[]   buf   =   new   byte[1024*10];
    int   len;
    try
    {
        while(true)
        {
            readStr=br.readLine();
            System.out.println(readStr);
            String   isFile=readStr.substring(0,1);
            file=readStr.substring(1);
            if(isFile.equals( "1 "))
            {    
FileOutputStream   fos   =   new   FileOutputStream( "E:\\ "+file);
BufferedOutputStream   bos=new   BufferedOutputStream(fos,1024*10);
System.out.println( "creating   "+file+ "...... ");
while((len=bis.read(buf,0,1024*10))!=-1)
{
      bos.write(buf,0,len);
      bos.flush();
  }
  fos.close();
  bis.close();
  System.out.println( "creating   "+file+ "   completed! ");
            }
            else   if(isFile.equals( "0 "))
            {
  File   f=new   File( "E:\\ "+file);
  System.out.println( "creating   directory..... "+f);
  if(f.mkdir())
  System.out.println( "creating   completed..... ");
            }
            else
  return;
          }    
      }
      catch(IOException   e)
      {
          e.printStackTrace();
        }    
    }

发送端代码:
private   void   sender(File   file,BufferedWriter   bw,BufferedOutputStream   bos)
    {
    if(file.isFile())
            {
            sendFile(file,bw,bos);
            }
            else
            {
            sendDirec(file,bw);
            File[]   fileList=file.listFiles();
            for(int   i=0;i <fileList.length;i++)
            {
    if(fileList[i].isFile())
    {
    sendFile(fileList[i],bw,bos);
    }
    else   if(i <fileList.length)
    {
    sender(fileList[i],bw,bos);
    }
    else
    {
    return;
    }    
            }
            }  


    }
   
    private   void   sendFile(File   file,BufferedWriter   bw,BufferedOutputStream   bos)
    {
            System.out.println( "filename:   "+file);
    String   path=file.getPath();
    String   realName=path.substring(primaryPath.length());
    BufferedInputStream   bis=null;    
    byte[]   fileBuf=new   byte[1024*10];
    int   len;
    try
    {
    FileInputStream   fis   =   new   FileInputStream(file);
    bis=new   BufferedInputStream(fis,1024*10);
    bw.write( "1 "+realName);
    bw.newLine();
    bw.flush();
    while((len=bis.read(fileBuf))!=   -1)
    {
    bos.write(fileBuf,0,len);
    bos.flush();
    }
    bis.close();
    fis.close();
    }
    catch(FileNotFoundException   ex)
    {
    System.out.println( "创建文件流失败! ");
    ex.printStackTrace();
    }    
    catch(Exception   e)
    {
    System.out.println( "写入文件出错! ");
    e.printStackTrace();
    }      
    }
    private   void   sendDirec(File   file,BufferedWriter   bw)
    {
    System.out.println( "filename:   "+file);
    String   direcName=file.getPath();
    String   realName=direcName.substring(primaryPath.length());
    try
    {
    bw.write( "0 "+realName);
    bw.newLine();
    bw.flush();
    }
    catch(FileNotFoundException   ex)
    {
    System.out.println( "创建文件流失败! ");
    ex.printStackTrace();
    }    
    catch(Exception   e)
    {
    System.out.println( "写入文件夹出错! ");
    e.printStackTrace();
    }
    }

[解决办法]
顶起来,看了下网上的资料···
有一种文件夹传送方案:先把整个文件夹压缩,传送以后接收端再解压以还原目录结构
[解决办法]
你可以在传每个文件之前先传它的文件尺寸,比如用四个字节来描述,那么在接收的时候,先读出这四个字节,得知文件长度,然后再读文件内容,就知道改文件在哪里结束了.

热点排行
Bad Request.