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