文档说不应该使用available()方法来确定a的大小InputStream.如何InputStream将一个字节数组的整个内容读入?
InputStream in; //assuming already present
byte[] data = new byte[in.available()];
in.read(data);//now data is filled with the whole content of the InputStream
Run Code Online (Sandbox Code Playgroud)
我可以多次读入固定大小的缓冲区,但是,我必须将读取的数据组合成单个字节数组,这对我来说是一个问题.
Jon*_*eet 62
最简单的方法IMO是使用Guava及其ByteStreams类:
byte[] bytes = ByteStreams.toByteArray(in);
Run Code Online (Sandbox Code Playgroud)
或者对于文件:
byte[] bytes = Files.toByteArray(file);
Run Code Online (Sandbox Code Playgroud)
或者(如果您不想使用Guava),您可以创建一个ByteArrayOutputStream,并重复读入一个字节数组并写入ByteArrayOutputStream(让该句柄调整大小),然后调用ByteArrayOutputStream.toByteArray().
请注意,无论您是否能够确定输入的长度,这种方法都有效 - 当然,假设您有足够的内存.
Jam*_*olk 56
如果您正在从文件中读入,则可以执行以下操作:
File file = new File("myFile");
byte[] fileData = new byte[(int) file.length()];
DataInputStream dis = new DataInputStream(new FileInputStream(file));
dis.readFully(fileData);
dis.close();
Run Code Online (Sandbox Code Playgroud)
Java 7在java.nio.file包中添加了一些新功能,可用于使此示例缩短几行.请参阅java.nio.file.Files类中的readAllBytes()方法.这是一个简短的例子:
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
// ...
Path p = FileSystems.getDefault().getPath("", "myFile");
byte [] fileData = Files.readAllBytes(p);
Run Code Online (Sandbox Code Playgroud)
请注意,截至撰写本文时,Android API不支持此功能(或Java 7中的大部分内容).
您可以使用Apache commons-io执行此任务:
请参考此方法:
public static byte[] readFileToByteArray(File file) throws IOException
Run Code Online (Sandbox Code Playgroud)
更新:
Java 7方式:
byte[] bytes = Files.readAllBytes(Paths.get(filename));
Run Code Online (Sandbox Code Playgroud)
如果它是一个文本文件,并且您想将其转换为String(根据需要更改编码):
StandardCharsets.UTF_8.decode(ByteBuffer.wrap(bytes)).toString()
Run Code Online (Sandbox Code Playgroud)
您可以通过chunks(byte buffer[] = new byte[2048])读取它并将块写入ByteArrayOutputStream.从ByteArrayOutputStream中,您可以将内容检索为byte [],而无需事先确定其大小.
我认为需要指定缓冲区长度,因为内存是有限的,您可能会用完它
例:
InputStream in = new FileInputStream(strFileName);
long length = fileFileName.length();
if (length > Integer.MAX_VALUE) {
throw new IOException("File is too large!");
}
byte[] bytes = new byte[(int) length];
int offset = 0;
int numRead = 0;
while (offset < bytes.length && (numRead = in.read(bytes, offset, bytes.length - offset)) >= 0) {
offset += numRead;
}
if (offset < bytes.length) {
throw new IOException("Could not completely read file " + fileFileName.getName());
}
in.close();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
127458 次 |
| 最近记录: |