我正在尝试在客户端-服务器应用程序中编写两种使用 java 套接字发送和接收文件的方法,但我有一些疑问:
我使用FileInputStream
和FileOutputStream
。是BufferedInputStream
和BufferedOutputStream
更好的?
static protected long send_file(File file, DataOutputStream output) throws IOException, FileNotFoundException, SecurityException
{
byte[] buffer = new byte[1024];
long count = 0;
int nread = 0;
FileInputStream file_input = new FileInputStream(file);
output.writeLong(file.length());
while((nread = file_input.read(buffer)) != -1)
{
output.writeInt(nread);
output.write(buffer, 0, nread);
count += nread;
}
output.flush();
file_input.close();
return count;
}
static protected long receive_file(File file, DataInputStream input) throws IOException, FileNotFoundException, SecurityException, EOFException
{
byte[] buffer = new byte[1024];
long dim_file = 0;
long count = 0;
int nbyte = 0;
int nread = 0;
int n = 0;
FileOutputStream file_output = new FileOutputStream(file);
dim_file = input.readLong();
while(count < dim_file)
{
nbyte = input.readInt();
nread = input.read(buffer, 0, nbyte);
if(nread == -1)
{
file_output.close();
throw new EOFException();
}
while(nread < nbyte)
{
n = input.read(buffer, nread, nbyte-nread);
if(n == -1)
{
file_output.close();
throw new EOFException();
}
nread += n;
}
file_output.write(buffer, 0, nread);
count += nread;
}
file_output.flush();
file_output.close();
return count;
}
我不明白BufferedInputStream
的必要性和BufferedOutputStream
:
在第一种方法中,我使用 1024 字节的缓冲区,首先用 FileInputStream.read(byte[] b)
填充它。然后将其发送到套接字 DataOutputStream.write(byte[] b, int off, int len)
.
在第二种方法同上:首先我用 DataInputStream.read(byte[] b)
填充缓冲区然后用 FileOutputStream.write(byte[] b, int off, int len)
写入文件.
那么为什么要使用 BufferedInputStream
和BufferedOutputStream
?
这样,如果我理解它们是如何工作的,我首先在缓冲区中写入字节,然后 BufferedInputStream
和BufferedOutputStream
复制缓冲区中的字节。
最佳答案
这不是为了更好。他们提供不同的东西。当 fileoutputstream 写入文件时,BuffereOutputStreams 写入缓冲区(因此得名:))。 您应该将它们结合起来以获得最佳性能。例如
BufferedOutputStream bo = new BufferedOutputStream(new FileOutputStream("output.txt"))
然后,您的程序将首先将所有内容写入缓冲区,并且仅在刷新缓冲区时将其转储到文件中
关于Java,使用套接字: is it necessary use bufferedinputstream and bufferedoutputstream?发送和接收文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17083826/