您好,登錄后才能下訂單哦!
今天小編給大家分享一下Java怎么從本地文件復制到網絡文件上傳的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
文件復制: 將一個本地文件從一個目錄,復制到另一個目錄。(通過本地文件系統)
package dragon; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; /** * 本地文件復制: * 將文件從一個地方復制到另一個地方。 * * @author Alfred * */ public class FileCopy { public FileCopy() {} public void fileCopy(String target, String output) throws IOException { File targetFile = new File(target); File outputPath = new File(output); this.init(targetFile, outputPath); /**注意這里使用了 try with resource 語句,所以不需要顯示的關閉流了。 * 而且,再關閉流操作中,會自動調用 flush 方法,如果不放心, * 可以在每個write 方法后面,強制刷新一下。 * */ try ( BufferedInputStream bis = new BufferedInputStream(new FileInputStream(targetFile)); //創建輸出文件 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File(outputPath, "copy"+targetFile.getName())))){ int hasRead = 0; byte[] b = new byte[1024]; while ((hasRead = bis.read(b)) != -1) { bos.write(b, 0, hasRead); } } System.out.println("文件復制成功"); } //數據校驗及初始化工作 private void init(File targetFile, File outputPath) throws FileNotFoundException { if (!targetFile.exists()) { throw new FileNotFoundException("目標文件不存在:"+targetFile.getAbsolutePath()); } else { if (!targetFile.isFile()) { throw new FileNotFoundException("目標文件是一個目錄:"+targetFile.getAbsolutePath()); } } if (!outputPath.exists()) { if (!outputPath.mkdirs()) { throw new FileNotFoundException("無法創建輸出路徑:"+outputPath.getAbsolutePath()); } } else { if (!outputPath.isDirectory()) { throw new FileNotFoundException("輸出路徑不是一個目錄:"+outputPath.getAbsolutePath()); } } } }
package dragon; import java.io.IOException; public class FileCopyTest { public static void main(String[] args) throws IOException { String target = "D:/DB/BuilderPattern.png"; String output = "D:/DBC/dragon/"; FileCopy copy = new FileCopy(); copy.fileCopy(target, output); } }
注意:右邊文件是復制的結果,左邊的不是。(下面會提到!)
上面的代碼只是將一個本地文件從一個目錄,復制到另一個目錄,還是比較簡單的,這只是一個原理性的代碼,來說明輸入輸出流的應用。將文件從一個地方復制到另一個地方。
**網絡文件傳輸(TCP):**使用套接字(TCP)進行演示,文件從一個地方復制到另一個地方。(通過網絡的方式。)
Server
import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args) throws IOException { try ( ServerSocket server = new ServerSocket(8080)){ Socket client = server.accept(); //開始讀取文件 try ( BufferedInputStream bis = new BufferedInputStream(client.getInputStream()); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File("D:/DBC/dragon", System.currentTimeMillis()+".jpg")))){ int hasRead = 0; byte[] b = new byte[1024]; while ((hasRead = bis.read(b)) != -1) { bos.write(b, 0, hasRead); } } System.out.println("文件上傳成功。"); } } }
Client
import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.net.Socket; import java.net.UnknownHostException; public class Client { public static void main(String[] args) throws UnknownHostException, IOException { try (Socket client = new Socket("127.0.0.1", 8080)){ File file = new File("D:/DB/netFile/001.jpg"); //開始寫入文件 try ( BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file)); BufferedOutputStream bos = new BufferedOutputStream(client.getOutputStream())){ int hasRead = 0; byte[] b = new byte[1024]; while ((hasRead = bis.read(b)) != -1) { bos.write(b, 0, hasRead); } } } } }
執行程序
注意:這個上傳文件的目錄和本地文件復制是在同一個目錄,但是使用的方式不一樣,文件的命名方式不一樣,使用的是當前的毫秒數。 復制前文件
復制后文件
說明
通過網絡的方式使用流,使用傳輸層的TCP協議,綁定了 8080 端口,這里需要一些網絡的知識,不過都是最基本的知識。可以看出來,上面這個 Server端和 Client端的代碼很簡單,甚至都沒有實現傳輸文件的后綴名!(哈哈,其實是我對套接字編程不太熟悉,傳輸文件名的話,我一開始嘗試,但是沒有成功。不過這個不影響這個例子,套接字我會抽時間來看的。哈!) 注意這里我要表達的意思通過網絡將文件從一個地方復制到另一個地方。(使用較為的是傳輸層的協議)
HTTP 是建立在 TCP/IP 協議之上的應用層協議,傳輸層協議使用起來感覺還是比較麻煩的,不如應用層協議用起來方便。
網絡文件傳輸(HTTP): 這里使用 Servlet(3.0以上)(JSP)技術來舉例,就以我們最常使用的文件上傳為例。
使用 HTTP 協議將文件從一個地方復制到另一個地方。
注意:因為原始的通過 Servlet 上傳文件較為麻煩,現在都是使用一些組件來達成這個文件上傳的功能的。(我沒有找到文件上傳最原始的寫法,想必應該是很繁瑣的吧!) 這里使用兩個jar包:
commons-fileupload-1.4.jar
commons-io-2.6.jar
注意:在 apache 網站可以下載到。
上傳文件的 Servlet
package com.study; import java.io.File; import java.io.IOException; import java.util.Iterator; import java.util.List; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileItemFactory; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; /** * Servlet implementation class UploadServlet */ @WebServlet("/UploadServlet") public class UploadServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //如果不是文件上傳的話,直接不處理,這樣比較省事 if (ServletFileUpload.isMultipartContent(request)) { //獲取(或者創建)上傳文件的路徑 String path = request.getServletContext().getRealPath("/image"); File uploadPath = new File(path); if (!uploadPath.exists()) { uploadPath.mkdir(); } FileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); List<FileItem> items; try { items = upload.parseRequest(request); Iterator<FileItem> it = items.iterator(); while (it.hasNext()) { FileItem item = it.next(); //處理上傳文件 if (!item.isFormField()) { String filename = new File(item.getName()).getName(); System.out.println(filename); File file = new File(uploadPath, filename); item.write(file); response.sendRedirect("success.jsp"); } } } catch (Exception e) { e.printStackTrace(); } } } }
上傳文件的jsp中,只需要一個form表單即可。
<h2>文件上傳</h2> <form action="NewUpload" method="post" enctype="multipart/form-data"> <input type="file" name="image"> <input type="submit" value="上傳"> </form>
運行效果
說明
雖然這樣處理對于上傳文件很好,但是因為使用的都是較為成熟的技術,對于想了解輸入輸出流的我們來說,就不是那么好了。從這個例子中,基本上看不到輸入輸出流的用法了,都被封裝起來了。
package com.study; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.UUID; import javax.servlet.ServletException; import javax.servlet.annotation.MultipartConfig; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.Part; /** * Servlet implementation class FileUpload */ @MultipartConfig @WebServlet("/FileUpload") public class FileUpload extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Part part = request.getPart("image"); String header = part.getHeader("Content-Disposition"); System.out.println(header); String filename = header.substring(header.lastIndexOf("filename=\"")+10, header.lastIndexOf("\"")); String fileSuffix = filename.lastIndexOf(".") != -1 ? filename.substring(filename.lastIndexOf(".")) : ""; String uploadPath = request.getServletContext().getRealPath("/image"); File path = new File(uploadPath); if (!path.exists()) { path.mkdir(); } filename = UUID.randomUUID()+fileSuffix; try ( BufferedInputStream bis = new BufferedInputStream(part.getInputStream()); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File(path, filename)))){ int hasRead = 0; byte[] b = new byte[1024]; while ((hasRead = bis.read(b)) != -1) { bos.write(b, 0, hasRead); } } response.sendRedirect("success.jsp"); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
使用 Servlet 3.0 的新特性實現,這里使用了 @MultipartConfig
注解。(如果不使用這個注解,會無法正常工作!感興趣的,可以多去了解一下。)
注意:下面這段代碼,這里我舍近求遠了,但是這正是我想要看到的。同樣是輸入輸出流,注意這個和上面的幾個例子進行對比。
try ( BufferedInputStream bis = new BufferedInputStream(part.getInputStream()); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File(path, filename)))){ int hasRead = 0; byte[] b = new byte[1024]; while ((hasRead = bis.read(b)) != -1) { bos.write(b, 0, hasRead); } }
package com.study; import java.io.File; import java.io.IOException; import java.util.UUID; import javax.servlet.ServletException; import javax.servlet.annotation.MultipartConfig; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.Part; /** * Servlet implementation class NewUpload */ @MultipartConfig @WebServlet("/NewUpload") public class NewUpload extends HttpServlet { private static final long serialVersionUID = 1L; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Part part = request.getPart("image"); String header = part.getHeader("Content-Disposition"); System.out.println(header); String filename = header.substring(header.lastIndexOf("filename=\"")+10, header.lastIndexOf("\"")); String fileSuffix = filename.lastIndexOf(".") != -1 ? filename.substring(filename.lastIndexOf(".")) : ""; String uploadPath = request.getServletContext().getRealPath("/image"); File path = new File(uploadPath); if (!path.exists()) { path.mkdir(); } filename = uploadPath+File.separator+System.currentTimeMillis()+UUID.randomUUID().toString()+fileSuffix; part.write(filename); response.sendRedirect("success.jsp"); } }
真正寫入文件的只有這一步了,前面全是處理文件名和上傳文件路徑相關的代碼。使用 HTTP 的這三種方式都有處理文件名和上傳文件路徑這段代碼。
如果通過這段代碼,那就更看不出什么東西來了,只知道這樣做,一個文件就會被寫入相應的路徑。
part.write(filename);
以上就是“Java怎么從本地文件復制到網絡文件上傳”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。