对于想了解javamp3inputstream到字节数组?的读者,本文将提供新的信息,我们将详细介绍javainputstream转byte,并且为您提供关于8.22FileInputStream读取
对于想了解java mp3 inputstream到字节数组?的读者,本文将提供新的信息,我们将详细介绍java inputstream转byte,并且为您提供关于8.22 FileInputStream读取数据一次一个字节数组、BufferedInputStream到字符串转换?、FileInputStream到Android应用程序中的字节数组、FileInputStream读取的两种方法:逐字节读;以字节数组读取的有价值信息。
本文目录一览:- java mp3 inputstream到字节数组?(java inputstream转byte)
- 8.22 FileInputStream读取数据一次一个字节数组
- BufferedInputStream到字符串转换?
- FileInputStream到Android应用程序中的字节数组
- FileInputStream读取的两种方法:逐字节读;以字节数组读取
java mp3 inputstream到字节数组?(java inputstream转byte)
在尝试说“ Google it”之前,我尝试过,发现了一些有趣的文章,但没有任何效果。
我需要将网站上的mp3文件转换为字节流,以后可以将其保存到本地文件中。
这是我的代码(最重要的部分):
Url url = new Url("someUrl");URLConnection conn = url.openConnection();byte[] result = inputStreamToByteArray(conn.getInputStream());// .... some code herebyteArrayToFile(result, "tmp.mp3");public byte[] inputStreamToByteArray(InputStream inStream){ InputStreamReader in = new InputStreamReader(inStream): ByteArrayOutputStream baos = new ByteArrayOutputStream(); int next = inStream.read(); while (next > -1){ baos.write(next); next = in.read(); } byte[] result = baos.toByteArray(); baos.flush(); in.close(); return result;}public void byteArrayToFile(byte[] byteArray, String outFilePath){ FileOutputStream fos = new FileOutputStream(outFilePath); fos.write(byteArray); fos.close()}
该代码编译没有错误。与网址的连接有效。它发送正确的响应。
问题出在转换中。在byteArrayToFile()之后,我还会以适当的长度在磁盘上获取新文件,但是我无法在任何播放器中播放它。它说长度为00:00,因此不会播放。
顺便说一句。我想避免任何第三方聚会。但是如果没有其他办法…
答案1
小编典典(顺便说一下,顺便提一下,您提供的代码 不会
没有错误地进行编译。您没有必需的异常处理,inputStream
应该是InputStream
,仅供初学者使用。)
这就是问题:
InputStreamReader in = new InputStreamReader(inStream):
您正在尝试从二进制流中读取内容,并将其转换为文本。这 不是 文字。对于诸如MP3文件之类的二进制数据,您不应与“ Reader”或“
Writer”有任何关系。
这是您的inputStreamToByteArray
方法的外观(或使用Guava及其ByteStreams.toByteArray
方法):
public byte[] inputStreamToByteArray(InputStream inStream) throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buffer = new byte[8192]; int bytesRead; while ((bytesRead = inStream.read(buffer)) > 0) { baos.write(buffer, 0, bytesRead); } return baos.toByteArray();}
请注意,我已将其留给 调用方 以清理输入流。通常,任何获取流的人都会将其关闭-
IMO这样的方法本身将其关闭会有些奇怪。如果愿意,您可以这样做,但是可能在一个finally
块中,这样就可以知道即使抛出异常也 总是 将其关闭。
请注意,如果有异常,以后您的“编写”代码也不会关闭文件。您应该养成始终以finally
块关闭流的习惯。
8.22 FileInputStream读取数据一次一个字节数组
import java.io.FileInputStream;
import java.io.IOException;
/*
* 一次读取一个字节数组:int read(byte[] b)
* 返回值其实是实际读取的字节个数。
*/
public class FileInputStreamDemo2 {
public static void main(String[] args) throws IOException {
// 创建字节输入流对象
// FileInputStream fis = new FileInputStream("fis2.txt");
FileInputStream fis = new FileInputStream("FileOutputStreamDemo.java");
// 读取数据
// 定义一个字节数组
// 第一次读取
// byte[] bys = new byte[5];
// int len = fis.read(bys);
// // System.out.println(len);
// // System.out.println(new String(bys));
// // System.out.println(new String(bys, 0, len));
// System.out.print(new String(bys, 0, len));
//
// // 第二次读取
// len = fis.read(bys);
// // System.out.println(len);
// // System.out.println(new String(bys));
// // System.out.println(new String(bys, 0, len));
// System.out.print(new String(bys, 0, len));
//
// // 第三次读取
// len = fis.read(bys);
// // System.out.println(len);
// // System.out.println(new String(bys));
// // System.out.println(new String(bys, 0, len));
// System.out.print(new String(bys, 0, len));
//
// // 第四次读取
// len = fis.read(bys);
// // System.out.println(len);
// // System.out.println(new String(bys, 0, len));
// System.out.print(new String(bys, 0, len));
// // 代码重复了,用循环改进
// // 但是,我不知道结束条件
// // len = fis.read(bys);
// // System.out.println(len);
// // len = fis.read(bys);
// // System.out.println(len);
// // 如果读取到的实际长度是-1,就说明没有数据了
// byte[] bys = new byte[115]; // 0
// int len = 0;
// while ((len = fis.read(bys)) != -1) {
// System.out.print(new String(bys, 0, len));
// // System.out.print(new String(bys)); //千万要带上len的使用
// }
// 最终版代码
// 数组的长度一般是1024或者1024的整数倍
byte[] bys = new byte[1024];
int len = 0;
while ((len = fis.read(bys)) != -1) {
System.out.print(new String(bys, 0, len));
}
// 释放资源
fis.close();
}
}
BufferedInputStream到字符串转换?
嗨,我想将此BufferedInputStream放入我的字符串中,我该怎么做?
BufferedInputStream in = new BufferedInputStream(sktClient.getInputStream() );String a= in.read();
答案1
小编典典BufferedInputStream in = new BufferedInputStream(sktClient.getInputStream());
byte[] contents = new byte[1024];
int bytesRead = 0;String strFileContents; while((bytesRead = in.read(contents)) != -1) { strFileContents += new String(contents, 0, bytesRead); }System.out.print(strFileContents);
FileInputStream到Android应用程序中的字节数组
我有使用创建的FileInputStream Context.openFileInput()
。我现在想将文件转换为字节数组。
不幸的是,我无法确定所需的字节数组的大小FileInputStream.read(byte[])
。该available()
方法不起作用,我无法创建使用特定路径名检查其长度的文件,这可能是因为非root用户无法访问该路径。
我读了一下ByteArrayOutputStream
,它似乎可以动态调整字节数组的大小以适合它,但是我无法从中读取内容FileInputStream
并写入ByteArrayOutputStream
。
答案1
小编典典这应该工作。
InputStream is = Context.openFileInput(someFileName);ByteArrayOutputStream bos = new ByteArrayOutputStream();byte[] b = new byte[1024];while ((int bytesRead = is.read(b)) != -1) { bos.write(b, 0, bytesRead);}byte[] bytes = bos.toByteArray();
FileInputStream读取的两种方法:逐字节读;以字节数组读取
1:read() :
从输入流中读取数据的下一个字节,返回0到255范围内的int字节值。如果因为已经到达流末尾而没有可用的字节,则返回-1。在输入数据可用、检测到流末尾或者抛出异常前,此方法一直阻塞。
InputStream.read()这个方法是从流里每次只读取读取一个字节,效率会非常低。 更好的方法是用InputStream.read(byte[] b)或者InputStream.read(byte[] b,int off,int len)方法,一次读取多个字节。
2:read(byte[] b) :
从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。以整数形式返回实际读取的字节数。在输入数据可用、检测到文件末尾或者抛出异常前,此方法一直阻塞。如果 b 的长度为 0,则不读取任何字节并返回 0;否则,尝试读取至少一个字节。如果因为流位于文件末尾而没有可用的字节,则返回值 -1;否则,至少读取一个字节并将其存储在 b 中。将读取的第一个字节存储在元素 b[0] 中,下一个存储在 b[1] 中,依次类推。读取的字节数最多等于 b 的长度。设 k 为实际读取的字节数;这些字节将存储在 b[0] 到 b[k-1] 的元素中,不影响 b[k] 到 b[b.length-1] 的元素。
read()方法每次只能读取一个字节,所以也只能读取由ASCII码范围内的一些字符。这些字符主要用于显示现代英语和其他西欧语言。而对于汉字等unicode中的字符则不能正常读取。只能以乱码的形式显示。
3.关于InputStream类的available()方法
要一次读取多个字节时,经常用到InputStream.available()方法,这个方法可以在读写操作前先得知数据流里有多少个字节可以读取。需要注意的是,如果这个方法用在从本
地文件读取数据时,一般不会遇到问题。
但如果是用于网络操作,就经常会遇到一些麻烦。比如,Socket通讯时,对方明明发来了1000个字节,但是自己的程序调用available()方法却只得到900,或者100,甚至是0,感觉有点莫名其妙,怎么也找不到原因。其实,这是因为网络通讯往往是间断性的,一串字节往往分几批进行发送。本地程序调用available()方法有时得到0,这可能是对方还没有响应,也可能是对方已经响应了,但是数据还没有送达本地。对方发送了1000个字节给你,也许分成3批到达,这你就要调用3次available()方法才能将数据总数全部得到。
如果这样写代码:
int count = in.available();
byte[] b = new byte[count];
in.read(b);
在进行网络操作时往往出错,因为你调用available()方法时,对发发送的数据可能还没有到达,你得到的count是0。
需要改成这样:
int count = 0;
while (count == 0) {
count = in.available();
}
byte[] b = new byte[count];
in.read(b);
4.关于InputStream.read(byte[] b)和InputStream.read(byte[] b,int off,int len)这两个方法都是用来从流里读取多个字节的,有经验的程序员就会发现,这两个方法经常 读取不到自己想要读取的个数的字节。比如第一个方法,程序员往往希望程序能读取到b.length个字节,而实际情况是,系统往往读取不了这么多。仔细阅读Java的API说明就发现了,这个方法 并不保证能读取这么多个字节,它只能保证最多读取这么多个字节(最少1个)。因此,如果要让程序读取count个字节,最好用以下代码:
byte[] b = new byte[count];
int readCount = 0; // 已经成功读取的字节的个数
while (readCount < count) {
readCount += in.read(bytes, readCount, count - readCount);
}
用这段代码可以保证读取count个字节,除非中途遇到IO异常或者到了数据流的结尾(EOFException)
读取文件中的内容:
解决乱码:
// InputStreamReader(InputStreamis):用默认的编码读取数据 ;
// InputStreamReader(InputStreamis,StringcharsetName):用指定的编码读取数据
今天的关于java mp3 inputstream到字节数组?和java inputstream转byte的分享已经结束,谢谢您的关注,如果想了解更多关于8.22 FileInputStream读取数据一次一个字节数组、BufferedInputStream到字符串转换?、FileInputStream到Android应用程序中的字节数组、FileInputStream读取的两种方法:逐字节读;以字节数组读取的相关知识,请在本站进行查询。
本文标签: