Datei vorhanden, bei Abfrage existiert sie angeblich nicht

Aiwonnie

Mitglied
Hallo!

Ich habe eine Abfrage in meinem Skript, ob eine wav-Datei vorhanden ist (die auch definitiv vorhanden ist). Allerdings existiert sie laut Programm nicht. Kann mir jemand helfen?
(tut mir leid, dass es so viel ist, aber ich habe die Befürchtung, dass der Fehler an irgendeiner Stelle in dem Programm liegt, an der ich ihn gar nicht vermute...)

Danke schonmal!

Yvonne

Quellcode (die entsprechende Abfrage ist fett gekennzeichnet):

import java.awt.*;
import java.awt.Color;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import java.util.Vector;
import java.io.*;

public class Prominence extends JPanel implements ActionListener {


/* Klasse fuer den Startbildschirm
*/
private class StartWindow extends JPanel implements ActionListener {
// Startbildschirm
JTextField _init;
JTextField _alter;
JTextField _sex;
JButton _start;
String _dateiname;
JLabel _begruessung;

// parent window
Prominence _prom;

/* Konstruktor der Klasse StartWindow
*/
public StartWindow(Prominence p) {
_prom = p;

_dateiname = new String("");

setSize(800,600);
setLayout(new GridBagLayout());

// GridLayout
GridBagConstraints c = new GridBagConstraints();


_begruessung = new JLabel("<html><style=\"margin-left:20px;white-space:normal;\">Herzlich Willkommen zum Perzeptionsexperiment!<br><br>Im Folgenden werden Sie jeweils zwei Saetze hoeren, die sich in ihrem Inhalt nicht unterscheiden, <br>wohl aber in ihrer Intonation. Sie koennen sich die Saetze mehrmals anhoeren, indem Sie auf den <br>Button klicken, auf dem der Satz in Orthographie steht. Dort ist auch ein Wort unterstrichen, auf <br>das Sie besonders achten sollen. Ihre Aufgabe ist es, mit dem Balken anzugeben, wie aehnlich <br>sich die Realisierungen des Wortes in den beiden Saetzen sind. <br>Ziehen Sie den Balken ganz nach oben, wenn sie genau gleich prominent sind und ganz nach <br>unten, wenn sie sich sehr unterscheiden. Wenn Sie Ihre Bewertung abegschlossen haben, <br>klicken Sie auf Weiter. <br><br>Viel Erfolg!<br><br><br><br></style></html>");
c.gridx=0;
c.gridy=0;
add (_begruessung,c);

// 2 Eingabefelder fuer die Statistik
JLabel text1 = new JLabel("Geben Sie bitte Ihre Initialen ein: ");
c.gridx=0;
c.gridy=1;
add(text1,c);

JLabel text2 = new JLabel("Geben Sie bitte Ihr Alter ein: ");
c.gridx=0;
c.gridy=2;
add(text2,c);

JLabel text3 = new JLabel ("Geben Sie bitte Ihr Geschlecht an (m oder w): ");
c.gridx=0;
c.gridy=3;
add(text3,c);


_init = new JTextField("",2);
c.gridx=1;
c.gridy=1;
add(_init,c);

_alter = new JTextField("",2);
c.gridx=1;
c.gridy=2;
add(_alter,c);

_sex = new JTextField("",1);
c.gridx=1;
c.gridy=3;
add(_sex,c);


// Beim Klick auf den Startbutton wird das Experiment gestartet
_start = new JButton("Experiment starten");
_start.addActionListener(this);
_start.setActionCommand("start_experiment");
c.gridx=2;
c.gridy=4;
add(_start,c);
}

/* Methoden um die Klassenvariablen auszulesen.
*/
public String Textfeld1Auslesen() {
String initialen = _init.getText();
return initialen;
}

public String Textfeld2Auslesen() {
String alter = _alter.getText();
return alter;
}

public String Textfeld3Auslesen() {
String sex = _sex.getText();
return sex;
}

public String holeDateiname() {
return _dateiname;
}



/* Hier wird der Dateiname aus den Initialen und dem Alter generiert,
die Datei geoeffnet und das Experiment gestartet */
public void actionPerformed(ActionEvent e) {

if("start_experiment".equals(e.getActionCommand())) {

// textfelder auslesen, dateiname generieren
String initialen = Textfeld1Auslesen();
String alter = Textfeld2Auslesen();
String sex = Textfeld3Auslesen();

/* Dateinamen generieren

_dateiname = initialen + new String("_") + alter + new String ("_") + sex + new String(".txt");

try {
FileReader fr = new FileReader(_dateiname);
BufferedReader br = new BufferedReader(fr);
_dateiname = initialen + new String("_") + alter + new String ("_") + sex + new String ("_1") + new String(".txt");
try {
FileReader file = new FileReader(_dateiname);
BufferedReader buffered = new BufferedReader(file);
_dateiname = initialen + new String("_") + alter + new String ("_") + sex + new String("_2") + new String(".txt");
} catch (FileNotFoundException f) {
}
} catch (FileNotFoundException f) {
}

// Der Versuch, eine automatische Indexnummer zu vergeben... ist aufgrund
// mehrerer Fehlermeldungen gescheitert





// experiment starten
_prom.startExperiment();
}
}
};

// Klasse fuer den Schlussbildschirm

private class Thanks extends JPanel implements ActionListener {

// parent window
Prominence _prom;
JLabel _danke;

// Konstruktor der Klasse Thanks

public Thanks(Prominence p) {
_prom = p;

setSize(800,600);
setLayout(new GridBagLayout());

// GridLayout
GridBagConstraints c = new GridBagConstraints();

_danke = new JLabel("<html>Vielen Dank, dass Sie an unserem Experiment teilgenommen haben.<br><br>Wenn Sie Informationen &uuml;ber die Ergebnisse bekommen wollen, schreiben Sie doch eine kurze Mail an: blablablubb@web.de</html>");
c.gridx=0;
c.gridy=0;
add(_danke,c);


JButton _schliessen = new JButton("Fenster schliessen");
_schliessen.setActionCommand("CLOSE");
_schliessen.addActionListener(this);
c.gridx=0;
c.gridy=1;

add(_schliessen,c);
}

public void actionPerformed(ActionEvent e) {
String command = e.getActionCommand();
System.exit(0);

}

}



// Experiment
private class Experiment extends JPanel implements ActionListener {

// Das Experiment-Design besteht aus dem Slider (von 0-100), dem Satz-Button und dem Weiter-Button
JSlider _slider;
JButton _satz;
JButton _weiter;

Prominence _prom;

/* Es werden zwei Vektoren erstellt, in die im Experiment aus der Datei test_description die wav-Files und die
zugehoerigen Saetze eingelesen werden
current_wav ist hierbei die aktuelle wav-Datei, deren zugeordneter Satz auf dem Satz-Button erscheint */

Vector _wav_files;
Vector _sentences;
Vector _bewertung;
int _current_wav;

// Konstruktor
public Experiment(Prominence p)
{
_prom = p;

_wav_files = new Vector();
_sentences = new Vector();
_bewertung = new Vector();
_current_wav = 0;

// datei mit zuordnung wav->Satz einlesen
readExperimentDescription("test_description.txt");

// Button mit erstem satz und erster datei initialisieren

setSize(800,600);
setLayout(new GridBagLayout());

GridBagConstraints c = new GridBagConstraints();

// Beim Klick auf den Satz-Button wird die wav-Datei erneut abgespielt
_satz = new JButton((String)_sentences.elementAt(_current_wav));
_satz.setActionCommand("play_again");


c.weightx = 1.0;
c.gridx = 1;
c.gridy = 0;
add(_satz,c);

// Erstellung des Silders

_slider = new JSlider(JSlider.VERTICAL,0,100,50);
_slider.setBackground(Color.WHITE);
c.gridx=1;
c.gridy=1;
add(_slider,c);


/* Der Slider geht von 0 bis 100, Default ist 50. Auf diesen Wert wird er beim Klick auf den
Weiter-Button zurueckgestellt.
Der Wert, den die VP angegeben hat, wird in eine Datei gespeichert. */
_slider.setMajorTickSpacing(100);
_slider.setPaintTicks(true);

// Label Table wird erstellt
Hashtable labelTable = new Hashtable();
labelTable.put( new Integer( 0 ), new JLabel("Kein Unterschied") );
labelTable.put( new Integer( 100 ), new JLabel("Maximaler Unterschied") );
_slider.setLabelTable( labelTable );

_slider.setPaintLabels(true);

_weiter = new JButton("Weiter");
_weiter.setActionCommand("weiter");

c.gridx=2;
c.gridy=2;
add(_weiter,c);

_weiter.addActionListener(this);
_satz.addActionListener(this);
}

// Skript zum Abspielen der wav-Dateien
public void playCurrentWav() {
new AePlayWave((String)_wav_files.elementAt(_current_wav)).start();
}

// Die Textdatei, in der die wav-Dateien und die Saetze aufgelistet sind, wird eingelesen
public void readExperimentDescription(String filename) {

try {
BufferedReader in = new BufferedReader(new FileReader(filename));
String str;

while ((str = in.readLine()) != null) {

String[] splitted = str.split(" ",2);

/* Vektor _wav_files enthaelt das erste Element der Datei (Dateiname),
Vektor _sentences das zweite Element (Satz) */
_wav_files.addElement(splitted[0]);
_sentences.addElement(splitted[1]);
}
in.close();

} catch (IOException e) {
}
}

// Methoden zum Aufrufen der Bewertungen und der Wav-Dateien (als Strings)
public Vector holeBewertung() {
return _bewertung;
}

public Vector holeWavDateien () {
return _wav_files;
}

public void actionPerformed(ActionEvent e) {

// Beim Klick des Benutzers auf "Weiter"
if("weiter".equals(e.getActionCommand())) {

// Wenn die letzte Wav-Datei erreicht ist
if(_wav_files.size()-1 == _current_wav) {

int value = _slider.getValue();
// letzte Bewertung noch speichern, dann
_bewertung.addElement(value);

// Ende erreicht, mach nix mehr
_prom.startThanks();
// loese speichern aus
_prom.speichereErgebnis();
return;
}

// Wenn das Ende noch nicht erreicht ist...
_current_wav = _current_wav + 1;
System.out.println(_current_wav + System.getProperty("line.separator"));

// slider wert abfragen, in vector speichern
int value = _slider.getValue();
_bewertung.addElement(value);

// slider resetten
_slider.setValue(50);


// neue wav-datei laden(Dateiname aus array auslesen), satz aendern

boolean exists = (new File("_wav_files_elementAt(_current_wav)")).exists();
if (exists) {
System.out.println("existiert" + System.getProperty("line.separator"));
// File or directory exists
} else {
System.out.println("existiert nicht" + System.getProperty("line.separator"));
// File or directory does not exist
}


}

// Klick des Benutzers auf den Button, auf dem der Satz steht
else if("play_again".equals(e.getActionCommand())) {
// wav-datei oeffnen und abspielen
playCurrentWav();

}
}
};

Experiment _exp;
StartWindow _start_window;
Thanks _thanks;

public Prominence(){
setSize(800,600);
_exp = new Experiment(this);
_start_window = new StartWindow(this);
_thanks = new Thanks(this);

add(_start_window);
}



public void showStartWindow()
{
_start_window.setVisible(true);
}

public void hideExperiment()
{
//_exp.setVisible(false);
}

public void startExperiment()
{
_start_window.setVisible(false);
add(_exp);
_exp.setVisible(true);
_exp.playCurrentWav();
}

// Der Schlussbildschirm wird nach der Bewertung der letzten Audiodatei aufgerufen
public void startThanks()
{
_exp.setVisible(false);
add(_thanks);
_thanks.setVisible(true);

}

// Im Vektor bewertung befinden sich alle Bewertungen der Audiodateien
public void speichereErgebnis() {
String datei = _start_window.holeDateiname();
Vector bewertung = _exp.holeBewertung();
Vector wav = _exp.holeWavDateien();

// BufferedWriter fuer die Datei oeffnen


// fuer jedes Element des Bewertungsvektors
for(int k=0; k < bewertung.size(); ++k) {
// schreibe index und bewertung in die datei
try {
BufferedWriter bw = new BufferedWriter (new FileWriter (datei, true));


// Ausgabeformat: Index-Dateiname der wav-Datei-Bewertung der wav-Datei (Zeilenumbruch)
bw.write(k + "-" + wav.elementAt(k) + "-" + bewertung.elementAt(k) + System.getProperty("line.separator"));
bw.close();
//}

}
catch (IOException f) {
}
}
}

public void windowClosing(WindowEvent e) {
System.exit(0);
}
public void actionPerformed(ActionEvent e) {
System.out.println("Action start window");
_start_window.actionPerformed(e);
System.out.println("Action experiment window");
_exp.actionPerformed(e);
}

private static void createAndShowGUI() {

//Create and set up the window.
JFrame frame = new JFrame("ProminenceDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

//Create and set up the content pane.
Prominence newContentPane = new Prominence();
//newContentPane.addActionListener(this);

newContentPane.setMinimumSize(new Dimension(800,600));
newContentPane.setMaximumSize(new Dimension(800,600));
newContentPane.setPreferredSize(new Dimension(800,600));
newContentPane.showStartWindow();
newContentPane.hideExperiment();
newContentPane.setOpaque(true); //content panes must be opaque
newContentPane.setBackground(Color.WHITE);
frame.setContentPane(newContentPane);

//Display the window.
frame.pack();
frame.setVisible(true);
}
public static void main(String argv[]) {

createAndShowGUI();

//ButtonEx1 be = new ButtonEx1();
}

}
 
Hi,
habe mir zwar nicht alles durchgelesen, aber das werd ich denk ich gleich machen
hast du mal im debuger nachgeschaut wann der fehler genau auftritt
und in folgendem "abschnitt":

_dateiname = initialen + new String("_") + alter + new String ("_") + sex + new String(".txt");

try {
FileReader fr = new FileReader(_dateiname);
BufferedReader br = new BufferedReader(fr);
_dateiname = initialen + new String("_") + alter + new String ("_") + sex + new String ("_1") + new String(".txt");
try {
FileReader file = new FileReader(_dateiname);
BufferedReader buffered = new BufferedReader(file);
_dateiname = initialen + new String("_") + alter + new String ("_") + sex + new String("_2") + new String(".txt");
} catch (FileNotFoundException f) {
}
} catch (FileNotFoundException f) {
}

hast da ma reingeschaut ob der dateipfad richtig generiert wird?



//Änderung: [Dazu geschriebenes^^]

/* Dateinamen generieren

[Du generierst hier doch in _dateiname schon die initialen ect oder seh ich das falsch? und im try block hängst du an die variable _dateiname, welche mittlerweile aus den folgendem besteht:initialen + new String("_") + alter + new String ("_") + sex + new String(".txt") das ganze nochmal dran könnte da der fehler liegen?]


_dateiname = initialen + new String("_") + alter + new String ("_") + sex + new String(".txt");

try {
FileReader fr = new FileReader(_dateiname);
BufferedReader br = new BufferedReader(fr);
_dateiname = initialen + new String("_") + alter + new String ("_") + sex + new String ("_1") + new String(".txt");
try {
FileReader file = new FileReader(_dateiname);
BufferedReader buffered = new BufferedReader(file);
_dateiname = initialen + new String("_") + alter + new String ("_") + sex + new String("_2") + new String(".txt");
} catch (FileNotFoundException f) {
}
} catch (FileNotFoundException f) {
}
 
Zuletzt bearbeitet:
Danke für deine Antwort!

Allerdings habe ich mit der Datei, in die geschrieben werden soll, keinerlei Probleme...
Die wird einwandfrei geschrieben und wenn ich nicht überprüfe, ob die wav-Dateien vorhanden sind, das also einfach übergehe (die if-Verzweigung im fett gedruckten Teil weglasse), dann
werden auch die Dateinamen und die Bewertungen in die Textdatei geschrieben.

Und ich denke, es ist kein Fehler, den der Debugger finden würde, da es eher was semantisches denn was syntaktisches ist. Das Programm läuft, nur leider nicht so, wie ich das gerne hätte ;-)

Genauer gesagt: Zum Test habe ich eine wav-Datei gelöscht. Meine Test-Ausgabe in die Kommandozeile gibt mir aus, dass keine Datei (außer der ersten) vorhanden ist.
(obwohl wie gesagt, alle vorhanden sind, außer einer).

Ich hoffe, ich bin nicht zu kryptisch ;-)

lg Yvonne
 
Naja mir ist dein code oben was zu unübersichtlich ^^
hast es eventuell schonmal mit der komplett pfadangabe versucht? sprich c://.... usw.
ich schau gleich nochmal drüber, aber deine aussage eben hat mich verwirrt^^

also du hast 2 wav dateien?
der greift auch mim richtigen namen/pfad auf die dateien zu?
aber er sagt dann ne die gibbet nit?
macht der das bei beiden oder nur bei einer?

und das mim debuger war so gemeint um zu sehen ob der auch z.b. die richtigen pfadangaben ect hat ;) wenn nein dann ists klar das er die nit läd
 
Sorry für den Monstercode, dachte nur ,dass es sinnvoll wäre, alles zu posten, nicht dass gerade die Fehlerquelle fehlt.

Die Pfade stimmen alle...

Ich versuchs mal zusammenzufassen:
Das Programm besteht aus Startfenster, einem Objekt für die wav-Dateien (das pro Datei neu erzeugt wird) und einem Schlussbildschirm.
Probleme bereitet nur das Objekt für die wav-Dateien.
Das ist so aufgebaut, dass beim Aufruf die Datei und ein zugehöriger Text aus einer Textdatei eingelesen werden. Die wav-Datei wird abgespielt und der Text steht auf einem Button, der, wenn man ihn klickt, die Datei erneut abspielt.

Problem:
Dei wav-Dateien werden alle abgespielt (außer die, die tatsächlich nicht existiert, das ist übrigens die dritte). Bei der ersten wav-Datei wird auch der Text auf dem Button richtig dargestellt. Ab der zweiten steht auf dem Button "wav-file not found", obwohl hier auch noch die Datei abgespielt wird. Der Button-Text ändert sich auch nicht mehr, das heißt, er lautet bis zur fünften (und letzten) Datei so. Wie gesagt, obwohl nur die dritte nicht existiert.

Den Quelltext hierzu hatte ich auskommentiert, da das andere zum Testen einfacher war, hier ist er (steht im Original-Quelltext genau an der Stelle des fett gedruckten):


boolean exists = (new File("_wav_files.elementAt(_current_wav)")).exists();
if (exists) {
_satz.setText((String)_sentences.elementAt(_current_wav));
playCurrentWav();
} else {
_satz.setText((String)"sound file not found");
_wav_files.setElementAt(new String("sound file not found"),_current_wav);

}

lg Yvonne
 
boolean exists = (new File("_wav_files.elementAt(_current_wav)")).exists();
if (exists) {
_satz.setText((String)_sentences.elementAt(_current_wav));
playCurrentWav();
} else {
_satz.setText((String)"sound file not found");
_wav_files.setElementAt(new String("sound file not found"),_current_wav);

}

bei dem text steht also nachher auf dem button sound file not found (ab file 2 durchgehend) file 3 existiert nicht und sonst alle.
was genau bewirkt :
_wav_files.setElementAt(new String("sound file not found"),_current_wav);
?
läd der denn auch die wav files 4 und 5 bzw spielt sie korrekt ab?
 
bei dem text steht also nachher auf dem button sound file not found (ab file 2 durchgehend) file 3 existiert nicht und sonst alle.
was genau bewirkt :
_wav_files.setElementAt(new String("sound file not found"),_current_wav);
?
läd der denn auch die wav files 4 und 5 bzw spielt sie korrekt ab?


Genau. Er spielt alle korrekt ab, bis auf die Date, die ich gelöscht habe (die dritte in der eingelesenen Textdatei). Die Zeile oben schreibt den String "sound file not found" in den Vektor, in dem die wav-Dateien als Strings stehen, damit man in der Ausgabedatei sieht, wo der Fehler passiert ist und diese Datei aus der Auswertung rausnimmt.
Ansonsten hätte man eine falsche Bewertung (weil die Versuchsperson die Datei ja gar nicht gehört hat) und würde es nicht mal merken.

lg Yvonne
 
was ich nicht verstehe das beim zweiten button ja schon sound not found drinn steht :-/
das müsst ja erst beim dritten stehen. wenn die vierte datei abgespielt wird steht es immernoch da richtig?
mir gehen die ideen aus ^^ eventuell könnts am array liegen aus dme du die dateien holst

boolean exists = (new File("_wav_files.elementAt(_current_wav)")).exists();

oder das _current_wav nicht korrekt hoch gezählt wird nachdem der fehler auftrat, weil sonst müsst der ja wieder den datei namen anzeigen im button und nich sound not found...
hmmmmm mehr fällt mir auch nich ein ^^ muss nun auch ma mittag machen und danach an meinen sachen weiter basteln :-/ schad das ich nit helfne konnt
viel erfolg noch
Gruß der Praktikant
 
Danke trotzdem!

Der Zähler zählt richtig, das habe ich überprüft.
Naja, genau da hänge ich ja auch. Ich denke, dass es irgendwie an der Struktur liegt, da das Programm keinen Unterschied macht zwischen Dateien, die existieren und welchen, die nicht existieren.
Wenn ich den Zähler ausgeben lasse, nachdem er sich um 1 erhöht, fängt die Ausgabe erst mit 1 an, nicht mit 0. Ich denke, dass es damit zusammenhängt, dass die erste Datei woanders aufgerufen wird (genau den Teil hatte mir aber mein Freund programmiert, d.h. da blicke ich nicht ganz durch). Das würde auch erklären, wieso die erste Datei und der Button-Text noch normal eingebunden werden...

lg Yvonne
 
Formatiert doch euren Code bitte mit den zur Verfügung stehenden
[code=java]
...
[/code]
Tags.
 

Neue Beiträge

Zurück