练习1:
1.将一个文本文件由一端传往另一端;
2.文件接收端接收完毕后,告诉发送端接收完毕,并打印接收文件的内容;
3.发送端接收并打印接收端发来的信息.
提示:
1. 传输文本文件时,使用字符流;传输非文本文件时,使用字节流;
2. 字符流时建议选择字符缓冲流,BufferedReader、BufferedWriter(PrintWriter功能类似,更加强大,自动写入不需要额外执行flush),因为与Reader/Writer相比,缓冲流将数据写入缓存后一次处理多个数据,而字符流只能单字节处理,读取效率低。
3. 字节流选择同2,也优先选择缓冲流,BufferedInputStream和BufferedOutputStream。注意,即便使用了缓冲流,也需要借助数组byte["数组长度"]来执行读写,因为缓冲流本质也是固定长度的数组(默认8K),文件大小较大时,程序会将超过8k的部分写入硬盘,会造成数据丢失,借助数组byte可以避免该问题。
代码及说明
创建socket来完成此操作,发送端作为client,接收端作为server
客户端Client代码:
package socket;
import java.io.*;
import java.net.Socket;
public class test2Upload {
// 练习内容:从客户端上传一个文件到服务端
public static void main(String[] args) throws IOException {
File file = new File("C:\\install.log");
if (file.exists())
upload(file);
else
throw new IOException("文件"+file+"不存在.");
}
private static void upload(File file) throws IOException {
// 1.创建socket;
Socket s = new Socket("127.0.0.1",10011);
// 2.创建文件输出流,目的:socket;
PrintWriter out = new PrintWriter(s.getOutputStream(),true);
// 3.创建文件输入流,选择字符缓存流BufferedReader
// 原因:读取的原文件是字符文件,优先选择字符流
BufferedReader bufr = new BufferedReader(new FileReader(file));
// 4.开始传输,传完后打印提示;
String line = null;
while((line=bufr.readLine())!=null)
out.println(line);
// 通知客户端传输完毕;
s.shutdownOutput();
System.out.println("文件传输完毕");
// 5.创建socket输入流,获取从服务端收到的信息,并打印
BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
String str = bufIn.readLine();
System.out.println(