Oceans11
20-06-2007, 17:10
il seguente programma dovrebbe splittare un file. Il costruttore vuole il file e la dimensione dei "pezzi"...beh "quasi" funziona, nel senso che non sempre la riunione dei file che escono fuori è uguale all'originale!
nota1:
ho fatto copy 1.txt+2.txt+...etc temp.txt
e poi fc temp.txt originale.txt
dov'è il problema??? :mc:
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
public class Split
{
private File file;
private long splitSize;
private int splitNumber;
private int bufferSize;
public Split(File f, long size) {
file = f;
splitSize = size;
splitNumber = computeSplitNumber();
bufferSize = splitSize < 4096 ? (int) splitSize : 4096;
}
private void split() {
int digitNum = splitNumber / 10;
for (int i = 0; i < splitNumber; i++) {
String outName = f.getName() + (i + 1);
File outFile = new File(outName);
try {
copyFile(outFile, i * splitSize, splitSize);
}
catch (IOException ex) {
ex.printStackTrace();
}
}
}
private void copyFile(File destination, long offset, long dim)
throws IOException {
RandomAccessFile in = new RandomAccessFile(file, "r");
in.seek(offset);
FileOutputStream out = new FileOutputStream(destination);
byte[] buffer = new byte[bufferSize];
long lastPos = dim + offset;
long bytesWritten = 0;
int currentBufferSize;
while ((currentBufferSize = in.read(buffer)) > 0
&& in.getFilePointer() <= lastPos) {
out.write(buffer, 0, currentBufferSize);
bytesWritten += currentBufferSize;
}
if (in != null)
in.close();
if (out != null)
out.close();
}
private int computeSplitNumber() {
return (int) ((f.length() / splitSize) + 1);
}
}
nota2:
se invece di usare RandomAccessFile uso FileInputStream e leggo e scrivo 1 carattere alla volta va tutto bene...perchè? :muro:
nota1:
ho fatto copy 1.txt+2.txt+...etc temp.txt
e poi fc temp.txt originale.txt
dov'è il problema??? :mc:
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
public class Split
{
private File file;
private long splitSize;
private int splitNumber;
private int bufferSize;
public Split(File f, long size) {
file = f;
splitSize = size;
splitNumber = computeSplitNumber();
bufferSize = splitSize < 4096 ? (int) splitSize : 4096;
}
private void split() {
int digitNum = splitNumber / 10;
for (int i = 0; i < splitNumber; i++) {
String outName = f.getName() + (i + 1);
File outFile = new File(outName);
try {
copyFile(outFile, i * splitSize, splitSize);
}
catch (IOException ex) {
ex.printStackTrace();
}
}
}
private void copyFile(File destination, long offset, long dim)
throws IOException {
RandomAccessFile in = new RandomAccessFile(file, "r");
in.seek(offset);
FileOutputStream out = new FileOutputStream(destination);
byte[] buffer = new byte[bufferSize];
long lastPos = dim + offset;
long bytesWritten = 0;
int currentBufferSize;
while ((currentBufferSize = in.read(buffer)) > 0
&& in.getFilePointer() <= lastPos) {
out.write(buffer, 0, currentBufferSize);
bytesWritten += currentBufferSize;
}
if (in != null)
in.close();
if (out != null)
out.close();
}
private int computeSplitNumber() {
return (int) ((f.length() / splitSize) + 1);
}
}
nota2:
se invece di usare RandomAccessFile uso FileInputStream e leggo e scrivo 1 carattere alla volta va tutto bene...perchè? :muro: