Olá pessoal… Prontos para a minha primeira pergunta aqui no fórum??? hehehe…
A mais ou menos um ano acompanho vcs off, e TUDO o que eu aprendi de java eu encontrei aqui. Mas agora estou com uma dúvida sobre algo e gostaria de ajuda de vcs, se couber.
Primeiramente vou dizer que meu tópico será grande, então se estiver sem tempo… hehehe…
Bom, estou fazendo um programa para usar em meu serviço (pra facilitar minha vida), que copie um arquivo de uma máquina e mande para outra, via tcp.
Eu achei inúmeros códigos, todos funcionais, todos copiam, mas tem UMA ÚNICA COISA que eu quero e que eles não tem.
Eu preciso copiar um arquivo MANTENDO a MD5 do mesmo. Eu percebi que sempre que eu copiava um arquivo a md5 mudava, pois não era “copiado”, mas sim criado um novo com o mesmo conteúdo. Isso dentro da mesma máquina, ou na mesma rede, eu consegui resolver com o seguinte código:
[code]import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
public class exemploParaOGuj {
public static void copy(String fOrigem, String fDestino, int numeroPartes) throws FileNotFoundException, IOException {
FileInputStream origem = new FileInputStream(fOrigem);
FileOutputStream destino = new FileOutputStream(fDestino);;
FileChannel fcOrigem = origem.getChannel();
FileChannel fcDestino = destino.getChannel();
fcOrigem.transferTo(0, fcOrigem.size(), fcDestino);
destino.close();
origem.close();
}
}[/code]
Bom, na rede local tá belezinha, O ARQUIVO COPIADO TEM A MD5 IDÊNTICA AO ORIGINAL, o que seria diferente se eu usasse
[code]public void teste() throws FileNotFoundException, IOException{
File file = new File(“teste.txt”);
File fileout = new File(“testeOut.txt”);
FileInputStream fis = new FileInputStream(file);
FileOutputStream fos = new FileOutputStream(fileout);
int dataByteSize = 1024;
int count = 0;
byte[] dataBytes = new byte[dataByteSize];
int nread = 0;
while ((nread = fis.read(dataBytes)) != -1) {
fos.write(dataBytes, 0, nread);
};
}[/code]
Enfim, para a rede local está tudo ok.
Já para a rede em modo servidor, eu achei os seguintes códigos aqui mesmo no guj:
[code]import java.io.;
import java.net.;
public class Server {
public static void main(String[] args) {
int port = 5678;
String outFile = "testeServer.rar";
String inFile = "I:\\testeCliente.rar";
try {
ServerSocket MyService = new ServerSocket(port);
System.out.println("Aguardando conexão...");
Socket serviceSocket = MyService.accept();
File file = new File(outFile);
DataInputStream input = new DataInputStream(new FileInputStream(file));
DataOutputStream output = new DataOutputStream(new FileOutputStream(inFile));
DataInputStream inputMsg = new DataInputStream(serviceSocket.getInputStream());
DataOutputStream outputMsg = new DataOutputStream(serviceSocket.getOutputStream());
System.out.println("IP: " + inputMsg.readUTF());
System.out.println("Nome: " + inputMsg.readUTF());
byte[] cache = new byte[10240];
int size = 0;
while ((size = input.read(cache)) > -1) {
outputMsg.write(cache, 0, size);
}
int readByte = inputMsg.read();
while (readByte != -1) {
output.write((byte) readByte);
readByte = inputMsg.read();
}
inputMsg.close();
outputMsg.close();
input.close();
output.close();
serviceSocket.close();
MyService.close();
} catch (Exception e) {
System.err.println(e.toString());
}
}
}[/code]
e
[code]import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.nio.channels.SocketChannel;
public class Client {
public static void main(String[] args) {
int port = 5678;
InetAddress ia = null;
try {
ia = InetAddress.getLocalHost();
} catch (UnknownHostException e) {
e.printStackTrace();
}
//String IP = ia.getHostAddress();
String IP = "localhost";
String inFile = "D:\\testeServer.rar";
String outFile = "testeCliente.rar";
try {
Socket MyCliente = new Socket(IP, port);
File file = new File(outFile);
DataInputStream input = new DataInputStream(new FileInputStream(file));
DataOutputStream output = new DataOutputStream(new FileOutputStream(inFile));
DataInputStream inputMsg = new DataInputStream(MyCliente.getInputStream());
DataOutputStream outputMsg = new DataOutputStream(MyCliente.getOutputStream());
outputMsg.writeUTF(ia.getHostAddress());
outputMsg.writeUTF(ia.getHostName());
int readByte = inputMsg.read();
while (readByte != -1) {
output.write((byte) readByte);
readByte = inputMsg.read();
}
byte[] cache = new byte[10240];
int size = 0;
while ((size = input.read(cache)) > -1) {
outputMsg.write(cache, 0, size);
}
inputMsg.close();
outputMsg.close();
input.close();
output.close();
MyCliente.close();
} catch (Exception e) {
System.err.println(e.toString());
}
}
}[/code]
esse código é funcional: COPIA BELEZINHA, mas por ele usar InputStreams ele cria um arquivo novo com o mesmo conteúdo (MUDA A MD5, O QUE EU NÃO QUERO - NÃO POSSO).
Eu estou pensando em pegar o arquivo a ser copiado, colocar dentro de um arquivo ZIP (já tenho pronto), transferir, retirar do arquivo zip e depois verificar a MD5, mas isso demoraria muito, pois ao invés de apenas TRANSFERIR, eu teria que fazer mais dois processos, o de compactação e o de descompactação.
A pergunta é: tem como fazer essa transferência via net (servidor - cliente) sem perder a MD5??? Pois eu acho que vai ser muito GAMBIARRENTO o programa se eu tiver que usar ZIP pra manter minha MD5 (o meu programa usa a MD5 para várias coisas, inclusive pra testar a integridade do arquivo.
Agradeço se alguém tiver alguma dica de pelo menos “onde eu devo procurar”…
Obrigado.