2009-08-27 58 views
-1

我是對發展錄音applet.Here是代碼在Applet程序中使用Runnable接口?

import java.applet.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.io.IOException; 
import java.io.File; 
import javax.sound.sampled.DataLine; 
import javax.sound.sampled.TargetDataLine; 
import javax.sound.sampled.AudioFormat; 
import javax.sound.sampled.AudioSystem; 
import javax.sound.sampled.AudioInputStream; 
import javax.sound.sampled.LineUnavailableException; 
import javax.sound.sampled.AudioFileFormat; 

/*<applet code="PlaySoundApplet.class" height=400 width=400></applet> */ 
public class PlaySoundApplet extends Applet implements ActionListener,Runnable 
{ 
    private volatile Thread PlaySound = null; 
    TargetDataLine  m_line; 
    AudioFileFormat.Type m_targetType; 
    AudioInputStream m_audioInputStream; 
    File   m_outputFile; 
    Button play,stop,Record; 
    AudioClip audioClip; 
    PlaySoundApplet recorder; 
     Runnable r; 

    public PlaySoundApplet(TargetDataLine line,AudioFileFormat.Type targetType,File file) 
    { 
     m_line=line; 
     m_targetType = targetType; 
     m_outputFile = file; 
     m_audioInputStream = new AudioInputStream(line); 
    } 
    public PlaySoundApplet() 
    { 

    } 


    public void init() 
    { 
    recorder = null; 
    play = new Button(" Play in Loop "); 
    add(play); 
    play.addActionListener(this); 
    stop = new Button(" Stop "); 
    add(stop); 
    stop.addActionListener(this); 
    Record = new Button("Record"); 
    add(Record); 
    Record.addActionListener(this); 
    audioClip = getAudioClip(getCodeBase(), "sample.wav"); 
    } 

    public void actionPerformed(ActionEvent ae) 
    { 
    Button source = (Button)ae.getSource(); 
    if (source.getLabel() == " Play in Loop ") 
    { 
     audioClip.play(); 
    } 
    else if(source.getLabel() == " Stop ") 
    { 
     audioClip.stop(); 
    } 
    else if(source.getLabel() == "Record") 
    { 
     System.out.println("debug 1"); 
     String strFilename = "D:\\krishna\\sample.wav"; 
     File outputFile = new File(strFilename); 
     System.out.println("debug 2"); 
     AudioFormat audioFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,44100.0F, 16, 2, 4, 44100.0F, false); 
     DataLine.Info info = new DataLine.Info(TargetDataLine.class, audioFormat); 
     TargetDataLine targetDataLine = null; 
     try 
     { 
      targetDataLine = (TargetDataLine) AudioSystem.getLine(info); 
      targetDataLine.open(audioFormat); 
     } 
     catch (LineUnavailableException e) 
     { 
      System.out.println("unable to get a recording line"); 
      e.printStackTrace(); 
      System.exit(1); 
     } 
     AudioFileFormat.Type targetType = AudioFileFormat.Type.WAVE; 
     System.out.println("debug 3"); 
     PlaySoundApplet another = new PlaySoundApplet(targetDataLine,targetType,outputFile); 
     new Thread(another).start(); 
     } 
    } 
    public void run() 
    { 
    try 
     { 
     System.out.println("debug 5"); 
     AudioSystem.write(m_audioInputStream,m_targetType,m_outputFile); 
     } 
     catch(Exception e) 
     { 
      System.out.println(e.getMessage()); 
     } 
    } 
    } 

這個程序發揮正常工作了。 但是,記錄時應該同時寫入sample.wav文件。 我在哪裏做錯了?

感謝

克里希納

+0

感謝安迪白色 – krishnakumar 2009-08-27 04:56:25

回答

0

您需要將文件代碼包裝在特權代碼塊中,默認情況下您在沙箱中獲取文件i.o.您需要通過訪問控制器調用該調用的權限。

這裏是一個例子。

final String location = "D:\\krishna\\sample.wav" 
File f = (File) AccessController.doPrivileged(new PrivilegedAction() 
    { 
     public Object run() 
     { 
      File outputFile = new File(location); 
      return outputFile; 
     } 
    }); 
0

試圖寫從applet文件 - 它的沙盒。

+1

從寫一個小程序文件是不可能的,如果applet簽名並擁有正確的安全權限,那麼它可以訪問該文件suystem。 – Jesper 2009-08-27 07:34:08

+0

我已經簽了這個小程序 – krishnakumar 2009-08-28 08:12:18