while( (d = fis.read(data)) !=-1){ fos.write(data,0,d); }
时间: 2024-05-26 09:18:08 浏览: 74
这是一个 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();
}
```
利用字节输入输出流类,完成如下任务: (1)从键盘上获取数据(直到一行数据"end"为读取结束),将数据写出到文件d:\data.dat中。 (2)读出文件d:\data.dat里面的内容,将其显示在屏幕上。 可以使用不种的字节流读写数据。 说明:主类类名为Main。 提示:可用如下字节输入/输出流FileInputStream和FileOutputStream、BufferedInputStream和BufferedOutputStream、DataInputStream和DataOutputStream、RandomAccessFile。
以下是使用FileOutputStream和FileInputStream实现的代码示例:
```java
import java.io.*;
public class Main {
public static void main(String[] args) {
// 写入数据到文件
try (FileOutputStream fos = new FileOutputStream("d:\\data.dat")) {
byte[] buffer = new byte[1024];
int len;
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
while (true) {
String line = reader.readLine();
if ("end".equals(line)) {
break;
}
buffer = line.getBytes();
fos.write(buffer, 0, buffer.length);
}
} catch (IOException e) {
e.printStackTrace();
}
// 读取文件内容并显示在屏幕上
try (FileInputStream fis = new FileInputStream("d:\\data.dat")) {
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) != -1) {
System.out.print(new String(buffer, 0, len));
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
上述代码中,我们先创建一个FileOutputStream对象,将从键盘输入的数据写入到文件中。在写入数据时,我们使用了BufferedReader读取键盘输入的字符串,并将其转换为字节数组写入到文件中。
接着,我们使用FileInputStream对象读取文件d:\data.dat中的内容,并将其显示在屏幕上。在读取数据时,我们同样使用了字节数组作为缓冲区,每次读取1024个字节,并将其转换为字符串打印到屏幕上。
阅读全文