0

In the code below ,I am writing a file named employee_status_downloader_unixtimestamp.csv in an already created directory on RHEL server as shown in this line of code below:

FileWriter fw = new FileWriter("/srv/file_users/JACK/employee_status_downloader_"+unixTimestamp+".csv");

So, I manually created a folder named JACK and then specified the above path so that the files related to the userName JACK are inside JACK folder.

Since the userName can be different and I am already getting the userName in my method sendMessage as shown below from this line of code String userName = parts[1].trim();, I am wondering if I could make use of this to create a directory based on the userName?

So, I am not using System.getProperty("user.name"); here since I am already getting userName in my method above which I believe is enough for creating an ad-hoc directory.

After looking online , I found that people are suggesting here(Bozho's answer) to do something like this :

File fl = new File("/path/directory").mkdirs(); where directory is the name of the directory I want to create/exist. But since I am using FileWriter above, I am wondering how should I go about using both so that I could also create a directory if it doesn't exist and then write a file in the directory.

public void sendMessage(String msg) throws DaoException {

        String[] parts = msg.split("#");
        String requestID = parts[0].trim();
        String userName = parts[1].trim();
        String applicationName = parts[2].trim();

        logger.info("Request ID " + requestID);
        logger.info("User Name " + userName);
        logger.info("Application Name " + applicationName);



        try {


            FileWriter fw = new FileWriter("/srv/file_users/JACK/employee_status_downloader_" + unixTimestamp + ".csv");

            CSVWriter writer = new CSVWriter(fw);

            writer.writeAll(rsDemo, true);
            writer.close();
            fw.close();


        } catch (Throwable th) {
            throw new DaoException(th.getMessage(), th);
        } finally {


        }



    }
    long unixTimestamp = Instant.now().getEpochSecond();
Tan
  • 1,433
  • 5
  • 27
  • 47

2 Answers2

0

Whatever you do with a path in a String, you can do in a parameterized way by parameterizing the String. You have this:

String userName = parts[1].trim();
...
FileWriter fw = new FileWriter("/srv/file_users/JACK/employee_status_downloader_" + unixTimestamp + ".csv");

so you could do this:

String userName = parts[1].trim();
...
FileWriter fw = new FileWriter("/srv/file_users/" + userName + "/employee_status_downloader_" + unixTimestamp + ".csv");
CryptoFool
  • 21,719
  • 5
  • 26
  • 44
  • Thanks. Changing it to what you suggested doesn't create a new directory (in case it doesn't exist). – Tan Apr 05 '19 at 17:05
0

If you want to make sure the folder exists, change code to:

File dir = new File("/srv/file_users/", userName);
dir.mkdirs();
FileWriter fw = new FileWriter(new File(dir, "/employee_status_downloader_" + unixTimestamp + ".csv"));

Better yet, use the newer NIO methods and use try-with-resources to ensure file is closed correctly.

Path dir = Paths.get("/srv/file_users", userName);
Files.createDirectories(dir);

Path file = dir.resolve("employee_status_downloader_" + unixTimestamp + ".csv");
try (CSVWriter writer = new CSVWriter(Files.newBufferedWriter(file))) {
    writer.writeAll(rsDemo, true);
}
Andreas
  • 154,647
  • 11
  • 152
  • 247