Verketten von Strings funktioniert nicht

Guten Abend zusammen,

ich möchte gerne ein Programm entwickeln, mit dem ich anhand von IDTags Informationen aus MP3 Dateien auslese und anhand dieser Informationen die MP3 Datei umbenenne. Dabei habe ich ein Problem bei einer eigentlich simplen Stringverkettung.

Der Code der Starterklasse:
Java:
package sebastian;

import java.io.File;
import java.io.IOException;

import MP3.IdTagAuslesen;

public class Starter {
  
    public static void main(String[] args) throws IOException {  
      
        String pfad = "/home/sebastian/test.mp3";  
      
        IdTagAuslesen idTagger = new IdTagAuslesen();
        idTagger.auslesen(pfad);

        File k = new File(pfad);
        String name = k.getName();
        String pfadroot = k.getParent();
        String interpret = idTagger.Interpret;
        String titel = idTagger.Titel;
      
        String finalname = pfadroot + "/" + interpret + " - " + titel + ".mp3";
        String finalname2 = interpret.concat(titel);
        String finalname3 = pfadroot + "/" + "Guns N' Roses" + " - " + "Knockin' On Heavens Door" + ".mp3";
        String finalname4 = pfadroot + "/" + idTagger.Interpret + " - " + idTagger.Titel + ".mp3";
      
      
        System.out.println(interpret);
        System.out.println(titel);
        System.out.println(idTagger.Interpret);
        System.out.println(idTagger.Titel);
        System.out.println("finalname : " + finalname);
        System.out.println("finalname2: " + finalname2);
        System.out.println("finalname3: " + finalname3);
        System.out.println("finalname4: " + finalname4);
      
        File file = new File(finalname);
      
        k.renameTo(file);      
    }
}

Dieses Programm gibt folgendes auf der Console aus:
Code:
Guns N' Roses
Knockin' On Heavens Door
Guns N' Roses
Knockin' On Heavens Door
finalname : /home/sebastian/Guns N' Roses
finalname2: Guns N' Roses
finalname3: /home/sebastian/Guns N' Roses - Knockin' On Heavens Door.mp3
finalname4: /home/sebastian/Guns N' Roses

Wie man hier schön sieht, schlägt jedesmal sobald die Attribute Titel und Interpret aus dem Objekt idTagger verwendet werden, die Verkettung der einzelnen String fehl (finalname, finalname2 und finalname4). Nur bei finalname3 funktioniert es, wo Titel und Interpret nicht aus den Attributen des Objekts bezogen werden.

Die Klasse IdTagAuslesen() aus der das Objekt idTagger gebildet wird sieht folgendermaßen aus:

Java:
package MP3;

import java.io.FileInputStream;
import java.io.IOException;

public class IdTagAuslesen
{
    public String Titel;
    public String Interpret;
   
    public void auslesen (String filename)
    {
        FileInputStream fis = null;
        long groesseMB3 = 0;
        byte bTAG [] = new byte [3];
        byte bTitel [] = new byte [30];
        byte bInterpret [] = new byte [30];
        byte bCDTitel [] = new byte [30];
        byte bJahr [] = new byte [4];
        byte bKommentar [] = new byte [30];
        byte bGenre = 0;
               
        try
        {
            // filename = in.nextLine();
            fis = new FileInputStream(filename);
            groesseMB3 = fis.available();
            //Datensatzzeiger positionieren
            fis.skip(groesseMB3-128);
            fis.read(bTAG); //TAG lesen
            String strTAG = new String(bTAG);
            fis.read(bTitel); //Titel lesen
            String strTitel = new String(bTitel);
            fis.read(bInterpret);//Interpret lesen
            String strInterpret = new String(bInterpret);
            fis.read(bCDTitel);//CDTietel lesen
            String strCDTitel = new String(bCDTitel);
            fis.read(bJahr);//Jahr lesen
            String strJahr = new String(bJahr);
            fis.read(bKommentar);//Kommentar lesen
            String strKommentar = new String(bKommentar);
            bGenre = (byte)fis.read();//Genre lesen
           
            this.Titel = new String(bTitel);
            this.Interpret = new String(bInterpret);
           
            /*
            System.out.println("Dateigroesse: " + groesseMB3);
            System.out.println("Tag: " + strTAG);
            System.out.println("Titel: " + strTitel);
            System.out.println("Interpret: " + strInterpret);
            System.out.println("CD-Titel: " + strCDTitel);
            System.out.println("Jahr: " + strJahr);
            System.out.println("Kommentar: " + strKommentar);
            System.out.println("Genre: " + bGenre);
            */
           
            fis.close();
        }
        catch (IOException err)
        {
            System.out.println("Fehler: " + err);
        }    
    }
}

Was mache ich hier falsch, so dass ich die Attribute des Objekts idTagger nicht verwenden kann? Vielen Dank und viele Grüße!
 

Enceladus271

Bekanntes Mitglied
Ich vermute Folgendes:

Für den Titel ließt du z.B. 30 bytes aus. Der Titel ist aber gar nicht so lang. Das heißt das Byte-Array bTitel hat hinten nur Nullen stehen. Wenn man daraus einen String erzeugt können diese Nullen nicht interpretiert werden. Das könnte zu Problemen bei der Konkatenation führen.

Versuch mal den String nur aus denjenigen bytes zu erzeugen die ungleich 0 sind:
Java:
      int titelByteCount = 0;
       while (titelByteCount < bTitel.length && bTitel[titelByteCount] != 0) {
         titelByteCount++;
       }

       int interpretByteCount = 0;
       while (interpretByteCount < bInterpret.length && bInterpret[interpretByteCount] != 0) {
         interpretByteCount++;
       }

       this.Titel = new String(bTitel, 0, titelByteCount);
       this.Interpret = new String(bInterpret, 0, interpretByteCount);
 

Schesam

Bekanntes Mitglied
DU könntest dir auch für sowas (wie ich es in unserem Musik-Player gemacht habe) den MPEgAudioFileReader von der JLayer API benutzen und dann direkt die Werte auslesen, damit müsstest du dich mit sowas nicht rumärgern, zudem nichtmal gegeben ist, das der ID3-Tag immer so aufgebaut ist.

Als Anregung ein Konstruktor aus der Klasse:

Java:
 public Song(File audioFile) throws UnsupportedAudioFileException, IOException {
        this.audioFile = audioFile;
        try {
            if (audioFile.getName().endsWith(".mp3")) {
                properties = new MpegAudioFileReader().getAudioFileFormat(audioFile).properties();
                if (properties != null) {
                    this.title = (String) properties.get("title");
                    this.interpret = (String) properties.get("author");
                    this.album = (String) properties.get("mp3.id3tag.orchestra");
                    this.date = (String) properties.get("date");
                    this.id3TagTrack = (String) properties.get("mp3.id3tag.track");
                    this.genre = (String) properties.get("mp3.id3tag.genre");
                    this.discography = (String) properties.get("mp3.id3tag.disc");
                    this.composer = (String) properties.get("mp3.id3tag.composer");
                    this.id3TagGrouping = (String) properties.get("mp3.id3tag.grouping");
                    this.id3TagEncoded = (String) properties.get("mp3.id3tag.encoded");
                    this.publisher = (String) properties.get("mp3.id3tag.publisher");
                    this.id3TagLength = (String) properties.get("mp3.id3tag.length");
                    this.channels = (int) properties.get("mp3.channels");
                    this.mPegVersion = Integer.parseInt(
                            (String) properties.get("mp3.version.mpeg"));
                    this.framesize = (int) properties.get("mp3.framesize.bytes");
                    this.mp3VersionLayer = Integer.parseInt(
                            (String) properties.get("mp3.version.layer"));
                    this.frameLength = (int) properties.get("mp3.length.frames");
                    this.bitrate = (int) properties.get("mp3.bitrate.nominal.bps");
                    this.encoding = new AudioFormat.Encoding(
                            (String) properties.get("mp3.version.encoding"));
                    this.id3TagV2 = (ByteArrayInputStream) properties.get("mp3.id3tag.v2");
                    this.id3TagV2Version = (String) properties.get("mp3.id3tag.v2.version");
                    this.padding = (boolean) properties.get("mp3.padding");
                    this.byteLength = (int) properties.get("mp3.length.bytes");
                    this.frameRate = Double.parseDouble(
                            Float.toString((float) properties.get("mp3.framerate.fps")));
                    this.frameRate = (Float) properties.get("mp3.framerate.fps");
                    this.duration = (long) properties.get("duration");
                    this.frequency = (int) properties.get("mp3.frequency.hz");
                    this.headerPos = (int) properties.get("mp3.header.pos");
                    this.comment = (String) properties.get("comment");
                    this.original = (boolean) properties.get("mp3.original");
                }
            } else if (audioFile.getName().endsWith(".wav")) {
                AudioFileFormat affmt = AudioSystem.getAudioFileFormat(audioFile);
                AudioFormat fmt = affmt.getFormat();
                properties = fmt.properties();
                if (properties == null || properties.isEmpty()) {
                    properties = affmt.properties();
                }
                System.out.println("Properties empty: " + properties.isEmpty());
                try (Clip clip = AudioSystem.getClip()) {
                    clip.open(AudioSystem.getAudioInputStream(new AudioFormat(
                            fmt.getSampleRate(),
                            16,
                            fmt.getChannels(),
                            true,
                            fmt.isBigEndian()), AudioSystem.getAudioInputStream(audioFile)));
                    this.duration = clip.getMicrosecondLength();
                    this.title = audioFile.getName().substring(
                            0, audioFile.getName().lastIndexOf('.'));
                    this.framesize = fmt.getFrameSize();
                    this.channels = fmt.getChannels();
                    this.frameRate = fmt.getFrameRate();
                    this.bitrate = fmt.getSampleSizeInBits();
                    this.encoding = fmt.getEncoding();
                }
            } else {
                throw new UnsupportedAudioFileException("Unsupported Audiofile: " + audioFile);
            }
        } catch (UnsupportedAudioFileException | IOException ex) {
            System.err.println(audioFile + " ist keine gültige Audio-Datei!");
            throw ex;
        } catch (LineUnavailableException ex) {
            throw (UnsupportedAudioFileException) new UnsupportedAudioFileException(
                    "Unsupported Audiofile: " + audioFile).initCause(ex);
        }
    }

Und dann hat diese Klasse noch andere Konstruktoren mit ner URL... und eben Getter für die einzelnen Attribute. Hat bei uns problemlos funktioniert (Steht ein gewisser Wert nicht in der Datei, werden die jeweiligen getter Standardwerte wie einen leeren String oder 0/false zurückgeben)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Verketten, Aneinanderreihen von Strings Java Basics - Anfänger-Themen 2
N Strings verketten Java Basics - Anfänger-Themen 3
M Verketten von Formularfelder im PDF-Formular Java Basics - Anfänger-Themen 0
P Java Verketten von Stream - Bedeutung der Anweisungen? Java Basics - Anfänger-Themen 3
Kenan89 Methodenaufrufe verketten Java Basics - Anfänger-Themen 16
O Variablennamen verketten Java Basics - Anfänger-Themen 16
S Konstruktoren verketten Java Basics - Anfänger-Themen 6
Developer_X jede Zeile einer Datei mit einem String verketten Java Basics - Anfänger-Themen 16
W Gleichzeitiges ersetzen mehrerer Strings Java Basics - Anfänger-Themen 7
R Datentypen Das Verhalten von Strings als Datentypen Java Basics - Anfänger-Themen 7
N Nachkommastellen von Strings Java Basics - Anfänger-Themen 3
T Strings unveränderlich???? Java Basics - Anfänger-Themen 22
B Alle Strings bis zu einer Maimallänge aufzählen, die Bedingung erfüllen Java Basics - Anfänger-Themen 13
S Die durchschnittliche Länge der Strings Java Basics - Anfänger-Themen 11
M Operatoren Strings mit Vergleichsoperatoren, funktioniert das? Java Basics - Anfänger-Themen 9
S Variablen Letzte Zeile eines Strings entfernen Java Basics - Anfänger-Themen 1
D Strings aus Excel-Datei einlesen Java Basics - Anfänger-Themen 2
P9cman Tipps für Rekursive Aufgaben mit Strings oder allgemein Java Basics - Anfänger-Themen 2
sserio StringBuilder und Strings Java Basics - Anfänger-Themen 8
J Größe eines Strings in Pixel Java Basics - Anfänger-Themen 18
schredder Strings und reguläre Ausdrücke - Methode mit return string.matches Java Basics - Anfänger-Themen 5
B Konkatenieren eines Strings und inkremtierenden Zahl zu einer INT Variablen Java Basics - Anfänger-Themen 7
N Strings verpflechten Java Basics - Anfänger-Themen 4
G Strings auf Gleichheit prüfen - Aufgabe vom Prof. Java Basics - Anfänger-Themen 5
A 2 Strings vergleichen in einer methode wenn man mit Globalen variablen arbeitet Java Basics - Anfänger-Themen 12
L Strings aneinanderhängen Java Basics - Anfänger-Themen 2
M Strings vergleichen Java Basics - Anfänger-Themen 10
Nerdinfekt BMI Rechner, fehler beim Zurückgeben des Strings? Java Basics - Anfänger-Themen 2
U Problem mit dem initialisieren meines Strings in einer Schleife Java Basics - Anfänger-Themen 5
S 2 Strings mit Equals vergleichen Java Basics - Anfänger-Themen 11
Q Besitzen zwei Strings identische Buchstaben, nur in anderer Reihenfolge? Java Basics - Anfänger-Themen 10
marcooooo Separator zwischen allen Zeichen eines Strings einfügen Java Basics - Anfänger-Themen 29
C Ternärer Operator mit Strings Java Basics - Anfänger-Themen 3
M Wie kann ich bei int-Variablen im exception handler auf bestimmte Strings reagieren? Java Basics - Anfänger-Themen 5
M Strings mit gerader und ungerader Länge ausgeben Java Basics - Anfänger-Themen 10
J Alle Werte eines Strings zusammen addieren Java Basics - Anfänger-Themen 15
W Strings und das parsen Java Basics - Anfänger-Themen 8
D Frage zu Strings einer Exception Java Basics - Anfänger-Themen 4
D Vergleichen von Strings Java Basics - Anfänger-Themen 6
M Konkatenation von zwei Strings Java Basics - Anfänger-Themen 6
J Abbruchbedingung in Schleife/ Untersuchung von Strings Java Basics - Anfänger-Themen 2
S Buchstaben in Großbuchstaben (Strings) Java Basics - Anfänger-Themen 5
X Anagramm mit Strings und Methode Java Basics - Anfänger-Themen 53
P geschachtelte Schleife mit Strings Java Basics - Anfänger-Themen 2
P Strings mit der Axt zerteilen Java Basics - Anfänger-Themen 7
F Alle Zeichenkombinationen eines Strings iterativ herausfinden Java Basics - Anfänger-Themen 26
K Strings hochzählen Java Basics - Anfänger-Themen 20
J Strings untereinander in einer Liste vergleichen Java Basics - Anfänger-Themen 18
B Frage zu: String... strings -> Ungleiche Anzahl an Parameter? Java Basics - Anfänger-Themen 4
F Vergleiche mit charAt funktioniert bei Strings nicht, was tun? Java Basics - Anfänger-Themen 5
T Probleme mit Strings Java Basics - Anfänger-Themen 6
J Unveränderbarkeit von Strings Java Basics - Anfänger-Themen 3
O Klammerung bei Strings Java Basics - Anfänger-Themen 10
A Liste aus drei Strings erstellen Java Basics - Anfänger-Themen 5
N Zwei Strings mit "==" vergleichen warum TRUE Java Basics - Anfänger-Themen 2
G Teil(e) eines Strings entfernen wenn spezifische Zeichen (< & >) vorkommen Java Basics - Anfänger-Themen 5
D ergebnis.matches("[1-9]?[0-9].[0-9][0-9]?") ein teil eines größeren Strings Java Basics - Anfänger-Themen 12
J Breite eines Strings bestimmen Java Basics - Anfänger-Themen 4
D Zwei Strings sind gleich bei if aber nicht true Java Basics - Anfänger-Themen 2
F JList Elemente mit Strings vergleichen Java Basics - Anfänger-Themen 12
J Strings sind gleich werden aber ungleich ausgewertet Java Basics - Anfänger-Themen 2
N Vergleich von Strings schlägt fehl.. Java Basics - Anfänger-Themen 5
B 4 Strings, Anfangsbuchstaben muss unterschiedlich sein Java Basics - Anfänger-Themen 12
P Strings in String Array schreiben Java Basics - Anfänger-Themen 13
J Input/Output Strings aneinander reihen mit while schleife Java Basics - Anfänger-Themen 25
B mir nur die Gesamtzahl von einzigartigen Strings aus Array ausgeben lassen Java Basics - Anfänger-Themen 5
R Erste Schritte Sicheres einlesen eines Strings Java Basics - Anfänger-Themen 2
F Maximale Länge eines Strings Java Basics - Anfänger-Themen 5
J Best Practice Datum Differenz aus zwei Strings ermitteln Java Basics - Anfänger-Themen 8
Jinnai4 Strings ersetzen Java Basics - Anfänger-Themen 9
R Übergeben eines Array Strings an einen Spinner Java Basics - Anfänger-Themen 4
L Rekursiv zwei Strings vergleichen Java Basics - Anfänger-Themen 3
L Prüfe, ob die im String Array enthaltenen Strings aufsteigend sind. Java Basics - Anfänger-Themen 19
J Algorithmus - Strings auf eigene Reihenfolge miteinander vergleichen Java Basics - Anfänger-Themen 4
DaCrazyJavaExpert Variablen Zahlen aus Strings auslesen Java Basics - Anfänger-Themen 4
C 2 Strings Java Basics - Anfänger-Themen 15
T befehle unterschiedlicher anzahl an strings wiedergeben Java Basics - Anfänger-Themen 2
JavaNewbie2.0 Strings in andere Klassen importieren. Java Basics - Anfänger-Themen 2
D BlueJ Java: Strings voneinander trennen Java Basics - Anfänger-Themen 11
javaerd Wie kann ich Brute Force Methode mit Strings erweitern Java Basics - Anfänger-Themen 1
R Erste Schritte Strings "einrücken" Java Basics - Anfänger-Themen 3
Yamie ArrayList<Object> als Liste von Strings ausgeben? Java Basics - Anfänger-Themen 15
B gemeinsames Vorkommen der charactere von 2 Strings als String zurückgeben Java Basics - Anfänger-Themen 5
R Teilinhalt eines Strings testen Java Basics - Anfänger-Themen 10
H Erste Schritte JTree: Instanzen einer Klasse speichern oder Namen/Strings... Java Basics - Anfänger-Themen 4
L Werte von Strings ? Java Basics - Anfänger-Themen 1
L Strings und Arrays - Expand Java Basics - Anfänger-Themen 12
I Schachbrett aus beliebigen Strings erstellen Java Basics - Anfänger-Themen 3
F Wahrscheinlichkeit von Strings Java Basics - Anfänger-Themen 3
MiMa Splitten eines Strings Java Basics - Anfänger-Themen 5
T Hashfunktion für Strings Java Basics - Anfänger-Themen 3
C Zeilenumbruch für langes Strings Java Basics - Anfänger-Themen 2
J Variablen Strings mit Zeilenumbrüchen in neues Array Element Java Basics - Anfänger-Themen 1
T Datentypen compareTo() u. equals() bei Strings Java Basics - Anfänger-Themen 3
H Strings vergleichen & sortieren Java Basics - Anfänger-Themen 20
H Erste Schritte Längstes Wort eines Strings herausfinden Java Basics - Anfänger-Themen 7
D Problem beim umwandeln eines Strings in eine Dzezimalzahl Java Basics - Anfänger-Themen 6
G Strings mit Scanner (nextLine) einlesen Java Basics - Anfänger-Themen 7
T Strings ersetzen mit \ Java Basics - Anfänger-Themen 10
K Strings bearbeiten Java Basics - Anfänger-Themen 14

Ähnliche Java Themen

Neue Themen


Oben