Why is FileWriter not creating a new file ? FileNotFoundException [duplicate] - java

This question already has an answer here:
Why FileWriter doesn't create a new file?
(1 answer)
Closed 8 years ago.
So I have a code snippet as follows. Im trying to find out why it throws a FileNotFoundException.
File file= new File (WORKSPACE_PATH+fname);
FileWriter fw;
if (file.exists())
{
fw = new FileWriter(file,true);//if file exists append to file. Works fine.
}
else
{
fw = new FileWriter(file);// If file does not exist. Create it. This throws a FileNotFoundException. Why?
}

Using concatenation when creating the File won't add the necessary path separator.
File file = new File(WORKSPACE_PATH, fname);

You need to add a separator (Windows : \ and Unix : /, you can use File.separator to get the system's separator) if WORKSPACE_PATH does not have one at its end, and manually creating the file with its parent directories might help.
Try this if WORKSPACE_PATH does not have a separator at its end :
File file = new File(WORKSPACE_PATH + File.separator + fname);
And add this before fw = new FileWriter(file);
file.mkdirs(); // If the directory containing the file and/or its parent(s) does not exist
file.createNewFile();

This might work:
File file= new File (WORKSPACE_PATH+fname);
FileWriter fw;
if (file.exists())
{
fw = new FileWriter(file,true);//if file exists append to file. Works fine.
}
else
{
file.createNewFile();
fw = new FileWriter(file);
}

Related

Create whole path automatically when writing to a new file with sub folders [duplicate]

This question already has answers here:
To create a new directory and a file within it using Java
(2 answers)
Closed 4 years ago.
I want to write a new file inside a folder that currently does not exist.
I use it like this:
File file = new File("C:\\user\\Desktop\\dir1\\dir2\\filename.txt");
file.getParentFile().mkdirs();
FileWriter writer = new FileWriter(file);
I get the file filename.txt under a folder called dir1.dir2.
I need dir1/dir2:
How can I achieve this?
Please do not mark this question as duplicate because I didn't get what I need after a reseach.
UPDATE 1
I am using Jasper Report with Spring Boot to export a pdf file.
I need to create the file under a directory name the current year. Under this folder, I need to create a directory called the current month, and under this directory the pdf file should be exported. Example :
(2018/auguest/report.pdf )
I am using LocalDateTime to get year and month
Here is a portion of my code :
ReportFiller reportFiller = context.getBean(ReportFiller.class);
reportFiller.setReportFileName("quai.jrxml");
reportFiller.compileReport();
reportFiller = context.getBean(ReportFiller.class);
reportFiller.fillReport();
ReportExporter simpleExporter = context.getBean(ReportExporter.class);
simpleExporter.setJasperPrint(reportFiller.getJasperPrint());
LocalDateTime localDateTime = LocalDateTime.now();
String dirName = simpleExporter.getPathToSaveFile() + "/"+
localDateTime.getYear() + "/" + localDateTime.getMonth().name();
File dir = new File(dirName);
dir.mkdirs();
String fileName = dirName + "/quaiReport.pdf";
simpleExporter.exportToPdf(fileName, "");
Here is what I get :
Try below code which will work as per your expectation
File dir = new File("C:\\Users\\username\\Desktop\\dir1\\dir2");
dir.mkdirs();
File file = new File(dir, "filename.txt");
FileWriter newFile = new FileWriter(file);
You need to create folder structure first and file next
You need to create directory first then create file:
Like this:
String dirName = "/" + localDateTime.getYear() + "/" + localDateTime.getMonth().name();
File file = new File(dirName);
file.mkdirs();
file = new File(file.getAbsolutePath()+"/quriReport.pdf");
file.createNewFile();
If you go your project directory you see 2018/August/quriReport.pdf
But IDE show subfolder with . if there is only one subfolder.
At first, create the directories, then create a new file to write.
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
class TestDir {
public static void main(String[] args) {
String dirPath = "C:\\user\\Desktop\\dir1\\dir2\\";
String fileName = "filename.txt";
Path path = Paths.get(dirPath);
if(!Files.exists(path)) {
try {
Files.createDirectories(path);
} catch (IOException e) {
e.printStackTrace();
}
}
try (Writer writer = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(dirPath + fileName), "utf-8"))) {
writer.write("something");
} catch (IOException e) {
e.printStackTrace();
}
}
}
File file = new File("C:\\user\\Desktop\\dir1\\dir2\\filename.txt");
Files.createDirectories(file.getParentFile().toPath());
FileWriter writer = new FileWriter(file);
writer.write("jora");
writer.close();

Making a new line in a file [duplicate]

This question already has answers here:
How to append text to an existing file in Java?
(31 answers)
Closed 8 years ago.
Im trying to write a text to file, but it overwrites whats inside, can somebody explain how to check if the text exists and then put a new line and write? Here is the code I am working with:
try
{
if (!file.exists())
{
file.createNewFile();
}
FileWriter fw =
new FileWriter(file.getAbsoluteFile());
BufferedWriter bw = new BufferedWriter(fw);
bw.newLine();
bw.write(petName);
bw.close();
System.out.println("Done!");
}
catch (IOException exc)
{
System.out.println(exc);
}
Thank you for any kind of help.
how to check if the text exists and then put a new line and write?
Use File#length() to check if the text exists in the file.
if(file.length()>0){
bw.newLine();
}
Note:
Open the file in append mode if you don't want to override the existing content of the file.
Use following to append if file exists.
FileWriter fw = new FileWriter(file.getAbsoluteFile(), true);

Before creating the file , deleting the file of previous day

I am creating a dat file in C: drive folder named abc as shown below , Now my file is generated everyday
now suppose if my file is generated today, then tommrow it will be also generated as usual
but when tommrow it is generated I have to make sure that earlier day file is deleted as the space in that folder is limited and this check is every time need to be done previos day file to be get deleted from that folder , please advise how to achieve this..
File file = new File(FilePath + getFileName()); //filepath is being passes through //ioc //and filename through a method
if (!file.exists()) {
file.createNewFile();
}
FileOutputStream fileOutput = new FileOutputStream(
file);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
fileOutput));
why not use file.delete() ?
File file = new File(FilePath + getFileName()); //filepath is being passes through //ioc //and filename through a method
if (file.exists()) {
file.delete(); //you might want to check if delete was successfull
}
file.createNewFile();
FileOutputStream fileOutput = new FileOutputStream(file);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fileOutput));
If your file name same in time to time no need to delete that. By running your code tomorrow, will over write file created today.
Consider following case
BufferedWriter bw=new BufferedWriter(new FileWriter("D:\\Test\test.txt"));
bw.write("abbbb");
bw.close(); // now this will create a test.txt in side Test folder
now run this by change writing String
BufferedWriter bw=new BufferedWriter(new FileWriter("D:\\test.txt"));
bw.write("hihi");
bw.close(); // now you can see file only containing hihi
You can change your code this way:
if (file.exists()) {
file.delete();
}
file.createNewFile();
And if it does not work, it's a matter of permission.
If you are using Java 7 then there is standard way to get file creation time, So that you can check if file is created in previous day and should be delete.
Path path = Paths.get("/filepath/");
BasicFileAttributes fileAttributes = Files.readAttributes(path, BasicFileAttributes.class);
System.out.println("creationTime:"+ fileAttributes.creationTime());

Filehandling file path

Basically i have two questions. i am using the below code to read and write z text file.
File myFile = new File("/sdcard/mysdfile.txt");
myFile.createNewFile();
FileOutputStream fOut = new FileOutputStream(myFile);
OutputStreamWriter myOutWriter =
new OutputStreamWriter(fOut);
myOutWriter.append("my text here");
myOutWriter.close();
this create a new file every time i want this to OPEN_OR_CREATE(if file already exist don't create a new one)
Ad my second question is that how to change the path "/sdcard/mysdfile.txt" i want this file to stored in my sdcard -> subFolder1 -> SubFolder2
Thnaks
Do not use hardcoded /sdcard or /mnt/sdcard or your app will fail as devices vary on location or mountpoint of that storage. To get the right location use
Environment.getExternalStorageDirectory();
See docs here.
To append content to existing file use new FileOutputStream(myFile, true); instead of just new FileOutputStream(myFile); - see docs on that constructor here.
As for
how to change the path "/sdcard/mysdfile.txt"
Aside from getting rid of /sdcard as said above, just add subfolders to the paths: MyFolder1/MyFolder2/mysdfile.txt. Note these folder have to exists or the path will be invalid. You can always create it by calling myFile.mkdirs().
Replace
FileOutputStream fOut = new FileOutputStream(myFile);
with
FileOutputStream fOut = new FileOutputStream(myFile, true); //true means append mode.
Appart from that I have one suggestion for you.
Never never hardcode /sdcard in code,Rather consider writing.
File myFile = new File(Environment.getExternalStorageDirectory(),"mysdfile.txt");
Try my solution to write to end of text file
private void writeFile (String str){
try {
File f = new File(Environment.getExternalStorageDirectory().toString(),"tasklist.txt");
FileWriter fw = new FileWriter(f, true);
fw.write(str+"\n");
fw.flush();
fw.close();
} catch (Exception e) {
}
}
*File(Environment.getExternalStorageDirectory().toString()+"your/pth/here","tasklist.txt");
File dir = Environment.getExternalStorageDirectory();
File f = new File(dir+"/subFolder1/",xyz.txt); <-- HOW TO USE SUB FOLDER
if(file.exists())
{
// code to APPEND
}
else
{
// code to write new one
}
1> OPEN_OR_CREATE
You can try or can replace MODE_APPEND with true like #Vipul's suggestion
FileOutputStream fOut = openFileOutput(your_path_file, MODE_APPEND);
//it means if the file is exist the content you want write will append into it.
2> stored in my sdcard -> subFolder1 -> SubFolder2
you can use Environment.getExternalStorageDirectory().getAbsolutePath() to get full file path the SDCard. Then concat strings to get the file path you want. Ex:
String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath();
String fileName = "myFile.txt";
File f = new File(baseDir + File.separator + subfolder1 + File.separator + subfoler2, fileName);
In Java 7 we can do it this way:
Path path = Paths.get("/sdcard/mysdfile.txt");
BufferedWriter wrt = Files.newBufferedWriter(path, StandardCharsets.UTF_8, StandardOpenOption.APPEND);

Directory does not exist with FileWriter

I use FileWriter for create a file.
I have an error Directory does not exist
I think that FileWriter create the directory if it did not exist
FileWriter writer = new FileWriter(sFileName);
java.io.FileWriter does not create missing directories in the file path.
To create the directories you could do the following:
final File file = new File(sFileName);
final File parent_directory = file.getParentFile();
if (null != parent_directory)
{
parent_directory.mkdirs();
}
FileWriter writer = new FileWriter(file);
From the API documentation, we can conclude that FileWriter does not create a DIR if it does not exist:
FileWriter
public FileWriter(String fileName)
throws IOException
Constructs a FileWriter object given a file name.
Parameters:
fileName - String The system-dependent filename.
Throws:
IOException - if the named file exists but is a directory rather than a regular file, does not exist but cannot be created, or cannot be opened for any other reason

Categories