我编写了一个在Java套接字中传输文件的代码,但我想扩展它。我想选择我想要的文件。我不理解一行代码:
byte[] mybytearray = new byte[(int) myFile.length()];
这是我的真实代码:
import import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Main {
public static void main(String[] args) throws IOException {
ServerSocket servsock = new ServerSocket(123456);
File myFile = new File("s.pdf");
while (true) {
Socket sock = servsock.accept();
byte[] mybytearray = new byte[(int) myFile.length()];
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(myFile));
bis.read(mybytearray, 0, mybytearray.length);
OutputStream os = sock.getOutputStream();
os.write(mybytearray, 0, mybytearray.length);
os.flush();
sock.close();
}
}
}
客户端模块:
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.Socket;
public class Main {
public static void main(String[] argv) throws Exception {
Socket sock = new Socket("127.0.0.1", 123456);
byte[] mybytearray = new byte[1024];
InputStream is = sock.getInputStream();
FileOutputStream fos = new FileOutputStream("s.pdf");
BufferedOutputStream bos = new BufferedOutputStream(fos);
int bytesRead = is.read(mybytearray, 0, mybytearray.length);
bos.write(mybytearray, 0, bytesRead);
bos.close();
sock.close();
}
}
答案 0 :(得分:1)
这行代码试图创建一个与您正在读取的文件大小相同的字节数组,允许它在一次读取中将整个文件读入字节数组。
第二个代码块“假定”该文件长度不超过1024个字节,并且不再读取该长度。你知道文件是< = 1024字节长吗?
由于多种原因,在处理流时使用可变缓冲区大小是个坏主意。流的美妙之处在于你没有整个文件存储在内存中。相反,使用这种模式......这很容易:
{
Socket sock = servsock.accept();
byte[] mybytearray = new byte[4096];
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(myFile));
OutputStream os = sock.getOutputStream();
int amt = bis.read(mybytearray, 0, 4096);
while (amt>0) {
os.write(mybytearray, 0, amt);
amt = bis.read(mybytearray, 0, 4096);
}
os.flush();
sock.close();
}
我选择4096作为随机任意大小,但没有真正的理由选择任何大于此的大小。这将复制任何大小(甚至千兆字节)的文件,整个文件,并且当文件变大时不会导致内存不足问题。
答案 1 :(得分:0)
查看The Java™ Tutorials, Trail: Learning the Java Language, Arrays。
简而言之:它为byte
类型的元素创建一个数组,其大小为myFile
中的字节数。由于数组创建需要int
大小的值java.io.File
商品long length()
,因此返回的long
值会转换为(int)
。做一个DDuckinG并查看提供的教程。