파일 복사: 한 디렉터리에서 다른 디렉터리로 로컬 파일을 복사합니다. (로컬 파일 시스템을 통해)
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 포트 바인딩, 일부 네트워크는 여기에는 지식이 필요하지만 가장 기본적인 지식입니다. 위의 서버 측 코드와 클라이언트 측 코드는 매우 간단하며 전송된 파일의 접미사 이름도 구현하지 않는다는 것을 알 수 있습니다! (하하 사실 저는 소켓 프로그래밍에 대해 잘 알지 못합니다. 파일명 전송에 관해서는 처음에 시도했다가 실패했습니다. 하지만 이번 예제에는 영향을 미치지 않습니다. 시간을 내어 소켓을 살펴보겠습니다. ㅎ !) 여기서 의미하는 바를 참고하세요. 네트워크를 통해 한 곳에서 다른 곳으로 파일을 복사하세요. (가장 일반적으로 사용되는 프로토콜은 전송 계층 프로토콜입니다.)
HTTP는 TCP/IP 프로토콜을 기반으로 구축된 응용 프로그램 계층 프로토콜로, 전송 계층 프로토콜은 사용하기가 더 까다롭습니다. 응용 프로그램 계층으로 적합합니다. 프로토콜은 사용하기 쉽습니다.
네트워크 파일 전송(HTTP): 여기서는 가장 일반적으로 사용되는 파일 업로드를 예로 들어 Servlet(3.0 이상)(JSP) 기술을 사용합니다.
HTTP 프로토콜을 사용하여 한 곳에서 다른 곳으로 파일을 복사합니다.
참고: 서블릿을 통한 원본 파일 업로드가 더 까다롭기 때문에 이제 일부 구성 요소를 사용하여 이 파일 업로드 기능을 구현합니다. (파일 업로드를 작성하는 가장 독창적인 방법을 찾지 못했습니다. 매우 번거로울 것입니다!) 여기에는 두 개의 jar 패키지가 사용됩니다:
commons-fileupload-1.4.jar
commons-io -2.6 .jar
참고: 아파치 웹사이트에서 다운로드할 수 있습니다.
파일을 업로드하는 서블릿
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에서는 하나의 폼만 필요합니다.
<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를 사용하여 업로드하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!