Aus FileWriter File oder Pfad rausbekommen

jeipack

Erfahrenes Mitglied
Hi
Ich bin jetzt schon eine Weile am Suchen und glaube langsam dass es nicht möglich ist, trozdem will ich hier noch schnell nachfragen:
ist es möglich aus einem FileWriter-Objekt heraus zu bekommen in welches File dieser schreibt? also entweder ein File-Objekt rausziehen oder einen String mit dem Pfad drin (sowas wie bei File.getAbsolutePath()).



thx
jeipack
 
Ich habe mich mal in den Writerklassen umgeschaut, ich glaube nicht dass man den Pfad des Files herausbekommen kann.
FileWriter arbeitet mit den java Writerklassen, die von dem darunterliegenden Stream abstrahieren. Ob dort ein FileOutputstream dahinter liegt oder ein anderer OutputStream, der nichts mit File zu tun hat, ist für die Writerklassen nicht ersichtlich. Wenn also Filewriter nichts bereitstellt - und dies ist der Fall - kommst du nicht an die FileObjekte.
 
Hallo,

hier mal ein kleiner Hack ähm Beispiel wie man unter Linux mittels des Tools lsof an den Pfad der vom FileWriter verwendeten Datei herankommen kann.

Das ist nur eine Spielerei... (Was für die Trickkiste bzw. den absoluten Notfall...)

Java:
package de.tutorials;
 
import java.io.FileDescriptor;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.Writer;
import java.lang.reflect.Field;
import java.util.Scanner;
import java.util.concurrent.TimeUnit;
 
public class FileWriterExample {
 
    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        FileWriter writer = new FileWriter("/home/tom/Desktop/spring-framework-3.0.0.M1-with-docs.zip");
        String filePath = getPathOfFileUsedBy(writer);
        System.out.println(filePath);
        TimeUnit.SECONDS.sleep(300);
        writer.close();
    }
 
    private static String getPathOfFileUsedBy(FileWriter writer) throws Exception {
        String filePath = null;
        ProcessBuilder processBuilder = new ProcessBuilder("/bin/sh", "-c", "echo $PPID");
        Process currentProcessIdDetectionProcess = processBuilder.start();
        Scanner currentProcessIdDetectionProcessOutputScanner = new Scanner(currentProcessIdDetectionProcess.getInputStream());
        while (currentProcessIdDetectionProcessOutputScanner.hasNextLine()) {
            String currentProcessId = currentProcessIdDetectionProcessOutputScanner.nextLine().trim();
            //System.out.println("PID: " + pid);
            FileOutputStream fos = getValue("lock", writer, Writer.class);
            int fd = getValue("fd", fos.getFD(), FileDescriptor.class);
            //System.out.println("FD: " + fd);
            processBuilder = new ProcessBuilder("/bin/sh", "-c", "lsof -p " + currentProcessId);
            Process lsofProcess = processBuilder.start();
            Scanner lsofProcessScanner = new Scanner(lsofProcess.getInputStream());
            while (lsofProcessScanner.hasNextLine()) {
                String line = lsofProcessScanner.nextLine();
                String[] tokens = line.replaceAll("\\s+"," ").split(" ");
                if (tokens[3].matches(fd +"\\w?")) {
                    filePath = tokens[8];
                    break;
                }
            }
            lsofProcessScanner.close();
            lsofProcess.waitFor();
        }
        currentProcessIdDetectionProcess.waitFor();
        return filePath;
    }
 
    private static <T> T getValue(String fieldName, Object instance, Class<?> clazz) {
        try {
            Field field = clazz.getDeclaredField(fieldName);
            field.setAccessible(true);
            return  (T) field.get(instance);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

Gruß Tom
 
Wie wäre es mit dem?

Java:
package core;

import java.io.File;

public final class FileWriter extends java.io.FileWriter
{
	private File file;
	
	public FileWriter(File file) throws Throwable
	{
		super(file);
		this.file = file;
	}
	public FileWriter(String string) throws Throwable
	{
		super(new File(string));
		this.file = new File(string);
	}
	public final File getFile()
	{
		return(this.file);
	}
}
Java:
package core;

import java.io.BufferedWriter;

public final class Main extends Object
{
	public Main()
	{
		super();
	}
	public final static void main(String[] args)
	{
		try
		{
			FileWriter fileWriter = new FileWriter("dummy.txt");
			BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
			
			bufferedWriter.write("tutorials.de");
			bufferedWriter.flush();
			bufferedWriter.close();
			
			System.out.println(fileWriter.getFile().getAbsolutePath());
		}
		catch(Throwable e)
		{
			e.printStackTrace();
		}
	}
}

Oder so ähnlich? Wie mans halt braucht.
Der 2. Konstruktor ist nicht gerade schön, aber natürlich "Constructor call must be the first statement in a constructor", und eine andere Möglichkeit wüsste ich dafür nicht.
Ist dann natürlich nicht das selbe File-Obj. in das geschrieben wird, aber das relevante, also der Pfad ist ident.
 
Zuletzt bearbeitet:
Hi
Vielen Dank für deinen Hack Thomas, interessanter Ansatz ;) Nur nichts für mich.
Du hast auch recht dass ich von ihrgendwoher einen FileWriter bekomme und diesen nicht beeinflussen kann.
@TrueSun: Vielen Dank für die Erklährungen, ist einläuchtend und ich habs mir so auch schon fast gedacht.

Thread Erledigt.
Habe das Problem jetzt einfach total umgangen.


Gruss
 
Zurück