Wie konvertiere ich eine java.io.File
zu einer byte[]
?
Ich danke Ihnen. Das ist, was ich brauche
Wie konvertiere ich eine java.io.File
zu einer byte[]
?
Wie jemand sagte, Apache Commons File Utils könnte das haben, wonach Sie suchen
public static byte[] readFileToByteArray(File file) throws IOException
Beispiel für die Verwendung ( 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);
...
}
}
Wenn Sie kein Java 8 haben und mit mir übereinstimmen, dass es eine schlechte Idee ist, eine umfangreiche Bibliothek einzubinden, um das Schreiben von ein paar Zeilen Code zu vermeiden:
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();
}
Der Aufrufer ist für das Schließen des Streams verantwortlich.
// 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;
}
Fügen Sie außerdem numRead in die Schleife ein. Deklarieren Sie Variablen in dem kleinstmöglichen gültigen Bereich. Die Platzierung außerhalb der while-Schleife ist nur notwendig, um den komplizierten "while"-Test zu ermöglichen; es wäre besser, den Test auf EOF innerhalb der Schleife durchzuführen (und eine EOFException zu werfen, wenn er auftritt).
Sie können dazu auch die NIO-Api verwenden. Ich könnte dies mit diesem Code tun, solange die gesamte Dateigröße (in Bytes) in einem int passen würde.
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();
}
}
Ich denke, seine sehr schnell, da seine mit MappedByteBuffer.
Es gibt absolut keinen Grund, Memory Mapping zu verwenden, wenn Sie die Datei nur einmal lesen wollen, und es wird am Ende doppelt so viel Speicher wie bei der Verwendung eines normalen FileInputStream benötigt.
Fantastisch, das neue Beispiel enthält printStackTrace, die klassische fehlerhafte Ausnahmebehandlung.
Das geht ganz einfach:
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);
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
0 Stimmen
Eine Anwendung, die ich mir vorstellen kann, ist das Lesen von serialisierten Objekten aus einer Datei.
2 Stimmen
Eine andere Möglichkeit besteht darin, den Dateityp anhand der Kopfzeile zu ermitteln.
0 Stimmen
Try This byte[] bytes = null; BufferedInputStream fileInputStream = null; try{File file = new File(filePath); fileInputStream = new BufferedInputStream(new FileInputStream(file)); //fileInputStream = Thread. currentThread().getContextClassLoader().getResourceAsStream(this.filePath); bytes = new byte[(int) file.length()]; fileInputStream.read(bytes); } catch(FileNotFoundException ex){ throw ex; }