文件上传案例优化(文件命名循环接收多线程提高效率)
生活随笔
收集整理的這篇文章主要介紹了
文件上传案例优化(文件命名循环接收多线程提高效率)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
package com.learn.demo03.FileUpload;import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;/*文件上傳案例的客戶端:讀取本地文件,上傳到服務器,讀取服務器回寫的數據明確:數據源:c:\\1.jpg目的地:服務器實現步驟:1.創建一個本地字節輸入流FileInputStream對象,構造方法中綁定要讀取的數據源2.創建一個客戶端Socket對象,構造方法中綁定服務器的IP地址和端口號3.使用Socket中的方法getOutputStream,獲取網絡字節輸出流OutputStream對象4.使用本地字節輸入流FileInputStream對象中的方法read,讀取本地文件5.使用網絡字節輸出流OutputStream對象中的方法write,把讀取到的文件上傳到服務器6.使用Socket中的方法getInputStream,獲取網絡字節輸入流InputStream對象7.使用網絡字節輸入流InputStream對象中的方法read讀取服務回寫的數據8.釋放資源(FileInputStream,Socket)*/
public class TCPClient {public static void main(String[] args) throws IOException {//1.創建一個本地字節輸入流FileInputStream對象,構造方法中綁定要讀取的數據源FileInputStream fis = new FileInputStream("c:\\1.jpg");//2.創建一個客戶端Socket對象,構造方法中綁定服務器的IP地址和端口號Socket socket = new Socket("127.0.0.1",8888);//3.使用Socket中的方法getOutputStream,獲取網絡字節輸出流OutputStream對象OutputStream os = socket.getOutputStream();//4.使用本地字節輸入流FileInputStream對象中的方法read,讀取本地文件int len = 0;byte[] bytes = new byte[1024];while((len = fis.read(bytes))!=-1){//5.使用網絡字節輸出流OutputStream對象中的方法write,把讀取到的文件上傳到服務器os.write(bytes,0,len);}/*解決:上傳完文件,給服務器寫一個結束標記void shutdownOutput() 禁用此套接字的輸出流。對于 TCP 套接字,任何以前寫入的數據都將被發送,并且后跟 TCP 的正常連接終止序列。*/socket.shutdownOutput();//6.使用Socket中的方法getInputStream,獲取網絡字節輸入流InputStream對象InputStream is = socket.getInputStream();//7.使用網絡字節輸入流InputStream對象中的方法read讀取服務回寫的數據while((len = is.read(bytes))!=-1){System.out.println(new String(bytes,0,len));}//8.釋放資源(FileInputStream,Socket)fis.close();socket.close();}
}
package com.learn.demo03.FileUpload;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Random;/*文件上傳案例服務器端:讀取客戶端上傳的文件,保存到服務器的硬盤,給客戶端回寫"上傳成功"明確:數據源:客戶端上傳的文件目的地:服務器的硬盤 d:\\upload\\1.jpg實現步驟:1.創建一個服務器ServerSocket對象,和系統要指定的端口號2.使用ServerSocket對象中的方法accept,獲取到請求的客戶端Socket對象3.使用Socket對象中的方法getInputStream,獲取到網絡字節輸入流InputStream對象4.判斷d:\\upload文件夾是否存在,不存在則創建5.創建一個本地字節輸出流FileOutputStream對象,構造方法中綁定要輸出的目的地6.使用網絡字節輸入流InputStream對象中的方法read,讀取客戶端上傳的文件7.使用本地字節輸出流FileOutputStream對象中的方法write,把讀取到的文件保存到服務器的硬盤上8.使用Socket對象中的方法getOutputStream,獲取到網絡字節輸出流OutputStream對象9.使用網絡字節輸出流OutputStream對象中的方法write,給客戶端回寫"上傳成功"10.釋放資源(FileOutputStream,Socket,ServerSocket)*/
public class TCPServer {public static void main(String[] args) throws IOException {//1.創建一個服務器ServerSocket對象,和系統要指定的端口號ServerSocket server = new ServerSocket(8888);//2.使用ServerSocket對象中的方法accept,獲取到請求的客戶端Socket對象/*讓服務器一直處于監聽狀態(死循環accept方法)有一個客戶端上傳文件,就保存一個文件*/while(true){Socket socket = server.accept();/*使用多線程技術,提高程序的效率有一個客戶端上傳文件,就開啟一個線程,完成文件的上傳*/new Thread(new Runnable() {//完成文件的上傳@Overridepublic void run() {try {//3.使用Socket對象中的方法getInputStream,獲取到網絡字節輸入流InputStream對象InputStream is = socket.getInputStream();//4.判斷d:\\upload文件夾是否存在,不存在則創建File file = new File("d:\\upload");if(!file.exists()){file.mkdirs();}/*自定義一個文件的命名規則:防止同名的文件被覆蓋規則:域名+毫秒值+隨機數*/String fileName = "learn"+System.currentTimeMillis()+new Random().nextInt(999999)+".jpg";//5.創建一個本地字節輸出流FileOutputStream對象,構造方法中綁定要輸出的目的地//FileOutputStream fos = new FileOutputStream(file+"\\1.jpg");FileOutputStream fos = new FileOutputStream(file+"\\"+fileName);//6.使用網絡字節輸入流InputStream對象中的方法read,讀取客戶端上傳的文件int len =0;byte[] bytes = new byte[1024];while((len = is.read(bytes))!=-1){//7.使用本地字節輸出流FileOutputStream對象中的方法write,把讀取到的文件保存到服務器的硬盤上fos.write(bytes,0,len);}//8.使用Socket對象中的方法getOutputStream,獲取到網絡字節輸出流OutputStream對象//9.使用網絡字節輸出流OutputStream對象中的方法write,給客戶端回寫"上傳成功"socket.getOutputStream().write("上傳成功".getBytes());//10.釋放資源(FileOutputStream,Socket,ServerSocket)fos.close();socket.close();}catch (IOException e){System.out.println(e);}}}).start();}//服務器就不用關閉//server.close();}
}
?
總結
以上是生活随笔為你收集整理的文件上传案例优化(文件命名循环接收多线程提高效率)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 文件上传案例阻塞问题
- 下一篇: 模拟BS服务器分析