hallo
hab mir ein kleines tool geschrieben mit dem ich verzeichnisstrukturen auf ein anderes spiegeln kann, also ein backup des baums machen kann.
Das Problem ist dass sich aus irgendeinem grund der inaktive physikalische speicher immer weiter aufbläst und am schluss ca. 80% der gesicherten datenmenge ausmacht. Bei einem backup von 1,5Gb werden 1,2GB speicher inaktiv und werden auch nach beenden des Programmes vom os (os x 10.5.1) auch nicht wieder freigegeben. WTF? Das einzige wie ich mir das erklären könnte sind nicht geschlossene Streams, aber die schliesse ich alle brav.
Hat wer eine idee was das verursachen könnte?
Klasse die files kopiert:
Java
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.swing.JProgressBar;
public class FileManager {
public FileManager() {
}
/*
* Kopiert das File source nach dest
*/
public boolean copy(File _source, File _dest) throws IOException {
File source = _source;
File dest = _dest;
if (source.isFile()) {
FileInputStream fis = new FileInputStream(source);
FileOutputStream fos = new FileOutputStream(dest);
if (!dest.exists())
dest.createNewFile();
byte buffer[] = new byte[65536]; // reading 65K blocks
long pos = 0;
int bytesToWrite = 0;
while (dest.length() < source.length()) {
bytesToWrite = fis.read(buffer, 0, 65536);
fos.write(buffer, 0, bytesToWrite);
pos += bytesToWrite;
}
fis.close();
fos.close();
if (dest.length() == source.length())
return true;
}
return false;
}
/*
* Kopiert das File source nach dest und handled eine Progressbar (0% -
* 100%);
*/
public boolean copy(File _source, File _dest, JProgressBar progressBar)
throws IOException {
File source = _source;
File dest = _dest;
if (source.isFile()) {
FileInputStream fis = new FileInputStream(source);
FileOutputStream fos = new FileOutputStream(dest);
if (!dest.exists())
dest.createNewFile();
byte buffer[] = new byte[65536]; // reading 65K blocks
progressBar.setIndeterminate(false);
progressBar.setValue(0);
long pos = 0;
int bytesToWrite = 0;
int barValue = 0;
int barSteps = -1;
int steps = 1;
try {
steps = (int) (source.length() / 100);
} catch (ArithmeticException ae) {
}
while (dest.length() < source.length()) {
bytesToWrite = fis.read(buffer, 0, 65536);
barSteps += bytesToWrite;
if (barSteps >= steps) {
progressBar.setValue(++barValue);
barSteps = -1;
}
fos.write(buffer, 0, bytesToWrite);
pos += bytesToWrite;
}
fis.close();
fos.close();
if (dest.length() == source.length()) {
progressBar.setValue(100);
return true;
}
}
return false;
}
}
Alles anzeigen
Klasse die rekursiv den verzeichnisbaum durchgeht
Java
import java.io.File;
import java.io.IOException;
public class Processor implements Runnable {
Thread runner = null;
FileManager fileman;
long speicherplatz = 0;
int totalFileAmount = 1;
int backUpped = 1;
int filesVisited = 0;
float pValue = 0;
float x = 0;
File root;
File mirror;
public Processor(File root, File mirror) {
fileman = new FileManager();
this.root = root;
this.mirror = mirror;
if (runner == null) {
runner = new Thread(this);
runner.start();
}
}
public void start(File dir) {
BackupGUI.appendTextArea(dir.getAbsolutePath());
File[] files = dir.listFiles();
String tmp;
if (files.length > 0) {
for (int i = 0; i < files.length; i++) {
if (files[i].isFile() && !files[i].isHidden())
filesVisited++;
x = 100f / totalFileAmount;
BackupGUI.progress.setValue(Math.round(x * filesVisited));
tmp = files[i].getAbsolutePath().substring(
root.getAbsolutePath().length());
// System.out.println("TPM: " + tmp);
if (!new File(mirror + File.separator + tmp).exists())
backupFile(tmp, files[i]);
if (new File(mirror + File.separator + tmp).exists())
if (files[i].lastModified() > new File(mirror
+ File.separator + tmp).lastModified())
backupFile(tmp, files[i]);
/*
* Rekursiver Aufruf
*/
if (files[i].isDirectory() && files[i].canRead()
&& files[i].exists())
start(files[i]);
}
}
}
private void backupFile(String directoryName, File file) {
// System.out.println(mirror +
// directoryName.substring(0,directoryName.lastIndexOf(File.separator)));
// System.out.println(mirror + " <<< >>> " +
// directoryName.substring(0,directoryName.lastIndexOf(File.separator)));
String newFile = "";
File f = new File(mirror
+ directoryName.substring(0, directoryName
.lastIndexOf(File.separator)));
f.mkdirs();
newFile = f.getAbsolutePath() + File.separator + file.getName();
File tmp = new File(newFile);
try {
if (file.length() <= 2000000l)
fileman.copy(file, tmp);
else
fileman.copy(file, tmp, BackupGUI.fileProgress);
speicherplatz += file.length();
if (file.isFile() && !file.isHidden()) {
backUpped++;
BackupGUI.setCorruptTagCounter(backUpped);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void countFiles(File dir) {
File[] files = dir.listFiles();
if (files.length > 0) {
for (int i = 0; i < files.length; i++) {
if (files[i].isFile() && !files[i].isHidden())
totalFileAmount++;
if ((totalFileAmount % 10) == 0) {
BackupGUI.setSongCounter(totalFileAmount);
}
if (files[i].isDirectory() && files[i].canRead()
&& files[i].exists())
countFiles(files[i]);
}
}
}
public void run() {
long start = System.currentTimeMillis();
BackupGUI.progress.setIndeterminate(true);
countFiles(root);
BackupGUI.setSongCounter(totalFileAmount);
BackupGUI.progress.setIndeterminate(false);
x = ((float) totalFileAmount / (float) 100);
BackupGUI.progress.setValue(0);
start(root);
BackupGUI.fileProgress.setValue(0);
BackupGUI.progress.setValue(0);
BackupGUI.appendTextArea("Alle Daten wurden gesichert");
BackupGUI.appendTextArea("Benötigte Zeit: "
+ ((double) System.currentTimeMillis() - (double) start)
/ 1000d + " Sekunden");
BackupGUI.appendTextArea("Benötigter Speicherplatz: "
+ (speicherplatz / 1000000) + " Mb (" + speicherplatz
+ " Bytes)");
}
}
Alles anzeigen