How to read file on Windows and Linux from Java

2019-02-21 04:36发布

I have a xml file located in D:\XML\RequestXML and I am reading xml file in this folder from a FileReader. In my program I hard coded the file path /XML/RequestXML/. This works fine with the windows environment. In windows JBoss is in D:\jbossdistrib\jboss.

I created the folder structure in linux /usr/XML/RequestXML/. And add the xml in to RequestXML folder. JBoss is in /usr/jbossdistrib/jboss/ path.

But my application can not find the file specified in /XML/RequestXML/ in linux environment.

If I change the file path as /usr/XML/RequestXML/ it works in linux.

How can I use the consistent file path in linux and windows both?

public class Controller extends HttpServlet {

  private String filePath = "/XML/RequestXML/";

  protected void doPost(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {

       String file = request.getParameter("fileName");

       xml =  readFile(filePath + file);

    }

  private String readFile(String file) {
    StringBuffer fileData = new StringBuffer();
    try {

        BufferedReader reader = new BufferedReader(new FileReader(file));
        char[] buf = new char[1024];
        int numRead=0;

        while((numRead=reader.read(buf)) != -1){
            String readData = String.valueOf(buf, 0, numRead);
            fileData.append(readData);
            buf = new char[1024];
        }
        reader.close();

    }
    catch (FileNotFoundException e) {
        logger.fatal("File not found in specifid path "+ file);
    }
    catch (IOException e) {
        logger.fatal("Error while reading the xml file");
    }
    return fileData.toString();
 }
}

Update

My question is how to set the file path without /usr/ which works fine in Windows. If this is not possible, then do I need to use the path as /usr/XML/RequestXML/ in windows environment as well? so I have to create a folder structure like D:\usr\XML\RequestXML in windows.

5条回答
手持菜刀,她持情操
2楼-- · 2019-02-21 05:11

First a bit of bad news: FileReader is a utility class that as default uses the platform encoding: non-portable. As the encoding is defined in the XML source itself, you might keep to InputStream if possible.

You could keep the XML as read-only resource inside the war/ear.

Or as read-only resource in the jboss directories, outside the application. Using as java resource via the system ClassLoader of jboss.

Or as file, where the path is configured as above. Maybe in an existing properties/xml configuration file. You could also use the jboss admin console to configure a path.

Maybe of interest:

System.getProperty("file.encoding"); // The default encoding
System.getProperty("user.name"); // Under which user are we running
System.getProperty("user.home"); // The user's home
System.getProperty("user.dir"); // The applications working dir

JBoss also defines a couple of things; but that would be non-portable.

查看更多
We Are One
3楼-- · 2019-02-21 05:13

The issue isn't easy to solve because of the fundamental differences in the file systems. (Edit: Ignore me, I'm clearly on Cough Medicine. As Djon pointed out below).

Windows\Uses\Folder\Structures\Like\This.txt

Linux/Uses/Folder/Structures/Like/This.txt

So, the only way to handle this accordingly is to detect the operating system it runs on first, and then build your file paths accordingly.

See this question for more details:

How do I programmatically determine operating system in Java?

查看更多
该账号已被封号
4楼-- · 2019-02-21 05:16

If you know the current working directory (test it with:

System.out.println(new File(".").getAbsolutePath());

you can hardcode a relative directory like ../../XML/RequestXML

For the record: although this may help, I still believe you should try to solve this with a configuration parameter or by loading it as a resource available in the classpath.

查看更多
姐就是有狂的资本
5楼-- · 2019-02-21 05:17

I don't want two paths

ok then put your the file in the resources folder of your application and try reading it this way

private String filePath  = className.getClass()
                                    .getResource("yourFileName").getPath();
BufferedReader reader = new BufferedReader(new FileReader(filePath));
查看更多
看我几分像从前
6楼-- · 2019-02-21 05:20

Hardcoding file paths is not a recommended practice. You may find a way to build the file path programmatically and use File.separator, which returns the correct one depending on the system ("\" for Windows, and "/" for UNIX/Linux/Macintosh).

查看更多
登录 后发表回答