2016-06-08 52 views
0

我真的很困惑,为什么当我使用下面显示的代码时,我得到一个0kb文件。作为Java网站关于这个类的说明,我应该工作。但是...我想要生成一个正弦波并输出其结果到一个txt填充双。这是我的代码的第一步,我陷入了这样一个简单的问题。也许我不太了解如何使用类文件和数据流,就像我从官方网站上学到的那样。为什么我在使用datainputstream,java,android时会得到一个0kb文件?

public class audioplayThread implements Runnable { 
private File file; 
private FileOutputStream ops; 
private BufferedOutputStream bos; 
private DataOutputStream dos; 
private double Omega; 
private int f = 18*1000; 
private double pi; 
private int samplenumber = 84;  //Assume OFDM symbol has 64 real value and 
private static final int Encording = AudioFormat.ENCODING_PCM_16BIT; //Data size for each frame = 16 bytes 
private static final int Sample_rate = 48000;      //Sample rate = 48000 HZ 
private static final int Channel = AudioFormat.CHANNEL_OUT_MONO;   //Set as single track 
private static final int Buffersize = AudioTrack.getMinBufferSize(Sample_rate, Channel,Encording); 
@Override 
public void run() { 
    // TODO Auto-generated method stub 
    file = new File(Environment.getExternalStorageDirectory().getAbsoluteFile(),"mmm.txt"); 
    if(file.exists()){ 
     file.delete(); 
    } 
    try { 
     file.createNewFile(); 
    } catch (IOException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 
    try { 
     /*Create a datastream*/ 
     ops = new FileOutputStream(file); 
     bos = new BufferedOutputStream(ops); 
     dos = new DataOutputStream(bos); 
     /*Set sine wave parameter*/ 
     pi = Math.PI; 
     Omega = 2*pi*f/Sample_rate; 

     /*Build instance for audiotrack*/ 
     //AudioTrack at = new AudioTrack(AudioManager.STREAM_MUSIC,Sample_rate, Channel, Encording, Buffersize, AudioTrack.MODE_STREAM); 

     /*build sine wave*/ 
     double[] buffer = new double[samplenumber]; 
     for(int i=0;i<samplenumber;i++){ 
      buffer[i] = Math.sin(Omega*i); 
      dos.writeDouble(buffer[i]); 

     } 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

}

+1

您是否试过关闭流?你正在缓冲,从不关闭它们,数据可能会丢失v –

+0

呃......我很愚蠢,我怎么能忘记关闭它。谢谢!还有一个问题,为什么我在txt文件中获取这些数据是不可读的代码? – MarvinC

+0

因为您使用的是使用二进制格式的'DataOutputStream'。 –

回答

1

的问题是,你不关闭流时,你就大功告成了。他们正在缓冲数据,并且不会在内容被销毁时自动刷新内容,因此所有数据都将丢失。

+0

谢谢!我明白了! – MarvinC

0
  1. 由于您从不关闭输出流,因此您将获得空输出。它是缓冲的,它会保持缓冲,直到你刷新或关闭它。
  2. 由于您打电话给writeDouble(),因此您会收到二进制文件。这就是它的作用。如果您想要字符串,请使用BufferedWriterPrintWriter
  3. 这一切:

    if(file.exists()){ 
        file.delete(); 
    } 
    try { 
        file.createNewFile(); 
    } catch (IOException e1) { 
        // TODO Auto-generated catch block 
        e1.printStackTrace(); 
    } 
    

    不仅是不必要的:它是一种浪费。 new FileOutputStream已经做到了。您将创建文件的开销增加一倍或三倍;你是以非原子的方式做它;而你正在浪费时间和空间。全部删除。

相关问题