我正在制作一個鬧鐘程式,用戶輸入時間,然后播放聲音。但是,我無法找到一種在正確的時間實際播放聲音的簡單方法。關于如何實作這一目標的任何想法?我會提供源代碼
代碼:
package alarmClock;
import java.util.*;
import java.math.*;
import java.io.*;
import java.time.*;
import java.time.format.*;
import javax.sound.sampled.*;
public class AlarmTImer {
public static void main(String[] args) throws UnsupportedAudioFileException, IOException, LineUnavailableException {
Scanner scanner = new Scanner(System.in);
// audio source
File audioFile = new File("C:\\Users\\zayaa\\Documents\\alarm Clock Beeps Sound Effect.wav");
AudioInputStream audioStream = AudioSystem.getAudioInputStream(audioFile);
Clip clip = AudioSystem.getClip();
// String response = scanner.next();
/* clip.open(audioStream);
clip.start(); */
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("HH:mm");
String time = LocalTime.now().format(dtf);
// LocalDateTime currentTime = LocalDateTime.parse(time, dtf);
LocalTime currentTime = LocalTime.parse(time, dtf);
System.out.println(time);
String userInp = "";
System.out.println("Enter hour for alarm (24hr): ");
String hour = scanner.nextLine();
System.out.println("Enter mins for alarm: ");
String mins = scanner.nextLine();
userInp = userInp hour ":" mins;
System.out.println("User inputted: " userInp);
LocalTime userTime = LocalTime.parse(userInp, dtf);
System.out.println();
while (!currentTime.equals(userTime)) {
Duration timeRemaining = Duration.between(currentTime, userTime);
long seconds = timeRemaining.getSeconds(); // no get minutes function
long minutes = ((seconds % 3600) / 60); // conversion
System.out.println("Time remaining: " minutes " mins");
if (currentTime.equals(userTime)) {
System.out.println("The time has come.. ");
clip.open(audioStream);
clip.start();
break;
}
}
}
}
uj5u.com熱心網友回復:
LocalDateTime now = LocalDateTime.now();
LocalDateTime alarm =
LocalDateTime.now()
.withHour(Integer.parseInt(hour))
.withMinute(Integer.parseInt(minute))
.withSecond(0);
long secondsInBetween = Duration.between(now, alarm).getSeconds();
try {
// sleep for milliseconds
Thread.sleep(secondsInBetween * 1000);
// play sound
} catch (InterruptedException e) {
System.err.println("Interrupted!");
}
uj5u.com熱心網友回復:
- 請注意,您實際上從未更新
currentTime,因此條件將始終為假。 - 另請注意,
while回圈中的break條件與條件相同。如果由于某種原因當前時間if在達到嵌套之前更新,您只需離開回圈并結束程式而不觸發警報。 - 您正在使用
time.equals(),因此如果檢查之間的時間已經過去 - 它是無限回圈時間。使用time.isBefore()或time.isAfter()。 - 最后 - 這個程式非常浪費,因為 CPU 一直作業和計算直到鬧鐘時間。請參閱 Udo 的答案以獲得更好的解決方案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/393624.html
標籤:爪哇
