Datei aus Netzwerk auslesen

Jhue89

Bekanntes Mitglied
Hallo Zusammen,

Ich habe gerade ein Problem mit Netzwerk zugriffen und weiss nicht so ganz was falsch ist.

Ich nutze ein SMB Protokoll um eine Datei zu Öffnen.
Wenn ich das bei mir in der Programmierumgebung teste Funktioniert alles einwandfrei.

Um das ganze nochmal auf einem anderen System zu testen habe ich ein .Jar datei erzeugt.

Sobald ich den die Netzwerk Datei öffnen will bekomme ich aber eine Exception.

Code:
Exception in thread "AWT-EventQueue-0" java.lang.NoSuchMethodError: jcifs.smb.SmbFileInputStream.readAllBytes()[B
        at DataImportExport.DataExportNetworkSMB.txtDateiIMPNetworkSMB(DataExportNetworkSMB.java:140)
        at DataImportExport.DataExportNetwork.openFile(DataExportNetwork.java:106)
        at ErpConfig.JWindowERPConfig.<init>(JWindowERPConfig.java:264)
        at windows.JWindow$11.actionPerformed(JWindow.java:396)
        at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
        at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
        at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
        at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
        at javax.swing.AbstractButton.doClick(Unknown Source)
        at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source)
        at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(Unknown Source)
        at java.awt.Component.processMouseEvent(Unknown Source)
        at javax.swing.JComponent.processMouseEvent(Unknown Source)
        at java.awt.Component.processEvent(Unknown Source)
        at java.awt.Container.processEvent(Unknown Source)
        at java.awt.Component.dispatchEventImpl(Unknown Source)
        at java.awt.Container.dispatchEventImpl(Unknown Source)
        at java.awt.Component.dispatchEvent(Unknown Source)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
        at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
        at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
        at java.awt.Container.dispatchEventImpl(Unknown Source)
        at java.awt.Window.dispatchEventImpl(Unknown Source)
        at java.awt.Component.dispatchEvent(Unknown Source)
        at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
        at java.awt.EventQueue.access$500(Unknown Source)
        at java.awt.EventQueue$3.run(Unknown Source)
        at java.awt.EventQueue$3.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
        at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
        at java.awt.EventQueue$4.run(Unknown Source)
        at java.awt.EventQueue$4.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
        at java.awt.EventQueue.dispatchEvent(Unknown Source)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.run(Unknown Source)
[Finalizer] WARN jcifs.smb.SmbTreeHandleImpl - Tree handle was not properly released smb://192.168.91.20/Users/Administrator/Documents/mediquc.erpmng/erpconfig.json
[Finalizer] WARN jcifs.smb.SmbFileHandleImpl - File handle was not properly closed: FileHandle \Administrator\Documents\mediquc.erpmng\erpconfig.json [fid=8D0000000000000005000000FFFFFFFF,tree=3,flags=0,access=1,attrs=0,options=0]

So Ganz verstehe ich das nicht...

Hier ist nochmal der Codeausschnitt für die Funktion


Java:
public String txtDateiIMPNetworkSMB(String LoginName, String password, String NetworkPath, String FileName)
     {
        String content = "";
        try {
            
            BaseContext bc = new BaseContext(new PropertyConfiguration(System.getProperties()));
            CIFSContext ct = bc.withCredentials(new NtlmPasswordAuthenticator(LoginName, password));
            SmbResource sr = ct.get("smb:" + NetworkPath);// //192.168.178.157/TestNet/
            if (sr.exists()) {
                SmbFile file = new SmbFile(sr, FileName);
                
                SmbFileInputStream in = new SmbFileInputStream("smb:" +NetworkPath+FileName, ct);
                content = new String(in.readAllBytes());

                in.close();
            }
            
            sr.close();
            
            ct.close();
            bc.close();

            return content;

        } catch (IOException e) {
            e.printStackTrace();
           
        }

        return content;
    }

Ich mache im Vorfeld auch noch einen Verbindungscheck der meldet mir das alles in Ordnung ist.


Hab ihr eine Ahnung woran das liegt?
 
Dein Klassenpfad in deiner IDE und der Klassenpfad von deinem jar weichen ab. Da gibt es zwei Moeglichkeiten:

1. JVM Version ist unterschiedlich (zum Beispiel IDE laeuft auf 11, das System aber auf 8).
2. Die Abhaengigkeiten sind in unterschiedlicher Version oder Reihenfolge im Klassenpfad.

In diesem Fall wuerde ich sagen dass auf deinem Ziel System eine Java 8 laeuft, du es aber in der IDE mit Java 11 baust. Das ergibt sich daraus weil die Funktion java.io.InputStream.readAllBytes erst mit Version 9 hinzukam. Also entweder deine Ziel Version auf 8 aendern, oder das Zielsystem updaten.
 
Googlen hat die Ursache gebracht, die Methode "readAllBytes" kam in InputStream mit Java 9 hinzu.

Du kompilierst dein Programm mit Java 9 oder neuer, führst es aber mit Java 8 oder älter aus.
 
Also muss ich Entweder die Methode ändern oder die Javaversion richtig? Welche Methode kann ich dafür sonst nehmen?
Ja.

Aber ich Verwende eigentlich nur die JRE 1.8
Das ist das Runtime Environment. Fürs Entwickeln ist das JDK ausschlaggebend.

In Java 8 kannst Du Dir die Helferlein selbst schreiben:
Java:
public static void transfer(InputStream source, OutputStream dest) throws IOException {
    byte[] buf = new byte[8192];
    int bytesRead;
    while ((bytesRead = source.read(buf)) != -1) {
        dest.write(buf, 0, bytesRead);
    }
}

public static byte[] readAllBytes(InputStream in) throws IOException {
    try(ByteArrayOutputStream bos = new ByteArrayOutputStream()) {
          transfer(in, bos);
          return bos.toByteArray();
    }
}
 
also die Version hatte ich jetzt mal geändert, hat aber nicht funktioniert.

Jetzt Habe ich Helferleins mit reingenommen und siehe da! Es Funktioniert!!!

Danke die Schnelle Hilfe
 
Hallo anscheind muss ich das Thema doch nochmal auf machen. Ich meine Programm mal auf einen anderen Rechner geschoben und ich hab wieder das gleiche Problem.

auch hier sagt er mir wieder NoSuchMethodError...

Also eigenlich möchte ich mein Programm mit Java 1.8 weiterschreiben. Aber anscheindend greift meine IDE auf andere Versionen zurück ansonsten hätte ich ja im Programm schon Fehlermeldungen.

Wo genau muss ich das einstellen?

Wenn mein Programm doch auf Java 9 oder höher zurückgreift schein die von Mihe7 genannte Lösung doch nicht so recht zu funktionieren.

Wie und Wo muss ich die beiden Helfer denn einsetzen?
Ich glaub ich hab an der stelle total falsch gedacht.


Java:
public String txtDateiIMPNetworkSMB(String LoginName, String password, String NetworkPath, String FileName)
     {
        String content = "";
        try {
            
            BaseContext bc = new BaseContext(new PropertyConfiguration(System.getProperties()));
            CIFSContext ct = bc.withCredentials(new NtlmPasswordAuthenticator(LoginName, password));
            SmbResource sr = ct.get("smb:" + NetworkPath);// //192.168.178.157/TestNet/
            if (sr.exists()) {
                SmbFile file = new SmbFile(sr, FileName);
                
                SmbFileInputStream in = new SmbFileInputStream("smb:" +NetworkPath+FileName, ct);   
                
                
                content = new String (in.readAllBytes());
                
                in.close();
            }
            
            sr.close();           
            ct.close();
            bc.close();

            return content;

        } catch (IOException e) {
            e.printStackTrace();           
        }
        return content;
    }
    
    public static void transfer(InputStream source, OutputStream dest) throws IOException {
        byte[] buf = new byte[8192];
        int bytesRead;
        while ((bytesRead = source.read(buf)) != -1) {
            dest.write(buf, 0, bytesRead);
        }
    }

    public static byte[] readAllBytes(InputStream in) throws IOException {
        try(ByteArrayOutputStream bos = new ByteArrayOutputStream()) {
              transfer(in, bos);
              return bos.toByteArray();
        }
    }
 

Zurück
Oben