如何以字节数组从服务器中的文件中读取数据
Posted
技术标签:
【中文标题】如何以字节数组从服务器中的文件中读取数据【英文标题】:How to read data from file in server in byte array 【发布时间】:2013-08-20 13:00:09 【问题描述】:我想从服务器读取一个文件并获取它的数据。
我写了以下代码。
URL uurl = new URL(this.m_FilePath);
BufferedReader in = new BufferedReader(new InputStreamReader(uurl.openStream()));
String str;
while ((str = in.readLine()) != null)
text_file=text_file+str;
text_file=text_file+"\n";
m_byteVertexBuffer=text_file.getBytes();
但是我得到了错误的结果!如果我从字符串中读取数据,我会得到 m_bytevertexbuffer length=249664。
现在,当我将本地文件读入字节数组时,我得到 m_bytevertexbuffer length=169332。
FileInputStream fis = new FileInputStream(VertexFile);
fis.read(m_byteVertexBuffer);
ByteBuffer dlb=null;
int l=m_byteVertexBuffer.length;
我想要来自服务器和本地文件的字节缓冲区中的相同数据!
【问题讨论】:
要读取字节,从 InputStream 读取,不要用 Reader 包装它。您的第二段代码没有意义:它打印字节数组的长度,无论您是否从文件中读取,这都是相同的。阅读 Java IO 教程:docs.oracle.com/javase/tutorial/essential/io/bytestreams.html 简而言之我想问我应该如何读取放置在服务器中的二进制文件? 【参考方案1】:如果服务器发送一个标头Content-Length: 999
,您可以分配一个new byte[999]
。
URL url = new URL("http://www.android.com/");
URLConnection urlConnection = url.openConnection();
int contentLength = urlConnection.getContentLength();
// -1 if not known or > int range.
try
InputStream in = new BufferedInputStream(urlConnection.getInputStream());
//if (contentLength >= 0)
// byte[] bytes = new byte[contentLength];
// in.read(bytes);
// m_byteVertexBuffer = bytes;
// else
ByteArrayOutputStream baos;
byte[] bytes = new byte[contentLength == -1 ? 10240 : contentLength];
for (;;)
int nread = in.read(bytes, 0, bytes.length);
if (nread <= 0)
break;
baos.write(bytes, 0, nread);
m_byteVertexBuffer = baos.toByteArray();
//
finally
urlConnection.disconnect();
在一般情况下,您只会使用 else 分支的代码。但是,如果存在有效的内容长度,它仍然是可用的。
【讨论】:
无法保证 read() 方法会一次读取所有字节。应始终使用循环。 @MuneemHabib 试试in.close();
。
@MuneemHabib 也许还有其他问题:写作没有调用close()
所以最后一部分现在被刷新,写入。
先生,它没有读取完整字节,我也在通过文件流从 sdcard 读取二进制文件,它工作得很好,但我陷入了这个问题,我没有发现任何问题,但它没有读取完整字节以上是关于如何以字节数组从服务器中的文件中读取数据的主要内容,如果未能解决你的问题,请参考以下文章
NAudio C#:如何从 WaveInEventArgs 获取字节数组以进行进一步操作