我想用 OutputStream 发送文件,
所以我使用byte[] = new byte[size of file ]
但我不知道我可以使用的最大尺寸是多少。
这是我的代码。
File file = new File(sourceFilePath);
if (file.isFile()) {
try {
DataInputStream diStream = new DataInputStream(new FileInputStream(file));
long len = (int) file.length();
if(len>Integer.MAX_VALUE){
file_info.setstatu("Error");
}
else{
byte[] fileBytes = new byte[(int) len];
int read = 0;
int numRead = 0;
while (read < fileBytes.length && (numRead = diStream.read(fileBytes, read,
fileBytes.length - read)) >= 0) {
read = read + numRead;
}
fileEvent =new File_object();
fileEvent.setFileSize(len);
fileEvent.setFileData(fileBytes);
fileEvent.setStatus("Success");
fileEvent.setSender_name(file_info.getSender_name());
}
} catch (Exception e) {
e.printStackTrace();
fileEvent.setStatus("Error");
file_info.setstatu("Error");
}
} else {
System.out.println("path specified is not pointing to a file");
fileEvent.setStatus("Error");
file_info.setstatu("Error");
}
提前谢谢。
您收到异常的原因是由于以下行:
long len = (int) file.length();
从long
到int
的缩小转换可能会导致符号更改,因为会丢弃高阶位。参见JLS第5章,第5.1.3节。相关引述:
将有符号整数缩小到整数类型 T 的转换只是丢弃除 n 个最低顺序位之外的所有位,其中 n 是用于表示类型 T 的位数。除了可能丢失有关数值量级的信息外,这还可能导致结果值的符号与输入值的符号不同。
您可以使用一个简单的程序对此进行测试:
long a = Integer.MAX_VALUE + 1;
long b = (int) a;
System.out.println(b); # prints -2147483648
无论如何,您不应该使用字节数组来读取内存中的整个文件,但要解决此问题,请不要将文件长度转换为 int。然后,您对下一行的检查将起作用:
long len = file.length();
嗯,这是一种非常危险的文件读取方式。 Java 中的int
是 32 位 int,因此它位于范围 -2147483648 - 2147483647 中,而 long
是 64 位。
通常,您不应该一次读取整个文件,因为您的程序可能会耗尽大文件的 RAM。请改用 FileReader 之上的 BufferedReader。