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;
}
});
从小程序写入文件并非不可能,如果小程序已签名并且具有正确的安全权限,则它可以访问文件系统。