E ae Gujeiros!
Queria saber como pegar o tamanho do arquivo, tipo o FileSize do Pascall!
eu tentei o File.length(); mas não rola, e naum achei nenhum nome que parecia com size
valeu!
E ae Gujeiros!
Queria saber como pegar o tamanho do arquivo, tipo o FileSize do Pascall!
eu tentei o File.length(); mas não rola, e naum achei nenhum nome que parecia com size
valeu!
String caminho = ""; // coloque o caminho do arquivo e o nome do arquivo
File f = new File(caminho);
System.out.println(f.length());
Sorry naum fui específico:
[code]
FileOutputStream arqReadStream = new FileOutputStream(arqDestino);
FileInputStream arqWriteStream = new FileInputStream(arqOriginal)
BufferedReader arqReadBuffer = new BufferedReade(new InputStreamReader(arqReadStream));
BufferedOutputStream arqWriteBuffer = new BufferedOutputStream(arqWriteStream);
DataOutputStream arqData = new DataOutputStream(arqWriteBuffer);
File f = new File(caminho);
int tamanho = f.length();
int getByte = 0;
for (int i = 0; i < tamanho; i++)
{
arqReadBuffer = arq.read();
arqData.write(getByte);
}[/code]
Quero pegar os bytes do arquivo e escrever byte por byte em outro (é a mesma idéia de quando se copia um arquivo manualmente)
Só que esse length() não responde, ele cria um arquivo bem maior e todo errado
OBS: se tiver algum erro de sintaxe, desconsidere, escrevi aki direto.
Para copiar um arquivo em outro:
int nBytes;
byte[] buf = new byte[10240]; // pode aumentar um pouco se quiser
while ((nBytes = in.read(buf)) > 0) {
out.write (buf, 0, nBytes);
}
onde in é um objeto de alguma classe derivada de InputStream, e out é um objeto de alguma classe derivada de OutputStream.
Isso é tão rápido quanto a implementação tradicional do C++.
Eis um teste com FileChannel.
Não se esqueça que se o arquivo de entrada não tiver sido fechado pelo programa que o gerou, fIn.length() volta um valor incorreto e você poderá ter problemas.
import java.io.*;
import java.nio.*;
import java.nio.channels.*;
class TestCopy {
public static void main(String[] args) throws Exception {
File fIn = new File (args[0]);
File fOut = new File (args[1]);
// RandomAccessFile rafIn = new RandomAccessFile (fIn, "r");
// RandomAccessFile rafOut = new RandomAccessFile (fOut, "rw");
FileInputStream fis = new FileInputStream (fIn);
FileOutputStream fos = new FileOutputStream (fOut);
// FileChannel fcIn = rafIn.getChannel();
// FileChannel fcOut = rafOut.getChannel();
FileChannel fcIn = fis.getChannel();
FileChannel fcOut = fos.getChannel();
// fcIn.transferTo (0, fIn.length(), fcOut);
fcOut.transferFrom (fcIn, 0, fIn.length());
// rafOut.close();
// rafIn.close();
fos.close();
fis.close();
}
}
Po cara valeu, esse exemplo me ajudou muito.
Mas realmente não tem jeito de saber o tamanho do arquivo(naum o tamanho em MB) mas o total de bytes?
Eu queria manioular os bytes, antes de gravar o arquivo…
Claro que tem, é só usar o length. Acho que você está com algum problema (por exemplo, o arquivo de entrada não foi fechado ainda, então o tamanho real não bate com o que é mostrado pelo dir, ou coisa parecida).
Só uma coisinha - NUNCA NUNCA NUNCA fique copiando arquivos lendo um byte de cada vez. Depois você vai reclamar que o Java é lerdo. Como eu lhe mostrei, é possível copiar arquivos mais rápido que o C++.
Oi, agora ele copia com o tamanho certo(não estou usando length) e estou copiando byte por byte(eu sei, já li, estou apenas testando ).
O problema agora é q o arquivo fica corrompido, eu abri ele e comaparei com o original e alguns caracteres são substiuidos por outros, mas a estrutura do arquivo é a mesma.
Achei bem estranho, testei com um executável bem pequeno e deu erro
[quote=israelwm]Sorry naum fui específico:
FileOutputStream arqReadStream = new FileOutputStream(arqDestino);
FileInputStream arqWriteStream = new FileInputStream(arqOriginal)
BufferedReader arqReadBuffer = new BufferedReade(new InputStreamReader(arqReadStream));
BufferedOutputStream arqWriteBuffer = new BufferedOutputStream(arqWriteStream);
DataOutputStream arqData = new DataOutputStream(arqWriteBuffer);
File f = new File(caminho);
int tamanho = f.length();
int getByte = 0;
for (int i = 0; i < tamanho; i++)
{
arqReadBuffer = arq.read();
arqData.write(getByte);
}[/code]
Quero pegar os bytes do arquivo e escrever byte por byte em outro (é a mesma idéia de quando se copia um arquivo manualmente)
Só que esse length() não responde, ele cria um arquivo bem maior e todo errado :/
OBS: se tiver algum erro de sintaxe, desconsidere, escrevi aki direto.[/quote]
Pra quem estiver acompanhando o tópico.
Achei o erro:
Para ler e gravar:
[code]BufferedInputStream arqReadBuffer = new BufferedInputStream(arqReadStream);
DataInputStream arqReadData = new DataInputStream(arqReadBuffer);
BufferedOutputStream arqWriteBuffer = new BufferedOutputStream(arqWriteStream);
DataOutputStream arqWriteData = new DataOutputStream(arqWriteBuffer);
//arqReadStream = InputStream
//arqWriteStream = OutputStream
[quote=thingol]Eis um teste com FileChannel.
Não se esqueça que se o arquivo de entrada não tiver sido fechado pelo programa que o gerou, fIn.length() volta um valor incorreto e você poderá ter problemas.
[code]
import java.io.;
import java.nio.;
import java.nio.channels.*;
class TestCopy {
public static void main(String[] args) throws Exception {
File fIn = new File (args[0]);
File fOut = new File (args[1]);
// RandomAccessFile rafIn = new RandomAccessFile (fIn, “r”);
// RandomAccessFile rafOut = new RandomAccessFile (fOut, “rw”);
FileInputStream fis = new FileInputStream (fIn);
FileOutputStream fos = new FileOutputStream (fOut);
// FileChannel fcIn = rafIn.getChannel();
// FileChannel fcOut = rafOut.getChannel();
FileChannel fcIn = fis.getChannel();
FileChannel fcOut = fos.getChannel();
// fcIn.transferTo (0, fIn.length(), fcOut);
fcOut.transferFrom (fcIn, 0, fIn.length());
// rafOut.close();
// rafIn.close();
fos.close();
fis.close();
}
}
[/code][/quote]
Desculpa ressucitar esse tópico, é que pesquisando aqui no GUJ achei esse tópico, e eu estou tentando fazer cópia de arquivo utilizando o mesmo método desse código que eu cotei, o problema eh que quando o arquivo a ser copiado é de uns 500MB, o código não funciona, da um OutOfMemory como era de se esperar.
Qual seria uma solução para que isso não aconteça? Eu estava copiando tudo blz com aquele esquema padrão de Input/OutputStream while read/write, só que parece que esse transferFrom é infinitamente mais rápido para fazer as cópias. Alguém pra me dar uma luz?
[]'s
Acho que o caso é por causa da memoria do Java que excedeu enquanto carregava o arquivo
procura no guj como forçar a JVM ter uma memoria maior dai você pode aumentar para uns 600 Mb
msg duplicada …
Hmm… aumentar a memo da JVM não iria adiantar pq se eu quisesse copiar um arquivo de uns 3giga por exemplo, iria dar a mesma m#$*& no final das contas…
Consegui fazer a cópia utilizando bytebuffer, peguei o código de um exemplo colocado aqui no fórum mesmo
ByteBuffer bb = ByteBuffer.allocateDirect(2048);
FileChannel from = ...
FileChannel to = ...
bb.clear();
while(from.read(bb) != -1)
{
bb.flip();
to.write(bb);
bb.clear();
}
Galera sei que o topico é antigo e talvez vocês nem lembrem como faz isso mais srrsrs
Mas preciso da ajuda de vocês, creio que seja uma falta de entendimento mesmo com as classes e os métodos, mas vamos lá.
Preciso transferir um arquivo da maquina do cliente para o FTP. Acontece que para transferir um arquivo de 2 MB ocorre uma tremenda demora, de quase 10 min. Estava vendo a função de dividir os arquivos em bytes, mas não sei bem aonde implementar esta parte de código na minha classe, estou apanhando muito srrs.
Sou novo em java, por isso tenho este tipo de duvidas ! Segue abaixo minha classe com a parte dos bytes.
Desculpem pela incompreensão ! Talvez minha pergunta seja ridícula.
[code]public class ClienteFTP {
private String servidor = "Francatalogos FTP";
FTPClient ftp = new FTPClient();
FTPClientConfig config = new FTPClientConfig();
public void inicia(String localArquivo, String nomePasta, String nomeArquivo) {
ftp.configure(config);
try {
int responder;
//Conecta e loga no FTP
ftp.connect("ftp.francatalogos.com.br");
ftp.login("francatalogos", "mh240970");
System.out.print(ftp.getReplyString());
responder = ftp.getReplyCode();
ftp.enterLocalPassiveMode();
ftp.setFileTransferMode(FTPClient.BINARY_FILE_TYPE);
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
byte[] divisao = new byte[1024];
int i = 0;
//Obtem o local do arquivo
FileInputStream file = new FileInputStream(localArquivo);
while ((i = file.read(divisao)) > -1) {
for (int j = 0; j < i; j++) { // este é a parte do método que encontrei para fazer a conversão dos bytes, devo implementar o codigo abaixo aqui dentro ?
}
}
//Verifica se o caminho/pasta existe.
boolean isDirectory = ftp.changeWorkingDirectory("T&TSistemas/" + nomePasta);
if (!isDirectory) {
//se não existir cria a pasta
ftp.makeDirectory("T&TSistemas/" + nomePasta);
}
ftp.changeWorkingDirectory("T&TSistemas/" + nomePasta);
File f = new File(localArquivo);
nomeArquivo = f.getName();
salvaArquivo(nomeArquivo, file);
if (!FTPReply.isPositiveCompletion(responder)) {
ftp.disconnect();
JOptionPane.showMessageDialog(null, "Não foi possível conectar a " + servidor + ".");
System.exit(1);
}
ftp.logout();
} catch (IOException io) {
io.printStackTrace();
JOptionPane.showMessageDialog(null, "Erro ServidorFTP" + io);
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
System.out.println("Desconectado !");
} catch (IOException io) {
}
}
}
}
private void salvaArquivo(String nomeArquivo, FileInputStream file) throws IOException {
//Verifica se o arquivo foi salvo(storeFile).
if (ftp.storeFile(nomeArquivo, file)) {
JOptionPane.showMessageDialog(null, "Arquivo armazenado com sucesso.");
} else {
JOptionPane.showMessageDialog(null, "Não foi possível armazenar o arquivo.");
ftp.logout();
ftp.disconnect();
}
}
}[/code]