Tomcat-server, absolute Datei-Zugriff im Krieg webapp
Habe ich eine Feder webapp, deren .war
Datei hochgeladen wurde auf einem Tomcat-server. Die meisten der grundlegenden Funktionen arbeiten-wie beabsichtigt - Seitenaufrufe und form der Einreichung.
Mein problem ist jetzt, dass meine webapp muss Lesen und schreiben von Dateien, und ich bin ratlos, wie kann ich dies erreichen (die Datei-I/O zurück java.lang.NullPointerException
).
Ich Folgendes code, um den absoluten Pfad zu einer bestimmten Datei vorgeschlagen Titi-Wangsa Bin Damhore zu wissen, den Pfad relativ zum server:
HttpSession session = request.getSession();
ServletContext sc = session.getServletContext();
String file = sc.getRealPath("src/test.arff");
logger.info("File path: " + file);
Hier ist der output-Pfad:
/home/username/tomcat/webapps/appname/src/test.arff
Aber wenn ich überprüft, die Datei-Verzeichnis über WinSCP, die Datei ist der eigentliche Pfad ist:
/home/username/tomcat/webapps/appname/WEB-INF/classes/test.arff
Hier sind meine Fragen:
- Wie kann ich diese verwandeln Wege in so etwas wie
C:/Users/Workspace/appname/src/test.arff
(der ursprüngliche Pfad in meiner lokalen Maschine, die perfekt funktioniert)? Es ist ServerApache Tomcat 6.0.35
undApache Tomcat 6.0.35
. - Warum ist der code der Rückgabe einen anderen Weg im Gegensatz zu den tatsächlichen Pfad?
- Wenn die Datei-I/O nicht anwendbar ist, welche alternativen kann ich nutzen?
PS ich brauche nur Zugriff auf zwei Dateien (< 1 MB), damit ich nicht denke, vielleicht brauche ich eine Datenbank verwenden, die Sie enthalten, wie vorgeschlagen, durch minus in dieser thread.
Datei-I/O -
Unten ist der code, den ich verwenden für den Zugriff auf die Datei, die ich brauche.
BufferedWriter writer;
try {
URI uri = new URI("/test.arff");
writer = new BufferedWriter(new FileWriter(
calcModelService.getAbsolutePath() + uri));
writer.write(data.toString());
writer.flush();
writer.close();
} catch (IOException e) {
e.printStackTrace();
} catch (URISyntaxException e) {
e.printStackTrace();
}
InformationsquelleAutor | 2013-12-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dateien Lesen:
Dateien zu schreiben:
Wenn Sie nicht wollen, verwenden Sie die tmpdir zur Verfügung gestellt von der servlet-container, dann sollten Sie irgendwo, dass ist völlig außerhalb des servlet-Kontexts purvue, wie
/path/to/temporary/files
oder so ähnlich. Sie definitiv nicht wollen, verwenden Sie den container temporäre Verzeichnis für alles andere als wirklich temporäre Dateien, die sind in Ordnung, zu löschen, die auf re-deployment, etc.ServletContext
aber Sie alle scheinen, um eine neue Klasse für Sie. Wie kann ich es initialisieren, wenn es nur für diese Klasse?Die
ServletContext
ist ein Objekt, das sollte schon verfügbar sein, um Ihr servlet. Das überlasse ich Ihnen als übung für Sie, um herauszufinden, wo, um es zu Holen. Hinweis: Lesen Sie die Servlet-API javadocs.InformationsquelleAutor Christopher Schultz
Es ist ein Krieg, den Sie nicht Lesen/schreiben von Dateien drin.
Lesen ist trivial; die Dateien auf dem Klassenpfad und Lesen als eine Ressource.
Sollten Sie sich nicht schriftlich in einer web-app auf jeden Fall, denn auch wenn es war nicht ein Krieg, Dinge im Kontext verschwinden könnte, während eine Umschichtung, es könnte nur sein, auf einen server, wenn Sie geclustert, etc. Datei schreibt, sollte irgendwo Leben konfigurierbar.
/root/src/
) aber wie kann ich Lesen Sie als Ressource? Brauche ich zu erklären, Sie in einexml
- Datei?href="http://stackoverflow.com/q/1464291/438992">stackoverflow.com/q/1464291/438992 zum Beispiel, das ist zwar trivial suchbar, SO und das web im Allgemeinen.
Wenn Sie finden, sich selbst aufrufende
getRealPath
, du Machst Es Falsch.InformationsquelleAutor Dave Newton
Sei denn, es gibt einige Grund, warum Sie tatsächlich benötigen einen
java.io.File
laden Sie die Datei aus dem Klassenpfad und Mach dir keine sorgen darüber, wo es herkommt.test.arff
werde ich nur erstellen und Lesen es mit diesem code richtig? Was ist mit meinen anderen Datei, ist nur Lesen und befindet sich in/home/username/tomcat/webapps/appname/WEB-INF/classes/mlp.model
? Wie kann ich darauf zugreifen?Alles endet in
classes/
, denke ich, sollten im classpath, so können Sie diese Methode verwenden. Sie kann nicht schreiben Dateien auf diese Weise, noch sollten Sie wirklich wollen zu schreiben, inWEB-INF
.Verwenden Sie
getServletContext().getResource("/WEB-INF/classes/mlp.model")
. Lesen Sie die API einige Zeit. Es wird Wunder für Ihre Produktivität.Warum würden Sie es bevorzugen, dass der class-loader?
Die
ClassLoader
nur suchen inWEB-INF/classes
undWEB-INF/lib/*.jar
während der Verwendung derServletContainer
'sgetResource
- Methode ermöglicht es Ihnen das laden einer Ressource nicht verfügbar ist, um dieClassLoader
. Zum Beispiel können Sie laden/WEB-INF/config/foo.properties
was nicht möglich wäre, mit derClassLoader
.InformationsquelleAutor Chris Martin
Benutzte ich die Frühling
Ressourcen
- Komponente, um mein Datei Pfad wie vorgeschlagen von gähn wie diese (HINWEIStest.arff
befindet sich inroot/src
vorwar
Bereitstellung):Als Nächstes habe ich einfach verketteten
arff
zu den Dateien, die ich will, wie:Ich verwendet
arffPath
direkt in nur ein schnelles Beispiel, aber ich habe eine Funktion, so wird es bequemer sein.Den Pfad der Datei ist eigentlich
/home/username/tomcat/webapps/bosom/WEB-INF/classes/test.arff
so scheuen Sie nicht diese zu verwenden, (wie ich) nur weil Sie nicht Aussehen wieC:/path/to/file
lmaoDie beiden Datei-Pfade sind die gleichen, wenn man ein file nicht verwechselt werden.
ClassLoader
oderServletContext
zu Holen-Ressourcen ist eine robustere Lösung. Diese Lösung scheint dieClassLoader
aber dann mangles die URL und lädt die Ressourcen-Verwendung von standard-Datei-I/O. 🙁könnten Sie bitte geben Sie einen funktionierenden code, den ich imitieren kann, bitte?
Sie sollten wahrscheinlich verwenden Sie die
File
- Attribut gefunden werden kann, in derServletContext
unter den "javax.- servlet.Kontext.tempdir" - Taste. Oder, sollten Sie speichern Sie Ihre Dateien in einer bekannten Position völlig außerhalb der web-Anwendung (sagen wir, in/some/place/for/temp/files
).InformationsquelleAutor