Before creating the file , deleting the file of previous day - java

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());

Related

BufferedWriter is not writing text to text file

I have a BufferedWriter which is being used to write to a file which has just been created in the given directory, however, for some reason it is not writing the text that it reads from another file, here is my code:
private static final String tempFileDir = System.getProperty("user.dir") + "/TempATM.txt";
File tempFile = new File(tempFileDir); //Create temporary file to write new info to
File toRenameTo = new File("VirtualATM.txt"); //filename to rename temp file to
if (!tempFile.exists() && !tempFile.isDirectory()) {
tempFile.createNewFile(); //Create temp file if it doesn't already exist.
}
FileOutputStream fos = new FileOutputStream(tempFile, true); //For writing new balance
Writer bw = new BufferedWriter(new OutputStreamWriter(fos, "UTF8"));//For writing new balance
String newLineRead = null;
FileReader fileReader = new FileReader("VirtualATM.txt");//for reading from file
BufferedReader newBufferedReader = new BufferedReader(fileReader);//for reading from file
while((newLineRead = newBufferedReader.readLine()) != null){
if(!newLineRead.contains(cardNumberStr)){
bw.append(newLineRead); //If the line does not contain user entered card number, write line to new file.
((BufferedWriter) bw).newLine();
}else if(newLineRead.contains(cardNumberStr)){
bw.append(newAccountDetails); //Write updated account details if the line read contains users account number
((BufferedWriter) bw).newLine();
}
}
File toDeleteFile = new File("dirToWriteFile"); //File path to delete the file.
if(!toDeleteFile.delete()){
JOptionPane.showMessageDialog(null, "FATAL ERROR! Could not delete VirtualATM.txt", "Error", JOptionPane.ERROR_MESSAGE); // for if there is an error when deleting file
}
if(!file.renameTo(toRenameTo)){
JOptionPane.showMessageDialog(null, "FATAL ERROR! Could not rename the file to VirtualATM.txt", "Error", JOptionPane.ERROR_MESSAGE);//for if there is an error renaming file
}
Edit:
I am also having trouble deleting and renaming the text file, could any suggest what may be causing this problem, what SecurityExceptions etc. may be preventing Java from deleting and renaming a text file (.txt) on Windows 8.1?
You need to either flush the buffer post writing the data to buffer like
bw.flush();
or close the writer like
bw.close();//handle exception if you are not using AutoCloseable feature.
You must either flush the buffer to the disk after writing the data using:
bw.flush();
or / and if you have finished writing the data, you must always close the writer which will automatically flush the data to the disk before closing using:
bw.close();
Hope this helps. Good luck and have fun programming!
Cheers,
Lofty

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

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);
}

program does not work properly when moved to Servlet

I have made a program that works perfectly well in java class.. but when I moved my code to a servlet it does not work as expected
the program creates some files writes to them then later reads from them.. the problem is when I move the code to servlet the program would not create files in the first place, so when later reading them it will give FileNotFound exception
this is how I create write to and read from files.
first, create file and write to it
...
Writer output = null;
File file = new File(i + ".txt");
output = new BufferedWriter(new FileWriter(file));
output.write(text);
output.close();
... then later read from file
File file = new File(i+".txt");
Scanner br = new Scanner(file);
// BufferedReader br = new BufferedReader(new FileReader(new File(TDM.class.getResource(i + ".txt").getPath())));
while (br.hasNextLine()) {
line = br.nextLine();
...
Notes:
*the above code is NOT in servlet.. servlet only CALL the method that contains this code.
*apparently, the PROBLEM is with creating the file.. for some reason the file is not created when the method is called from servlet. how ever it works perfectly when called from another java class.
thanks in advance
Use a path: File.createTempFile for temporary files, or convert a web path ("/.../...") relative to your web contents into a file system File:
File file =
request.getServletContext().getRealPath("/WEB-INF/files/" + i + ".txt");
file.getParentFile().mkdirs();
...
Better yet give URLs to a file, that will be delivered by a Servlet streaming the file to
response.setContentType("text/plain");
response.getOutputStream();
...
If you write resource "files," that may reside in a .war of .jar; then do not use File.
Read them using an InputStream:
InputStream in = getClass().getResource("/...").getResourceAsStream();
And copy them to the response.getOutputStream().
Also do not use the utility "short-hand" class FileWriter as it uses the platform encoding, which on Windows is some ANSI encoding and on Linux servers in general is UTF-8.
new BufferedWriter(new OutputStreamWriter
(new FileOutputStream(file), "UTF-8"));
this comment from "Elliott Frisch" solved my problem
"You need to specify a path to your files."
simply I had to provide the "absolute" path instead of relative path
so, the code should be like this
Writer output = null;
File file = new File("/file/path/"i + ".txt");
output = new BufferedWriter(new FileWriter(file));
output.write(text);
output.close();
and
File file = new File("/file/path/"i+".txt");
Scanner br = new Scanner(file);
// BufferedReader br = new BufferedReader(new FileReader(new File(TDM.class.getResource(i + ".txt").getPath())));
while (br.hasNextLine()) {
line = br.nextLine();
then when I had this exception java.lang.NoClassDefFoundError: org/jsoup/Jsoup I just had to downlad the jsoup library from the internet and add it to my project under (library folder).
thank you very much for you all :)

Overwriting a text file when i don't want it to. - Java

I am working on a log file that is currently over-writing itself every single time. Now The thing is all i want it to do is to just write on the first line and append the list below to show the history from newest to oldest. Problem is I am not sure how to go about it I am looking at the code but don't know what I am doing wrong. Here is the code not sure if I am missing something or not.
String historylog = new Date().toString();
BufferedWriter bw = null;
String filepath = "C:\netbeans\Source code\test3";
String filename = "PatchHistory.log";
try
{
if (!(new File( filepath).exists()))
(new File( filepath)).mkdirs();
bw = new BufferedWriter( new FileWriter( filepath + File.separator
+ filename, true));
bw.write( historylog + "\r\n");
bw.newLine();
bw.flush();
bw.close();
return true;
}
catch (IOException){
return false;
}
Any Help would be appreciated not sure what I am doing wrong with this.
If I have understood you, you want to add log entries at the beginning of a log file.
AFAIK, (if you know any exceptions please tell me) all filesystems add data to the end of file. And Direct Access would overwrite the beginning of the file.
Your best option would be writting the log to a different file and, after writting what you want, write after that the contents of the original log file. Once done, close both files and overwrite the old file with the new one.
In your code
You are wrong here, you didn't used if statement properly.
if (!(new File( filepath).exists()))
(new File( filepath)).mkdirs(); // file path not exist, then it will execute
bw = new BufferedWriter( new FileWriter( filepath + File.separator + filename, true)); // this append file will always execute
Solution
if (!(f.exists())) {
//create new file
bw = new BufferedWriter(new FileWriter(filepath + File.separator + filename, false));
}
else{
//append in existing file
bw = new BufferedWriter(new FileWriter(filepath + File.separator + filename,true));
}

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);

Categories