我想使用以下代码将图像文件从java服务器发送到Android应用程序:
服务器(爪哇):
File file = new File("./clique.jpg");
FileInputStream stream = new FileInputStream(file);
DataOutputStream writer = new DataOutputStream(socket.getOutputStream());
byte[] contextB = new byte[4096];
int n;
int i = 0;
while ( (n=stream.read(contextB))!=-1 ){
writer.write(contextB, 0, n);
writer.flush();
System.out.println(n);
i+=n;
}
writer.flush();
stream.close();
android app:
DataInputStream reader = new DataInputStream(socket.getInputStream());
byte[] buffer = new byte[4096];
ByteArrayOutputStream content = new ByteArrayOutputStream();
int n;
int i = 0;
reader = new DataInputStream(socket.getInputStream());
while ( (n=reader.read(buffer)) != null){
content.write(buffer, 0, n);
content.flush();
}
Utility.CreateImageFile(content.toByteArray());
我注意到在android app n中,当我从4096大小的服务器字节块发送时读取的字节数不是4096,我也无法得到n = -1这是流的结尾,它会阻止,直到我关闭应用程序,然后我得到n = -1。
答案 0 :(得分:0)
关于一次读取的字节数与您编写的字节数无关 - 这在很大程度上取决于网络条件,并且每个块都是可变的(基本上可以传输的字节数很多)你读取的时间很短,你将在阅读块中获得许多。
关于流的结束 - 在您的服务器代码中,您忘记关闭输出流(您只关闭输入流的流 - 您还应关闭编写器,而编写器又将关闭基础输出流。
两条评论:
1)我真的建议使用包装写入/读取器的缓冲读取器/写入器 - 您将获得的代码更好,您不必自己创建/管理缓冲区。
2)最后使用try {}并在finally子句中关闭你的流 - 这是确保即使在读/写时出现问题也会关闭流和释放资源的最佳实践。
答案 1 :(得分:0)
您的Android代码出现问题:
while ( (n=reader.read(buffer)) != null) {
n不能为空。
在服务器上循环后使用writer.close()而不是writer.flush()。