Java Binärdatei kopieren per Streams?
Von Folder.jpg soll eine Kopie per InputStream und OutputStream erzeugt werden und dann in dem package Lektion 17 abgelegt werden. Die Kopie soll copy.jpg heißen
Was ist hier in der Pfadeingabe falsch?
package de.thws; // Von mir zum testen von Streams
import java.io.*;
public class PerStreamDateiEinlesen {
public static void main(String[] args) throws FileNotFoundException {
copyFileWithErrorHandling3Modularized();
}
public static void copyFileWithErrorHandling3Modularized()
{
// try-with-resource statement
try (InputStream fis = new FileInputStream("Maven\\de\\thws\\Lektion17\\Folder.jpg");
OutputStream fos = new FileOutputStream("copy.jpg");)
{
copyImproved(fis, fos);
}
catch (IOException e)
{
e.printStackTrace();
}
}
// Hier kopiere ich die Datei
static void copyImproved(InputStream is, OutputStream os) throws IOException
{
byte[] b = new byte[1024];
int n;
do
{
n = is.read(b); //kann maximal 1024 bytes lesen
if (n != -1) os.write(b, 0, n);
}
while (n != -1);
}
}
3 Antworten
Da du mit relativen Pfaden arbeitest, hängt es stark vom Working Directory ab.
Wie führst du das Program aus? Über den Play Button in IntelliJ?
Wenn du Konfiguration hinter dem Ausführen bearbeitest, findest du den Parameter vom Working Directory. Vermutlich wird es der Ordner "Maven" sein.
Dazu wird dich die aktuelle Ansicht von IntelliJ iritieren. Du hast aktuell die "Packages" Ansicht geöffnet, welches nicht unbedingt die Ordnerstruktur vom Working Directory aus darstellt.
Der tatsächliche Pfad ist src/main/java/de/thws/Lektion17/Folder.jpg. Das ist auch die übliche Ordnerstruktur bei Java Projekten.
Du kannst übrigens auch normale / im Pfad unter Windows benutzen.
Ich nutze in IntelliJ auch immer die "Project" Struktur. Dort findest du auch u.A. die Ordner src/main.
Du könntest in IntelliJ auch ein Rechtsklick auf deine Datei machen, Copy Path/Reference..., und dann Path from Content Root wählen. Damit hast du den relativen Pfad zum Projekt Hauptorder, welches standardmäßig der Working Directory ist.
Screenshot für den Kommentar:
"Wie führst du das Program aus? Über den Play Button in IntelliJ?"
=> strg + shift + F10
"Dazu wird dich die aktuelle Ansicht von IntelliJ iritieren. Du hast aktuell die "Packages" Ansicht geöffnet, welches nicht unbedingt die Ordnerstruktur vom Working Directory aus darstellt."
=> Wie kann die aktuelle Ansicht umstellen, so das ich die Ordnerstruktur des Working Directory wieder sehe, wo auch der src Ordner ist usw?
Habe meine Antwort um ein Screenshot ergänzt. Die Projekt Struktur findest du beim linken roten Rechteck, wie du vermutlich schon gefunden hast.
Das Tastaturkürzel wird die gleiche Funktion wie der Play Button ausführen.
Auf der rechten Seite mit den roten Rechtecken kannst du die Konfiguration zum Ausühren anpassen.
Im Popup Menü nach Edit Configuration findest du ein Textfeld für Working Directory.
Maven\\ kannst du entfernen, denn dort bist du ja schon drin.
try (InputStream fis = new FileInputStream("de\\thws\\Lektion17\\Folder.jpg");
OutputStream fos = new FileOutputStream("copy.jpg");)
Kommt weiterhin der Fehler
Der ganze Pfad gemäß Windows Explorer ist:
C:\Users\User\IdeaProjects\Maven\src\main\java\de\thws\lektion17
Dort liegt die Datei Folder.jpg
By default the classes in the
java.io
package always resolve relative pathnames against the current user directory. This directory is named by the system property
user.dir
, and is typically the directory in which the Java virtual machine was invoked.
https://docs.oracle.com/en/java/javase/18/docs/api/java.base/java/io/File.html
Ich denke, deine Pfadangabe ist falsch. Probier damit etwas rum.
Was soll ich hier in der Pfadangabe ändern? Ist doch alles korrekt eingegeben oder nicht?
Mal einen absoluten Pfad probieren. Mal das Referenzverzeichnis ausgeben lassen. ...
C:\Users\User\IdeaProjects\Maven\src\main\java\de\thws\lektion17
So ist der Pfad vorgegeben, als ich ihn aus dem Explorer rauskopiert habe
Dann hast du womöglich den Ordner von "Lektion17" zu "lektion17" umbenannt und die IDE hat das noch nicht aktualisiert? Und dein realativer Pfad geht nicht, da du es da groß geschrieben hast?
try (InputStream fis = new FileInputStream("C:\\Users\\User\\IdeaProjects\\Maven\\src\\main\\java\\de\\thws\\lektion17\\Folder.jpg");
OutputStream fos = new FileOutputStream("copy.jpg");)
So gings. Die Kopie wurde allerdings im src Ordner eins unter dem Maven Ordner abgelegt. Wie kann ich im Projekt-Fenster von IntelliJ den src Ordner einblenden?
Siehe mein Bild oben, dort gibt es den src gar nicht bzw. er wird nicht eingeblendet.
Weiß ich nicht.
Allerdings sagt dir das etwas anderes: Dein relativer Pfad beginnt im src-Ordner. Deshalb hat deine relative Pfadangabe zuvor auch nicht geklappt.
Versuch es doch mal mit einem relativem Pfad vom src-Ordner aus. Und deine Ausgabe-Datei kannst du ja auch direkt in einem Unterordner erstellen mit passender Pfadangabe.
Hat geklappt. Vielen Dank! Allerdings würde ich immer noch gerne wissen wie ich den src Ordner in IntelliJ im Projektfenster einblenden kann
Der ganze Pfad ist ja:
C:\Users\User\IdeaProjects\Maven\src\main\java\de\thws\lektion17\Folder.jpg
Warum wird mir in Intellij nur der Projekt-Ordner Maven und dann erst die Packages ab de, thws... angezeigt?
Weiß ich nicht, ich nutze InteliJ nicht. Evtl. kannst du das in den Einstellungen irgendwo umstellen?
Ansonsten stell doch eine neue Frage dazu, vielleicht weiß hier jemand mehr.
tide1109 erklärt in seiner Antwort, wie es wohl geht:
https://www.gutefrage.net/frage/java-binaerdatei-kopieren-per-streams#answer-498280928
Wie stelle ich die Project Struktur ein?