while( (d = fis.read(data)) !=-1){ fos.write(data,0,d); }
时间: 2024-05-26 09:18:08 浏览: 56
这是一个 Java 代码片段,它的作用是从一个输入流中读取数据,并将其写入到一个输出流中。
具体地说,代码中的 `fis` 和 `fos` 是分别对应输入流和输出流的对象。`data` 是一个缓冲区数组,通常会设置一个合适的缓冲区大小,以提高读写效率。
`fis.read(data)` 会从输入流中读取一定数量的数据,并将其存储到 `data` 中,返回值 `d` 表示实际读取的字节数。当读取到文件末尾时,`read()` 方法会返回 -1,表示已经读取完毕。
`fos.write(data,0,d)` 会将 `data` 数组中的前 `d` 个字节写入到输出流中,其中第二个参数 `0` 表示从 `data` 数组的首位开始写。
整个代码片段就是一个循环,不断读取输入流中的数据并写入到输出流中,直到读取到文件末尾为止。
相关问题
is = sc.getInputStream(); DataInputStream dis = new DataInputStream(is); int totalLength = dis.readInt(); // 创建一个256字节的数组来保存文件名的字节信息 byte[] data = new byte[256]; // 把字节数组 解析为文件名 dis.readFully(data); // 解析出文件名,并去除末尾的空格 String filename = new String(data).trim(); // 余下的是文件内容 data = new byte[totalLength - 9 - 256]; // 读入文件的字节 dis.readFully(data); // 保存文件到当前目录下 FileOutputStream fos = new FileOutputStream(filename); fos.write(data); fos.flush(); fos.close(); System.out.println("文件下载完成");改为从服务端下载到客户端
这段代码是一个服务器向客户端传输文件的代码,需要修改为从服务端下载到客户端的代码,可以参考以下实现:
1. 客户端向服务端发送文件名请求
2. 服务端收到请求后,读取文件内容并发送给客户端
3. 客户端接收到文件内容后,保存文件到本地
以下是修改后的代码示例:
客户端:
```java
Socket socket = new Socket("localhost", 8888);
OutputStream os = socket.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
// 发送文件名请求
dos.writeUTF("test.txt");
// 接收文件内容
InputStream is = socket.getInputStream();
DataInputStream dis = new DataInputStream(is);
int totalLength = dis.readInt();
byte[] data = new byte[totalLength];
dis.readFully(data);
// 保存文件到本地
FileOutputStream fos = new FileOutputStream("test.txt");
fos.write(data);
fos.flush();
fos.close();
socket.close();
System.out.println("文件下载完成");
```
服务端:
```java
ServerSocket serverSocket = new ServerSocket(8888);
while (true) {
Socket socket = serverSocket.accept();
InputStream is = socket.getInputStream();
DataInputStream dis = new DataInputStream(is);
// 接收文件名请求
String filename = dis.readUTF();
// 读取文件内容
File file = new File(filename);
byte[] data = new byte[(int) file.length()];
FileInputStream fis = new FileInputStream(file);
fis.read(data);
// 发送文件内容
OutputStream os = socket.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
dos.writeInt(data.length);
dos.write(data);
dos.flush();
socket.close();
}
```
把d:\\bbb.mp4复制到当前项目目录下的copy.mp4中 分别用FileInputStream和BufferedInputStream类中的两种read()方法,共四种方式复制并比较效率。
好的,我可以帮你解答这个问题。
首先,需要明确一下四种方式:
1. FileInputStream的read()方法
2. FileInputStream的read(byte[] b)方法
3. BufferedInputStream的read()方法
4. BufferedInputStream的read(byte[] b)方法
下面是示例代码:
```java
import java.io.*;
public class FileCopyTest {
public static void main(String[] args) {
String sourcePath = "d:\\bbb.mp4"; // 源文件路径
String destPath = "copy.mp4"; // 目标文件路径
// FileInputStream的read()方法
long start = System.currentTimeMillis();
try (FileInputStream fis = new FileInputStream(sourcePath);
FileOutputStream fos = new FileOutputStream(destPath)) {
int data;
while ((data = fis.read()) != -1) {
fos.write(data);
}
} catch (IOException e) {
e.printStackTrace();
}
long end = System.currentTimeMillis();
System.out.println("FileInputStream的read()方法耗时:" + (end - start) + "毫秒");
// FileInputStream的read(byte[] b)方法
start = System.currentTimeMillis();
try (FileInputStream fis = new FileInputStream(sourcePath);
FileOutputStream fos = new FileOutputStream(destPath)) {
byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer)) != -1) {
fos.write(buffer, 0, length);
}
} catch (IOException e) {
e.printStackTrace();
}
end = System.currentTimeMillis();
System.out.println("FileInputStream的read(byte[] b)方法耗时:" + (end - start) + "毫秒");
// BufferedInputStream的read()方法
start = System.currentTimeMillis();
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(sourcePath));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destPath))) {
int data;
while ((data = bis.read()) != -1) {
bos.write(data);
}
} catch (IOException e) {
e.printStackTrace();
}
end = System.currentTimeMillis();
System.out.println("BufferedInputStream的read()方法耗时:" + (end - start) + "毫秒");
// BufferedInputStream的read(byte[] b)方法
start = System.currentTimeMillis();
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(sourcePath));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destPath))) {
byte[] buffer = new byte[1024];
int length;
while ((length = bis.read(buffer)) != -1) {
bos.write(buffer, 0, length);
}
} catch (IOException e) {
e.printStackTrace();
}
end = System.currentTimeMillis();
System.out.println("BufferedInputStream的read(byte[] b)方法耗时:" + (end - start) + "毫秒");
}
}
```
这个程序会复制 `d:\\bbb.mp4` 文件到当前项目目录下的 `copy.mp4` 文件,并分别使用四种方式复制,并输出每种方式的耗时(单位:毫秒)。
需要注意的是,在使用 `try-with-resources` 语句时,不需要显式地关闭流,因为这些流会在代码块结束时被自动关闭。
至于哪种方式更高效,这要根据具体的环境和需求来决定。一般来说,使用 `BufferedInputStream` 的效率会更高一些,因为它可以减少磁盘 I/O 次数,从而提高效率。而使用 `read(byte[] b)` 方法也可以提高效率,因为每次读取文件的字节数更多,减少了读取次数。
希望这个回答能够帮到你!