Я пытаюсь написать два метода для отправки и получения файла с Java сокет в приложения клиент-сервер и у меня есть некоторые сомнения:Java, отправить и получить файл с сокеткой: нужно ли использовать bufferedinputstream и bufferedoutputstream?
Я использую 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 байта и первый заполняю его , а затем отправить его в гнездо с DataOutputStream.write(byte[] b, int off, int len)
,
Во втором методе idem: сначала я заполняю буфер DataInputStream.read(byte[] b)
, а затем записываю файл FileOutputStream.write(byte[] b, int off, int len)
.
Так зачем использовать BufferedInputStream
и BufferedOutputStream
? Таким образом, если я понимаю, как они работают, я пишу байты сначала в своем буфере, а затем BufferedInputStream
и BufferedOutputStream
копирует байты в свой буфер.
Необходимо, нет. Желательно, да. – EJP