缓冲区读取文件中的音频数据给出零

时间:2013-07-20 02:14:23

标签: java android file

在我的应用程序中,我需要首先从特定文件中读取音频数据,然后将其存储在缓冲区中。之后,我将用它来处理和填充。问题是,当我尝试打印出它的内容时,它会给出0:

String data = String.valueOf(buffer[50]+"     "+buffer[100]+"     "+buffer[200]+buffer[599]);
display.setText(data);

打印上述声明给出了所有零!...为什么???

这是我的代码:

   public void readAudioDataFromFile() {

     String filePath2 = "/storage/sdcard0/Sounds/originalFile.pcm";
     FileInputStream ins = null;
     File file = new File(filePath2);
     int size = (int) file.length();    
     byte [] buffer=new byte [size];
     try {
       ins= new FileInputStream(filePath2);
     } catch (FileNotFoundException e) {
       e.printStackTrace();
     }
     try {
       ins.read(buffer, 0,size);
       int count =0;
       for(int i=0; i<buffer.length; i++)
       {
         if(buffer[i]!=0)
           count++;
       }
       String data = String.valueOf((count); 
       display.setText(data);
     } catch (IOException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
     }
   }

奇怪的是,当我尝试以下陈述时:

  int x= ins.read(buffer, 0,size);

当我打印x时,它给出了一个等于文件大小的数字

此外,当我尝试打印出“计数”时,您可以在我的代码中看到它,它也提供了输出!

我的意思是不应该意味着缓冲区不是空的???为什么如果它不是空的,为什么当我试图打印出它的元素时它会给我零?

1 个答案:

答案 0 :(得分:1)

问题是什么并不是很明显,但可能是由此造成的:

ins.read(buffer, 0,size);

您忽略了read调用的结果,它会告诉您实际读入buffer的字节数。假设您将读取size个字节...是错误的,即使文件大小为size

正确的方法是循环,直到你读完整个文件......就像这样:

       int pos = 0;
       while (pos < size) {
           pos += ins.read(buffer, pos, size - pos);
       }

至于为什么你得到全零,我认为最简单(也是最可能)的解释是你正在阅读的文件包含全零。