Java Datei-E / a und "Zugriff verweigert" - Fehler

Ich habe schon reißen mir die Haare auf diese und somit bin ich sucht nach etwas Hilfe .

Ich habe einen loop der code führt die folgenden

//imports ommitted
public void afterPropertiesSet() throws Exception{

  //building of URL list ommitted  
  //urlMap is a HashMap <String,String> created and populated just prior   

    for ( Object urlVar : urlMap.keySet() ){
    String myURLvar = urlMap.get(urlVar.toString);
    System.out.println ("URL is "+myURLvar );
    BufferedImage imageVar = ImageIO.read(myURLvar);//URL confirmed to be valid even for executions that fail
    String fileName2Save = "filepath"//a valid file path
    System.out.println ("Target path is "+fileName2Save );
    File file2Save = new File (fileName2Save);
    fileName2Save.SetWriteable(true);//set these just to be sure
    fileName2Save.SetReadable(true);
      try{
       ImageIO.write (imageVar,"png",file2save)//error thrown here 
      }catch (Exception e){
     System.out.println("R: "+file2Save.canRead()+" W: "+file2Save.canWrite()+" E:"+file2Save.canExecute()+" Exists: "+file2Save.exists+" is a file"+file2Save.isFile() );

     System.out.println("parent Directory perms");//same as above except on parent directory of destination
      }//end try
     }//end for
     }

Dies alles läuft auf Windows 7 und JDK 1.6.26 und Netbeans,Tomcat 7.0.14 . Das Zielverzeichnis ist eigentlich in meinem netbeans-Projekt-Verzeichnis in einen Ordner für eine normale web-app ( außerhalb von WEB-INF), wo ich erwarten würde, die normalerweise die Berechtigung haben, Dateien zu schreiben.

Wenn der Fehler Auftritt, bekomme ich zwei Ergebnisse für die Datei ein.) Alle auf false. b.)alles wahr. Die Übergeordneten Ordner die Berechtigung ändern sich nie alle gilt, außer für isFile.

Den Fehler geworfen ( java.IO.Fehler mit "Zugriff verweigert" ") tritt nicht jedes mal auf ... in der Tat 60% der Zeit, die die Schleife ausgeführt, es wirft keine Fehler. Die restlichen 40% der Zeit bekomme ich den Fehler auf 1 von den 60+ - Dateien, die es schreibt. Selten das gleiche. Die Reihenfolge, in der die URLs es beginnt von änderungen jedes mal, so dass die Reihenfolge, in der die Dateien geschrieben werden, ist variabel. Die Dateinamen haben kurze prägnante Namen wie "1.png". Die Bilder sind kleiner..weniger als 8k.

Um sicherzustellen, dass die Berechtigungen korrekt sind ich habe :

Gegeben "full control", um ALLE aus dem Netto-Bohnen-Projekt-Verzeichnis nach unten

Führen Sie das JDK,JRE und Netbeans als Administrator

Benutzerkontensteuerung deaktiviert

Doch der Fehler besteht weiterhin. Google-Suche nach diesem scheint die ganze Skala und oft gelesen wie vodoo. Klar kann ich ( und Java und Netbeans, etc ) sollte die Berechtigung haben zu schreiben, eine Datei in das Verzeichnis .

Jemand einen Einblick ? Das ist alles ( code und die web-server-hosting der URL), die auf einem geschlossenen system, so kann ich nicht Ausschneiden und einfügen von code oder stacktrace.

Update: ich habe bestätigt, " imageURL gültig ist, durch ausführen einer println & toString vor jeder Lesen. Ich habe dann bestätigt, dass ein.) der web-server der Ziel-URL zurückgegeben wird das Bild mit einem http-200-code. b.) das die URL zurückgegeben wird das Bild, wenn getestet in einem web-browser. In Tests habe ich auch eine if () nach dem Lesen zu bestätigen, dass die Werte war nicht NULL oder leer ist. Ich habe auch in tests für die NULL-auf alle anderen Werte . Sie sind immer wie erwartet, auch für ein scheitern .Der Fehler tritt immer innerhalb des try-Blocks. Das Zielverzeichnis ist der gleiche jeder Ausführung. Vor jeder Ausführung ist das Verzeichnis leer.

Update 2: Hier ist eine der stack-traces ( in diesem Fall Dauerwellen für file2Save R: True, W:der Wahre E: True isFile:True exists:True )

    java.io.FileNotFoundException <fullFilepathhere> (Access is denied)
       at java.io.RandomAccessFile.open(Native Method)
       at java.io.RandomAccessFile.<init>(RandomAccessFile.java:212)
       at javax.imageio.stream.FileImageOutputStream.<init>(FileImageOutputStream.java:53)
       at com.sun.imageio.spi.FileImageOutputStreamSpi.createOutputStreamInstance(FileImageOutputStreamSpi.java:37)
       at javax.imageio.ImageIO.createImageOutputStream(ImageIO.java:393)
       at javax.imageio.ImageIO.write(ImageIO.java:1514)
       at myPackage.myClass.afterPropertiesSet(thisClassexample.java:204)//204 is the line number of the ImageIO write
  • Poste deinen aktuellen code. Dies ist keine gültige Java -.
  • fügen Sie den stack-trace oder Fehler als gut . Sind Sie möglicherweise versuchen, um etwas, das durch einige Prozess. Fügen Sie den stack-trace.
  • Wenn Sie schreiben können 60% der Zeit, und nicht die anderen 30%, was passiert, während die restlichen 10% der Zeit? ok, Spaß beiseite - hat der Ort, wo Sie speichern Sie das Bild jedes mal ändert (verschiedene Ordner)? Ist ImageIO.read(URL) gibt eine gültige BufferedImage. Ich sehe nicht ein NPE überprüfen überall.. Bitte mehr info.
  • Ich kann nicht Ausschneiden und einfügen, code ist auf dem system nicht mit dem internet verbunden. Das ist, warum kann ich nicht auch post von der stack-trace. Ich werde transkribieren der stack-trace und post. Wenn Sie etwas sehen, "nicht gültig" Identifiziert und ich werde korrigieren Sie entweder die post oder vielleicht ist das der Fehler .
  • Schreiben Sie eine existierende Datei? Es ist ein Datei-locking-Problem unter Windows, wenn Sie es laufen unter tomcat oder jetty.
  • meine Bearbeitungen, die Datei wird erstellt, während der Ausführung. Auch der seit dieser Ausführung erfolgt, bevor die web-app verfügbar ( und anderen Gründen ) bin ich nicht sicher, dass die Datei-lock gilt
  • mehr code Hinzugefügt, sollte es kompilieren jetzt
  • I transkribiert die stack-trace und es gepostet
  • Sind Sie versucht, zu schreiben das Bild, um den Pfad für das Verzeichnis?
  • Ich verstehe deine Frage nicht. Wenn fileName2save gedruckt wird, sieht es wie folgt aus C:Users\myname\Documents\netbeansProjects\projectName\target\appName\resources\subFolderName\1.png. Wo .\resources\subFoldername ist ein statisches Verzeichnis, in das webapp-root.
  • Sorry für die Fragen, viele Fragen, aber Sie sind einfach überprüfen Sie Punkte für Sie. 1. Überprüfen Sie, ob die subFolderName Pfad existiert. Ich sicher, dass es ist, seitdem Sie schreiben anderen Dateien, aber wenn Sie die automatische Generierung der verschachtelten sub-Ordner, die Sie benötigen, um sicherzustellen, Sie sind alle erstellt. 2. Überprüfen Sie, ob der Pfad der Datei existiert bereits. Wenn es vorhanden ist, und Sie nicht schreiben kann, kann es auch bedeuten, dass Sie eventuell nicht geschlossene file-handler-paar, wo in Ihrem code. Zum Beispiel, können Sie vergessen, Sie zu schließen Ausgabestrom irgendwo.
  • lassen Sie uns weiter, diese Diskussion im chat
  • Ich meinen Verstand verloren als gut... ich habe Gründe zu glauben, dass das Problem ausgelöst wird durch die ImageIO.write (...) - Funktion. Speichern Sie das Bild in eine old-school-Mode ist eine schnelle Lösung für das Problem. In meinem Fall habe ich beschlossen, nicht zu verwenden BufferedImage überhaupt. Wenn Sie sich nicht bewegen kann Weg von BufferdImage sollte es immer noch einen Weg, es zu konvertieren in ein byte[] und sparen Sie Stück für Stück sowieso.
  • Siehe meinen letzten Kommentar auf die Antwort. Ich denke, ich habe versucht, Ihren Ansatz, aber in Anbetracht der code mit imageio ist fast eine Kopie von einer Sonne die Beispiele, die ich denke, das problem liegt außerhalb java . Könnte Sie posten Sie Ihre Lösung als Antwort der Vollständigkeit halber ? Dank
  • schauen Sie unten meine Antwort und bitte lassen Sie mich wissen, wie es geht, da ich einen anderen Weg -ich hatte die Gelegenheit, behandeln das Bild wie eine einfache Datei ohne Belastung in ein BufferedImage - und ich somit nicht wirklich testen, mein Ansatz..

InformationsquelleAutor stimpy | 2011-07-29
Schreibe einen Kommentar