GVKun编程网logo

java mp3 inputstream到字节数组?(java inputstream转byte)

7

对于想了解javamp3inputstream到字节数组?的读者,本文将提供新的信息,我们将详细介绍javainputstream转byte,并且为您提供关于8.22FileInputStream读取

对于想了解java mp3 inputstream到字节数组?的读者,本文将提供新的信息,我们将详细介绍java inputstream转byte,并且为您提供关于8.22 FileInputStream读取数据一次一个字节数组、BufferedInputStream到字符串转换?、FileInputStream到Android应用程序中的字节数组、FileInputStream读取的两种方法:逐字节读;以字节数组读取的有价值信息。

本文目录一览:

java mp3 inputstream到字节数组?(java inputstream转byte)

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读取数据一次一个字节数组

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放入我的字符串中,我该怎么做?

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到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读取的两种方法:逐字节读;以字节数组读取

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读取的两种方法:逐字节读;以字节数组读取的相关知识,请在本站进行查询。

本文标签: