Java 在Applet程序中使用可运行接口?

Java 在Applet程序中使用可运行接口?,java,multithreading,applet,Java,Multithreading,Applet,我正在开发录音小程序。下面是代码 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 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());
        }
    }
  }
import java.applet.*;
导入java.awt.*;
导入java.awt.event.*;
导入java.io.IOException;
导入java.io.File;
导入javax.sound.sampled.DataLine;
导入javax.sound.sampled.TargetDataLine;
导入javax.sound.sampled.AudioFormat;
导入javax.sound.sampled.AudioSystem;
导入javax.sound.sampled.AudioInputStream;
导入javax.sound.sampled.LineUnavailableException;
导入javax.sound.sampled.AudioFileFormat;
/* */
公共类PlaySoundApplet扩展小程序实现ActionListener,Runnable
{
私有易失性线程PlaySound=null;
目标数据线m_线;
AudioFileFormat。键入m_targetType;
音频输入流m_音频输入流;
文件m_输出文件;
按钮播放、停止、录制;
音频剪辑;
播放声音记录器;
可运行r;
公共播放声音小程序(TargetDataLine行,AudioFileFormat.Type targetType,文件文件)
{
m_线=线;
m_targetType=targetType;
m_outputFile=文件;
m_audioInputStream=新的audioInputStream(线路);
}
公共播放声音小程序()
{
}
公共void init()
{
记录器=空;
播放=新按钮(“循环播放”);
添加(播放);
play.addActionListener(这个);
停止=新按钮(“停止”);
添加(停止);
stop.addActionListener(this);
记录=新按钮(“记录”);
添加(记录);
Record.addActionListener(这个);
audioClip=getAudioClip(getCodeBase(),“sample.wav”);
}
已执行的公共无效行动(行动事件ae)
{
按钮源=(按钮)ae.getSource();
if(source.getLabel()=“在循环中播放”)
{
音频剪辑。播放();
}
else if(source.getLabel()=“停止”)
{
audioClip.stop();
}
else if(source.getLabel()=“记录”)
{
System.out.println(“调试1”);
字符串strFilename=“D:\\krishna\\sample.wav”;
File outputFile=新文件(strFilename);
System.out.println(“调试2”);
AudioFormat AudioFormat=新的AudioFormat(AudioFormat.Encoding.PCM_SIGNED,44100.0F,16,2,4,44100.0F,false);
DataLine.Info=newdataline.Info(TargetDataLine.class,audioFormat);
TargetDataLine TargetDataLine=null;
尝试
{
targetDataLine=(targetDataLine)AudioSystem.getLine(info);
targetDataLine.open(音频格式);
}
捕获(LineUnavailableException e)
{
System.out.println(“无法获取记录行”);
e、 printStackTrace();
系统出口(1);
}
AudioFileFormat.Type targetType=AudioFileFormat.Type.WAVE;
System.out.println(“调试3”);
PlaySoundApplet另一个=新的PlaySoundApplet(targetDataLine、targetType、outputFile);
新线程(另一个).start();
}
}
公开募捐
{
尝试
{
System.out.println(“调试5”);
写入(m_audioInputStream、m_targetType、m_outputFile);
}
捕获(例外e)
{
System.out.println(e.getMessage());
}
}
}
这个程序可以很好地进行回放。 但在录制时,它应该同时写入sample.wav文件。 我哪里做错了

谢谢


krishna试图从小程序写入文件-它是沙盒。

您需要将文件代码包装在特权代码块中,默认情况下,您需要在沙盒中获取文件i.o.权限,以便通过accesscontroller调用

这里有一个例子

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

从小程序写入文件并非不可能,如果小程序已签名并且具有正确的安全权限,则它可以访问文件系统。