文件上传分析图解。
1.客户端:输入流,从硬盘读取文件数据到程序中;
2.客户端:输出流,写出文件数据到服务器端;
3.服务端:输入流,读取文件数据到服务端程序;
4.服务端:输出流,写出文件数据到服务器硬盘中。
注意:客户端和服务器端和本地硬盘进行读写,需要使用自己创建的字节流对象(本地流)
客户端和服务器之间读写,必须使用Socket中提供的字节流对象(网络流)
文件上传的原理,就是文件的复制。
public class TCPCFileClient { public static void main(String[] args) throws IOException { // 本地IO输入流读取文件 FileInputStream fis = new FileInputStream("D:\\a\\a.txt"); byte[] bytes = new byte[1024]; int len = fis.read(bytes); // 网络输出流写出文件到服务器 Socket socket = new Socket("127.0.0.1",8888); OutputStream os = socket.getOutputStream(); os.write(bytes,0,len); // 数组是定长的,我们只写出读取到的部分即可 System.out.println("读取到客户端的文件数据为:" + new String(bytes,0,len)); fis.close(); socket.close(); } }
public class TCPCFileServer { public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(8888); Socket socket= serverSocket.accept(); InputStream is = socket.getInputStream(); byte[] bytes = new byte[1024]; int len = is.read(bytes); // 写入到硬盘中 FileOutputStream fos = new FileOutputStream("D:\\a\\ads.txt"); fos.write(bytes,0,len); // 按字节写入 System.out.println("传入服务器的文件数据为:" + new String(bytes,0,len)); fos.close(); socket.close(); serverSocket.close(); } }
注意:字节输入流的read()/read(byte[])方法,是从输入流中读取到一个数据字节,如果没有输入可用,则此方法将阻塞。
如果使用while判断是否读取到-1来写入数据到服务器,那么-1不会写过去,那么再在服务器端使用while循环写入硬盘时,就永远不会终止,进入阻塞状态,一直死循环,等待结束标记。