File to byte[] in Java

JavaFile Io

Java Problem Overview


How do I convert a java.io.File to a byte[]?

Java Solutions


Solution 1 - Java

From JDK 7 you can use Files.readAllBytes(Path).

Example:

import java.io.File;
import java.nio.file.Files;

File file;
// ...(file is initialised)...
byte[] fileContent = Files.readAllBytes(file.toPath());

Solution 2 - Java

It depends on what best means for you. Productivity wise, don't reinvent the wheel and use Apache Commons. Which is here FileUtils.readFileToByteArray(File input).

Solution 3 - Java

Since JDK 7 - one liner:

byte[] array = Files.readAllBytes(Paths.get("/path/to/file"));

No external dependencies needed.

Solution 4 - Java

import java.io.RandomAccessFile;
RandomAccessFile f = new RandomAccessFile(fileName, "r");
byte[] b = new byte[(int)f.length()];
f.readFully(b);

Documentation for Java 8: http://docs.oracle.com/javase/8/docs/api/java/io/RandomAccessFile.html

Solution 5 - Java

Basically you have to read it in memory. Open the file, allocate the array, and read the contents from the file into the array.

The simplest way is something similar to this:

public byte[] read(File file) throws IOException, FileTooBigException {
	if (file.length() > MAX_FILE_SIZE) {
		throw new FileTooBigException(file);
	}
	ByteArrayOutputStream ous = null;
	InputStream ios = null;
	try {
		byte[] buffer = new byte[4096];
		ous = new ByteArrayOutputStream();
		ios = new FileInputStream(file);
		int read = 0;
		while ((read = ios.read(buffer)) != -1) {
			ous.write(buffer, 0, read);
		}
	}finally {
		try {
			if (ous != null)
				ous.close();
		} catch (IOException e) {
		}

		try {
			if (ios != null)
				ios.close();
		} catch (IOException e) {
		}
	}
	return ous.toByteArray();
}

This has some unnecessary copying of the file content (actually the data is copied three times: from file to buffer, from buffer to ByteArrayOutputStream, from ByteArrayOutputStream to the actual resulting array).

You also need to make sure you read in memory only files up to a certain size (this is usually application dependent) :-).

You also need to treat the IOException outside the function.

Another way is this:

public byte[] read(File file) throws IOException, FileTooBigException {
	if (file.length() > MAX_FILE_SIZE) {
		throw new FileTooBigException(file);
	}

	byte[] buffer = new byte[(int) file.length()];
	InputStream ios = null;
	try {
		ios = new FileInputStream(file);
		if (ios.read(buffer) == -1) {
			throw new IOException(
					"EOF reached while trying to read the whole file");
		}
	} finally {
		try {
			if (ios != null)
				ios.close();
		} catch (IOException e) {
		}
	}
	return buffer;
}

This has no unnecessary copying.

FileTooBigException is a custom application exception. The MAX_FILE_SIZE constant is an application parameters.

For big files you should probably think a stream processing algorithm or use memory mapping (see java.nio).

Solution 6 - Java

As someone said, Apache Commons File Utils might have what you are looking for

public static byte[] readFileToByteArray(File file) throws IOException

Example use (Program.java):

import org.apache.commons.io.FileUtils;
public class Program {
    public static void main(String[] args) throws IOException {
        File file = new File(args[0]);  // assume args[0] is the path to file
        byte[] data = FileUtils.readFileToByteArray(file);
        ...
    }
}

Solution 7 - Java

If you don't have Java 8, and agree with me that including a massive library to avoid writing a few lines of code is a bad idea:

public static byte[] readBytes(InputStream inputStream) throws IOException {
    byte[] b = new byte[1024];
    ByteArrayOutputStream os = new ByteArrayOutputStream();
    int c;
    while ((c = inputStream.read(b)) != -1) {
        os.write(b, 0, c);
    }
    return os.toByteArray();
}

Caller is responsible for closing the stream.

Solution 8 - Java

You can use the NIO api as well to do it. I could do this with this code as long as the total file size (in bytes) would fit in an int.

File f = new File("c:\\wscp.script");
FileInputStream fin = null;
FileChannel ch = null;
try {
    fin = new FileInputStream(f);
    ch = fin.getChannel();
    int size = (int) ch.size();
    MappedByteBuffer buf = ch.map(MapMode.READ_ONLY, 0, size);
    byte[] bytes = new byte[size];
    buf.get(bytes);

} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} finally {
    try {
        if (fin != null) {
            fin.close();
        }
        if (ch != null) {
            ch.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

I think its very fast since its using MappedByteBuffer.

Solution 9 - Java

// Returns the contents of the file in a byte array.
    public static byte[] getBytesFromFile(File file) throws IOException {        
        // Get the size of the file
        long length = file.length();
    
        // You cannot create an array using a long type.
        // It needs to be an int type.
        // Before converting to an int type, check
        // to ensure that file is not larger than Integer.MAX_VALUE.
        if (length > Integer.MAX_VALUE) {
            // File is too large
            throw new IOException("File is too large!");
        }
    
        // Create the byte array to hold the data
        byte[] bytes = new byte[(int)length];
    
        // Read in the bytes
        int offset = 0;
        int numRead = 0;
        
        InputStream is = new FileInputStream(file);
        try {
            while (offset < bytes.length
                   && (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) {
                offset += numRead;
            }
        } finally {
            is.close();
        }
    
        // Ensure all the bytes have been read in
        if (offset < bytes.length) {
            throw new IOException("Could not completely read file "+file.getName());
        }
        return bytes;
    }

Solution 10 - Java

Simple way to do it:

File fff = new File("/path/to/file");
FileInputStream fileInputStream = new FileInputStream(fff);

// int byteLength = fff.length(); 

// In android the result of file.length() is long
long byteLength = fff.length(); // byte count of the file-content
    
byte[] filecontent = new byte[(int) byteLength];
fileInputStream.read(filecontent, 0, (int) byteLength);

Solution 11 - Java

Simplest Way for reading bytes from file

import java.io.*;

class ReadBytesFromFile {
    public static void main(String args[]) throws Exception {
        // getBytes from anyWhere
        // I'm getting byte array from File
        File file = null;
        FileInputStream fileStream = new FileInputStream(file = new File("ByteArrayInputStreamClass.java"));

        // Instantiate array
        byte[] arr = new byte[(int) file.length()];

        // read All bytes of File stream
        fileStream.read(arr, 0, arr.length);

        for (int X : arr) {
            System.out.print((char) X);
        }
    }
}

Solution 12 - Java

Guava has Files.toByteArray() to offer you. It has several advantages:

  1. It covers the corner case where files report a length of 0 but still have content
  2. It's highly optimized, you get a OutOfMemoryException if trying to read in a big file before even trying to load the file. (Through clever use of file.length())
  3. You don't have to reinvent the wheel.

Solution 13 - Java

import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;

File file = getYourFile();
Path path = file.toPath();
byte[] data = Files.readAllBytes(path);

Solution 14 - Java

Using the same approach as the community wiki answer, but cleaner and compiling out of the box (preferred approach if you don't want to import Apache Commons libs, e.g. on Android):

public static byte[] getFileBytes(File file) throws IOException {
    ByteArrayOutputStream ous = null;
    InputStream ios = null;
    try {
        byte[] buffer = new byte[4096];
        ous = new ByteArrayOutputStream();
        ios = new FileInputStream(file);
        int read = 0;
        while ((read = ios.read(buffer)) != -1)
            ous.write(buffer, 0, read);
    } finally {
        try {
            if (ous != null)
                ous.close();
        } catch (IOException e) {
            // swallow, since not that important
        }
        try {
            if (ios != null)
                ios.close();
        } catch (IOException e) {
            // swallow, since not that important
        }
    }
    return ous.toByteArray();
}

Solution 15 - Java

I belive this is the easiest way:

org.apache.commons.io.FileUtils.readFileToByteArray(file);

Solution 16 - Java

ReadFully Reads b.length bytes from this file into the byte array, starting at the current file pointer. This method reads repeatedly from the file until the requested number of bytes are read. This method blocks until the requested number of bytes are read, the end of the stream is detected, or an exception is thrown.

RandomAccessFile f = new RandomAccessFile(fileName, "r");
byte[] b = new byte[(int)f.length()];
f.readFully(b);

Solution 17 - Java

This is one of the simplest way

 String pathFile = "/path/to/file";
 byte[] bytes = Files.readAllBytes(Paths.get(pathFile ));

Solution 18 - Java

If you want to read bytes into a pre-allocated byte buffer, this answer may help.

Your first guess would probably be to use InputStream read(byte[]). However, this method has a flaw that makes it unreasonably hard to use: there is no guarantee that the array will actually be completely filled, even if no EOF is encountered.

Instead, take a look at DataInputStream readFully(byte[]). This is a wrapper for input streams, and does not have the above mentioned issue. Additionally, this method throws when EOF is encountered. Much nicer.

Solution 19 - Java

Not only does the following way convert a java.io.File to a byte[], I also found it to be the fastest way to read in a file, when testing many different Java file reading methods against each other:

java.nio.file.Files.readAllBytes()

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;

public class ReadFile_Files_ReadAllBytes {
  public static void main(String [] pArgs) throws IOException {
    String fileName = "c:\\temp\\sample-10KB.txt";
    File file = new File(fileName);

    byte [] fileBytes = Files.readAllBytes(file.toPath());
    char singleChar;
    for(byte b : fileBytes) {
      singleChar = (char) b;
      System.out.print(singleChar);
    }
  }
}

Solution 20 - Java

Let me add another solution without using third-party libraries. It re-uses an exception handling pattern that was proposed by Scott (link). And I moved the ugly part into a separate message (I would hide in some FileUtils class ;) )

public void someMethod() {
final byte[] buffer = read(new File("test.txt"));
}




private byte[] read(final File file) {
if (file.isDirectory())
throw new RuntimeException("Unsupported operation, file "
+ file.getAbsolutePath() + " is a directory");
if (file.length() > Integer.MAX_VALUE)
throw new RuntimeException("Unsupported operation, file "
+ file.getAbsolutePath() + " is too big");



Throwable pending = null;
FileInputStream in = null;
final byte buffer[] = new byte[(int) file.length()];
try {
	in = new FileInputStream(file);
	in.read(buffer);
} catch (Exception e) {
	pending = new RuntimeException("Exception occured on reading file "
			+ file.getAbsolutePath(), e);
} finally {
	if (in != null) {
		try {
			in.close();
		} catch (Exception e) {
			if (pending == null) {
				pending = new RuntimeException(
					"Exception occured on closing file" 
                         + file.getAbsolutePath(), e);
			}
		}
	}
	if (pending != null) {
		throw new RuntimeException(pending);
	}
}
return buffer;




}

}

Solution 21 - Java

public static byte[] readBytes(InputStream inputStream) throws IOException {
	byte[] buffer = new byte[32 * 1024];
	int bufferSize = 0;
	for (;;) {
		int read = inputStream.read(buffer, bufferSize, buffer.length - bufferSize);
		if (read == -1) {
			return Arrays.copyOf(buffer, bufferSize);
		}
		bufferSize += read;
		if (bufferSize == buffer.length) {
			buffer = Arrays.copyOf(buffer, bufferSize * 2);
		}
	}
}

Solution 22 - Java

//The file that you wanna convert into byte[]
File file=new File("/storage/0CE2-EA3D/DCIM/Camera/VID_20190822_205931.mp4"); 

FileInputStream fileInputStream=new FileInputStream(file);
byte[] data=new byte[(int) file.length()];
BufferedInputStream bufferedInputStream=new BufferedInputStream(fileInputStream);
bufferedInputStream.read(data,0,data.length);

//Now the bytes of the file are contain in the "byte[] data"

Solution 23 - Java

Another Way for reading bytes from file

Reader reader = null;
    try {
        reader = new FileReader(file);
        char buf[] = new char[8192];
        int len;
        StringBuilder s = new StringBuilder();
        while ((len = reader.read(buf)) >= 0) {
            s.append(buf, 0, len);
            byte[] byteArray = s.toString().getBytes();
        }
    } catch(FileNotFoundException ex) {
    } catch(IOException e) {
    }
    finally {
        if (reader != null) {
            reader.close();
        }
    }

Solution 24 - Java

Try this :

import sun.misc.IOUtils;
import java.io.IOException;

try {
    String path="";
    InputStream inputStream=new FileInputStream(path);
    byte[] data=IOUtils.readFully(inputStream,-1,false);
}
catch (IOException e) {
    System.out.println(e);
}

Solution 25 - Java

Can be done as simple as this (Kotlin version)

val byteArray = File(path).inputStream().readBytes()

EDIT:

I've read docs of readBytes method. It says:

> Reads this stream completely into a byte array. > Note: It is the caller's responsibility to close this stream.

So to be able to close the stream, while keeping everything clean, use the following code:

val byteArray = File(path).inputStream().use { it.readBytes() }

Thanks to @user2768856 for pointing this out.

Solution 26 - Java

try this if you have target version less than 26 API

 private static byte[] readFileToBytes(String filePath) {

    File file = new File(filePath);
    byte[] bytes = new byte[(int) file.length()];

    // funny, if can use Java 7, please uses Files.readAllBytes(path)
    try(FileInputStream fis = new FileInputStream(file)){
        fis.read(bytes);
        return bytes;
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;

}

Solution 27 - Java

In JDK8

Stream<String> lines = Files.lines(path);
String data = lines.collect(Collectors.joining("\n"));
lines.close();

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionBen NolandView Question on Stackoverflow
Solution 1 - JavaAlanView Answer on Stackoverflow
Solution 2 - JavasvachonView Answer on Stackoverflow
Solution 3 - JavaPaulius MatulionisView Answer on Stackoverflow
Solution 4 - JavaDmitry MitskevichView Answer on Stackoverflow
Solution 5 - JavaMihai ToaderView Answer on Stackoverflow
Solution 6 - JavaTomView Answer on Stackoverflow
Solution 7 - JavaJeffrey BlattmanView Answer on Stackoverflow
Solution 8 - JavaAmitView Answer on Stackoverflow
Solution 9 - JavaCugaView Answer on Stackoverflow
Solution 10 - JavaSudip BhandariView Answer on Stackoverflow
Solution 11 - JavaMuhammad SadiqView Answer on Stackoverflow
Solution 12 - JavajontejjView Answer on Stackoverflow
Solution 13 - JavaBlondCodeView Answer on Stackoverflow
Solution 14 - JavamanmalView Answer on Stackoverflow
Solution 15 - JavaCristian TeticView Answer on Stackoverflow
Solution 16 - JavaTarun MView Answer on Stackoverflow
Solution 17 - JavaSachin KumarView Answer on Stackoverflow
Solution 18 - JavaLaurens HolstView Answer on Stackoverflow
Solution 19 - JavagomishaView Answer on Stackoverflow
Solution 20 - JavaAndreas DolkView Answer on Stackoverflow
Solution 21 - JavamazatworkView Answer on Stackoverflow
Solution 22 - JavaUsama MehmoodView Answer on Stackoverflow
Solution 23 - JavaMuhammad Aamir AliView Answer on Stackoverflow
Solution 24 - JavaMaifee Ul AsadView Answer on Stackoverflow
Solution 25 - JavaTamim AttafiView Answer on Stackoverflow
Solution 26 - JavaMohd QasimView Answer on Stackoverflow
Solution 27 - JavabeaucequebecView Answer on Stackoverflow