Java 写入客户端中的文件和NegativeArraySizeException
我有一个服务器,可以发送数千个小文件,如下所示:Java 写入客户端中的文件和NegativeArraySizeException,java,file,exception,client-server,zipoutputstream,Java,File,Exception,Client Server,Zipoutputstream,我有一个服务器,可以发送数千个小文件,如下所示: 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 { serverSocke
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;
}
现在我得到一个例外“negativeNegativeArraySizeException”
但我怎么才能解决这个问题呢?我需要下一个zip文件夹条目的大小,以便写入文件。
但是大小是Long not int如何将其写入ZipOutputStream中,您可以在另一端作为单个流接收文件。一旦获得了整个输出,就可以编写反向代码来压缩zip文件并获取所有文件。提供将Zip写入套接字流的示例代码,您可以在此基础上构建代码
请参阅使用ZipOutputStream发送文件的示例服务器和客户端实现。您刚刚得到一个数据流,没有指示每个文件的长度。考虑在每个文件之前使用长度前缀。(您还应该使用InputStream.read返回的值-不要假设您将在一次读取调用中读取整个文件。)@JonSkeet事实上它做得很好。每个文件夹中有2个文件。每次我检查是否遇到一个文件或文件夹,然后在发送文件()中发送它,然后读取第二个文件夹,直到结束。但我想知道对方是如何相互了解的——他就是这么说的。不可能。你必须把他们分开。我同意乔恩的看法。您可以为每个文件启动新的连接,这会更加昂贵,也可以将文件的长度与其余数据一起发送。@EJP很好地陈述了明显的问题!如何将它们分开?好的,但是如何在客户端解压呢?只需将ZipOutStream替换为zipinputstream?并且您答案的最后一行不正确,没有称为copy的方法IOUtils.copy用于illustruation,您可以自由编写自己的代码,将字节从输入流复制到Zip输出流。导入属于以下包的IOUtils“org.apache.commons.io.IOUtils”。这在apache commons io项目版本1.3.2.Maven dependency org.apache.commons commons io 1.3.2中提供。至于将文件重新膨胀,您可以使用java.util.zip.Inflater。您可以在以下链接或以下链接中参考一些文档
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();
}
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();