如何制作适合所有操作系统的Filepath Generic?

时间:2010-11-02 21:13:23

标签: java jsp servlets filepath

private static final String DESTINATION_DIR_PATH ="/files";
private File destinationDir; 
public void init(ServletConfig config) throws ServletException {
        super.init(config);
        String realPath = getServletContext().getRealPath(DESTINATION_DIR_PATH);
        destinationDir = new File(realPath);
        if(!destinationDir.isDirectory()) {
            throw new ServletException(DESTINATION_DIR_PATH+" is not a directory");
        }

    }

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            PrintWriter out = response.getWriter();
            response.setContentType("text/html");
            out.println();
            DiskFileItemFactory  fileItemFactory = new DiskFileItemFactory ();
            fileItemFactory.setSizeThreshold(1*1024*1024);
            //fileItemFactory.setRepository(tmpDir);
            ServletFileUpload uploadHandler = new ServletFileUpload(fileItemFactory);
            try {
                    List items = uploadHandler.parseRequest(request);
                    Iterator itr = items.iterator();
                while(itr.hasNext()) {
                    FileItem item = (FileItem) itr.next();
                    if(item.isFormField()) {
                        out.println("File Name = "+item.getFieldName()+", Value = "+item.getString());
                    } else {
                        File file = new File(destinationDir,item.getName());
                        item.write(file);
                String fileToBeRead = "C:/ProgramFiles/Apache/Tomcat/webapps/Readcsv/files/"+item.getName();
try {
                            BufferedReader br = new BufferedReader(new FileReader(fileToBeRead));..... and the code goes on..

我使用上面的代码来读取通过JSP表单上传的.csv文件。 代码工作得非常好。 但我希望代码采用通用格式,因为上面的代码只适用于Windows系统,而不适用于UNIX或任何其他操作系统。

String fileToBeRead = "C:/ProgramFiles/Apache/Tomcat/webapps/Readcsv/files/"+item.getName();

为了完成任务,必须更改此特定行。请告诉我可以做什么,以便代码在其遍历的任何操作系统中都能正常工作。另请指出上述代码中需要更改的所有区域。

3 个答案:

答案 0 :(得分:2)

添加上述响应,在Servlet代码中硬编码文件位置并不是一种好习惯,因为它通常会导致Servlet在部署在不同服务器上时无法工作,或者Web应用程序直接从压缩的WAR文件运行。从Web应用程序读取资源的正确方法是使用getResource()或getResourceAsStream()方法。即使Web应用程序部署在多个服务器上或作为压缩WAR,这两种方法也可确保Servlet始终可以访问所需的资源。

getResourceAsStream(java.lang.String path) :getResourceAsStream()方法将InputStream的实例返回到Web应用程序的物理资源。当资源需要逐字读取而不是由Web应用程序处理时,应该使用此方法。

getResource(java.lang.String path) :getResource()方法返回映射到指定路径的资源的URL。当需要读取资源时,应该使用此方法,因为它将显示给客户端。

答案 1 :(得分:1)

您已在file中拥有该文件。只需替换

new FileReader(fileToBeRead)

通过

new FileReader(file)

或者,甚至更好,完全跳过将文件写入磁盘并立即读取上传文件流的不必要步骤。取代

File file = new File(destinationDir,item.getName());
item.write(file);
try {
    BufferedReader br = new BufferedReader(new FileReader(fileToBeRead));

通过

try {
    BufferedReader br = new BufferedReader(new InputStreamReader(item.getInputStream()));

您可能希望将charset作为第二个参数提供。我建议使用UTF-8。

答案 2 :(得分:1)

您的代码已包含解决方案:

getServletContext().getRealPath(DESTINATION_DIR_PATH);

这比以下好多了:

String fileToBeRead = "C:/Program Files/Apache/Tomcat/...";

另一句话:不要使用new FileReader(),因为您无法指定用于将文件字节转换为所需字符的编码。请改用new InputStreamReader(is, encoding)