java: keep tracking of file size on the run? - java

I wrote a code that writes compressed objects into a file, My questions is: is there a way that I could keep track of the increment of size of my file as the object being wrote in? here is my code:
public static void storeCompressedObjs(File outFile, ArrayList<Object[]> obj) {
FileOutputStream fos = null;
GZIPOutputStream gz = null;
ObjectOutputStream oos = null;
try {
fos = new FileOutputStream(outFile);
gz = new GZIPOutputStream(fos);
oos = new ObjectOutputStream(gz);
for (Object str : obj) {
oos.writeObject(str);
oos.flush();
//I was hoping to print outFile.length() here, but it doesn't work
}
} catch (IOException e) {
e.printStackTrace();
} finally {
oos.close();
gz.close();
fos.close();
}
}
I tried to use flush after every oos.writeObject(str); and then get the file size by using outFile.length(), but no matter how much I flush it, the file size remain unchanged until the last jump to its final size. Anyway that I could fix it? Thanks

The Apache Commons project provides a class CountingOutputStream, which you can put into your chain of OutputStreams. You can even have two of them:
package so5997784;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.util.zip.GZIPOutputStream;
import org.apache.commons.io.output.CountingOutputStream;
public class CountBytes {
private static void dump(File outFile, Object... objs) throws IOException {
FileOutputStream fos = new FileOutputStream(outFile);
try {
CountingOutputStream compressedCounter = new CountingOutputStream(fos);
OutputStream gz = new GZIPOutputStream(compressedCounter);
CountingOutputStream uncompressedCounter = new CountingOutputStream(gz);
ObjectOutputStream oos = new ObjectOutputStream(uncompressedCounter);
for (Object obj : objs) {
oos.writeObject(obj);
oos.flush();
System.out.println(uncompressedCounter.getByteCount() + " -> " + compressedCounter.getByteCount());
}
oos.close();
System.out.println(uncompressedCounter.getByteCount() + " -> " + compressedCounter.getByteCount());
} finally {
fos.close();
}
}
public static void main(String[] args) throws IOException {
File outFile = new File("objects.out.gz");
dump(outFile, "a", "b", "cde", "hello", "world");
}
}

Related

Java - Writing Object in res folder will instead of writing it in bin

Im having problems writing/reading object as resources on file.
I run code from the Main.java Class, and I want to write/read an object to the users.txt file.
The object that I want to write/read is the TryStructure Object, which just incapsulates a 1 element array and implements the Serializable interface, needed for object writing.
package Main;
import java.io.Serializable;
import java.util.ArrayList;
public class TryStructure implements Serializable
{
private static final long serialVersionUID = 1L;
private ArrayList<Integer> a = new ArrayList<Integer>();
public TryStructure()
{
a.add(5);
}
public String getStructure()
{
return a.toString();
}
}
The Main.java class writes and reads the obj from the users.txt file.
package Main;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.URISyntaxException;
import java.net.URL;
public class Main
{
public static void main(String[] args)
{
String res = "/res/users.txt";
write(res);
read(res);
}
private static void write(String resName)
{
TryStructure list = new TryStructure();
FileOutputStream fos;
ObjectOutputStream oos;
URL resource = Main.class.getClass().getResource(resName);
File file = null;
try
{
file = new File(resource.toURI());
fos = new FileOutputStream(file);
oos = new ObjectOutputStream(fos);
System.out.println("WRITING: " + list.getStructure());
oos.writeObject(list);
oos.close();
fos.close();
}
catch (IOException e)
{
System.err.println("users.txt not found !");
}
catch (URISyntaxException e)
{
e.printStackTrace();
}
}
private static void read(String resName)
{
FileInputStream fos;
ObjectInputStream oos;
URL resource = Main.class.getClass().getResource(resName);
File file = null;
try
{
file = new File(resource.toURI());
fos = new FileInputStream(file);
oos = new ObjectInputStream(fos);
System.out.println("READING: " + ((TryStructure) oos.readObject()).getStructure());
oos.close();
fos.close();
}
catch (IOException e)
{
System.err.println("users.txt not found !");
}
catch (ClassNotFoundException e)
{
System.out.println("AA");
}
catch (URISyntaxException e)
{
e.printStackTrace();
}
}
}
If I run the code I get the following output:
WRITING: [5]
READING: [5]
If I then check the user.txt file I find it empty, and I find the information in bin/res/user.txt.
I dont understand why it only updates the file in bin folder and not also the one in res folder, why is this happening? I would like to write to that specific file.
Thank you.

EOF exception and ObjectInputStream.readObject() Error

This a small part of my code. I want to read the file if it exists. If not, then create a new one. When I restart the program I want to work with the file that is saved. Eclipse says the error is on "ObjectInputStream inStream = new ObjectInputStream(file);" Not sure why.
rooms sbu = new rooms();
File saveFile = new File("SavedObj.obj");
if(saveFile.exists() == false)
{
System.out.println("No save file found. Creating a new file.");
try{
saveFile.createNewFile();
}catch(Exception ex)
{
System.out.println(ex.getMessage());
}
}
else {
FileInputStream file = new FileInputStream(saveFile);
ObjectInputStream inStream = new ObjectInputStream(file);
sbu= (room) inStream.readObject();
}
In the end of my code I store object like this:
FileOutputStream fileOut = new FileOutputStream(saveFile);
ObjectOutputStream outStream = new ObjectOutputStream(fileOut);
outStream.writeObject(sbu);
outStream.close();
isFinished= true;
Any help will be appreciated, thanks a lot!
You can't expect ObjectInputStream to convert text to objects automatically. readObject can only work for the file created by writeObject in ObjectOutputStream.
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import com.pechen.Person;
public class Demo {
public static void main(String [] args) throws Exception{
String filename = "person.obj";
Person person = new Person();
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(filename));
out.writeObject(person);
out.close();
Person p;
ObjectInputStream in = new ObjectInputStream(new FileInputStream(filename));
p = (Person)in.readObject();
in.close();
System.out.println("Read Person: " + p.toString());
}
}

FileOutputStream zip file open ERROR: "File cannot be opened as an archive"

I am trying to create ".zip" file from byte array but the error given appear everytime I am attempt to open it. Here is the code:
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.PrintWriter;
public class ReadTxtFile {
public static void BinFileContToBinArr(String path) throws Throwable{
BufferedReader inputStream = null;
PrintWriter outputStream = null;
try{
String el = null;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
inputStream = new BufferedReader(new FileReader(path));
FileOutputStream fos = new FileOutputStream("D:/texttNE22W.zip");
while((el=inputStream.readLine()) != null){
baos.write(el.getBytes());
}
byte[] b = baos.toByteArray();
for(int i = 0; i<b.length; i++){
System.out.print((char)b[i] + " ");
}
fos.write(b);
}
finally{
if (inputStream!=null){
inputStream.close();
}
if(outputStream!=null){
outputStream.close();
}
}
}
public static void main(String[] args) throws Throwable {
String path = "D:/text.txt";
BinFileContToBinArr(path);
}
}
I've made a research but didn't find a solution. Also, I tried to create a ".txt" file and it works. The only problem is when it comes to creating a ".zip".
Thank you beforehand ! By the way, if someone have encountered this problem before, feel free to vote up or leave me a comment if you wish, because I am interested if it is a common mistake.
You need to use ZipOutputStream instead of FileOutputStream.

FileOutputStream is reducing the file size to 0

I have created a file using RandomAccessFile with preallocated size. But when I am using FileOutputStream to write into the same it is changing the size of the file. Is there any way to stop this using FileOutputStream
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.RandomAccessFile;
import java.io.Serializable;
public class testFileSize {
public static class Status implements Serializable {
}
public static void preAllocate(String path, long maxSize, boolean preAllocate)
throws IOException {
RandomAccessFile raf = new RandomAccessFile(path, "rw");
try {
raf.setLength(maxSize);
} finally {
raf.close();
}
}
/**
* #param args
* #throws IOException
*/
public static void main(String[] args) throws IOException {
FileOutputStream fileOutput = null;
ObjectOutputStream objectOutput = null;
try {
final File f = new File("/tmp/test.bin");
preBlow(f.getAbsolutePath(), 2048, false);
Status s = new Status();
fileOutput = new FileOutputStream(f);
objectOutput = new ObjectOutputStream(fileOutput);
objectOutput.writeObject(new Status());
objectOutput.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
objectOutput.close();
fileOutput.close();
}
}
}
Looks like your file is changing size because you're opening the file on create mode, so the previous contents are lost
fileOutput = new FileOutputStream(f);
Try opening your file in append mode, using an extra boolean flag while constructing your FileOutputStream
fileOutput = new FileOutputStream(f, true);

Reading video data and writing to another file java

I am reading a video file data in bytes and sending to another file but the received video file is not playing properly and is chattered.
Can anyone explain me why this is happening and a solution is appreciated.
My code is as follows
import java.io.*;
public class convert {
public static void main(String[] args) {
//create file object
File file = new File("B:/music/Billa.mp4");
try
{
//create FileInputStream object
FileInputStream fin = new FileInputStream(file);
byte fileContent[] = new byte[(int)file.length()];
fin.read(fileContent);
//create string from byte array
String strFileContent = new String(fileContent);
System.out.println("File content : ");
System.out.println(strFileContent);
File dest=new File("B://music//a.mp4");
BufferedWriter bw=new BufferedWriter(new FileWriter(dest));
bw.write(strFileContent+"\n");
bw.flush();
}
catch(FileNotFoundException e)
{
System.out.println("File not found" + e);
}
catch(IOException ioe)
{
System.out.println("Exception while reading the file " + ioe);
}
}
}
This question might be dead but someone might find this useful.
You can't handle video as string. This is the correct way to read and write (copy) any file using Java 7 or higher.
Please note that size of buffer is processor-dependent and usually should be a power of 2. See this answer for more details.
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class FileCopy {
public static void main(String args[]) {
final int BUFFERSIZE = 4 * 1024;
String sourceFilePath = "D:\\MyFolder\\MyVideo.avi";
String outputFilePath = "D:\\OtherFolder\\MyVideo.avi";
try(
FileInputStream fin = new FileInputStream(new File(sourceFilePath));
FileOutputStream fout = new FileOutputStream(new File(outputFilePath));
){
byte[] buffer = new byte[BUFFERSIZE];
while(fin.available() != 0) {
bytesRead = fin.read(buffer);
fout.write(buffer, 0, bytesRead);
}
}
catch(Exception e) {
System.out.println("Something went wrong! Reason: " + e.getMessage());
}
}
}
Hope this also helpful for you - This can read and write a file into another file (You can use any file type to do that)
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class Copy {
public static void main(String[] args) throws Exception {
FileInputStream input = new FileInputStream("input.mp4"); //input file
byte[] data = input.readAllBytes();
FileOutputStream output = new FileOutputStream("output.mp4"); //output file
output.write(data);
output.close();
}
}
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import javax.imageio.ImageIO;
public class Reader {
public Reader() throws Exception{
File file = new File("C:/Users/Digilog/Downloads/Test.mp4");
FileInputStream fin = new FileInputStream(file);
byte b[] = new byte[(int)file.length()];
fin.read(b);
File nf = new File("D:/K.mp4");
FileOutputStream fw = new FileOutputStream(nf);
fw.write(b);
fw.flush();
fw.close();
}
}
In addition to Jakub Orsula's answer, one needs to check the result of read operation to prevent garbage being written to end of file in last iteration.
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class FileCopy {
public static void main(String args[]) {
final int BUFFERSIZE = 4 * 1024;
String sourceFilePath = "D:\\MyFolder\\MyVideo.avi";
String outputFilePath = "D:\\OtherFolder\\MyVideo.avi";
try(
FileInputStream fin = new FileInputStream(new File(sourceFilePath));
FileOutputStream fout = new FileOutputStream(new File(outputFilePath));
){
byte[] buffer = new byte[BUFFERSIZE];
int bytesRead;
while(fin.available() != 0) {
bytesRead = fin.read(buffer);
fout.write(buffer, 0, bytesRead);
}
}
catch(Exception e) {
System.out.println("Something went wrong! Reason: " + e.getMessage());
}
}
}

Categories