InputStream, InputSource, File [RESOLVIDO]

5 respostas
gustavocsb

Olá a todos!

Estou precisando ler uma String onde seu conteúdo é no formato de um arquivo XML e me é enviada via Socket.

O que eu precisaria fazer é:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("meuArquivo.xml");

Porém, não existe um arquivo XML físico, apenas uma String com seu conteúdo.
Vendo a API, percebi que o parâmetro do método parse pode ser um InputStream, um InputSource ou um File.

A minha dúvida está justamente em como transformar essa String que estou recebendo em um desses 3 objetos.

Obrigado desde já.
Abraços.

5 Respostas

tnaires

É enviado via socket? Então passar como parâmetro para o método parse uma chamada a socket.getInputStream() não adianta?

gustavocsb

Hhmm… vou testar aqui e já já aviso.
:slight_smile:

gustavocsb

É… funcionou nao… :?

Executo o seguinte trecho

public void run() {
		try {
			BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			StringBuffer stringBuffer = new StringBuffer();
			char[] buffer = new char[64 * 1024];
			
			int length = bufferedReader.read(buffer);
			while (length != -1) {
				stringBuffer.append(buffer, 0, length);
				length = bufferedReader.read(buffer);
			}
			
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			DocumentBuilder builder = factory.newDocumentBuilder();
			
			@SuppressWarnings("unused")
			Document document = builder.parse(socket.getInputStream());
			
			callback.receive(stringBuffer.toString());
		} catch (Exception e) {
			callback.reportException(e);
		}
	}

e recebo a seguinte mensagem na linha do parse:

[Fatal Error] :-1:-1: Premature end of file.
tnaires
Não, não :D Você não pode chamar o getInputStream() duas vezes. Tente isso:
public void run() {  
    try {
        // Aqui estão todos os dados que estão chegando via socket.
        InputStream is = socket.getInputStream();

        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(is));
        StringBuffer stringBuffer = new StringBuffer();
        char[] buffer = new char[64 * 1024];

        int length = bufferedReader.read(buffer);

        while (length != -1) {
            stringBuffer.append(buffer, 0, length);
            length = bufferedReader.read(buffer);
        }  

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();

        @SuppressWarnings("unused")  
        Document document = builder.parse(is);

        callback.receive(stringBuffer.toString());
    } catch (Exception e) {
        callback.reportException(e);
    }
}
Veja se você ainda precisa transformar tudo pra String. Caso não precise, seu código pode ficar simplesmente assim:
public void run() {  
    try {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();

        @SuppressWarnings("unused")  
        Document document = builder.parse(socket.getInputStream());
    } catch (Exception e) {
        callback.reportException(e);
    }
}
Abraços
gustavocsb

Funcionou !!
:smiley: :smiley: :smiley: :smiley:

Obrigadão pela ajuda Tarso!

Criado 6 de novembro de 2008
Ultima resposta 6 de nov. de 2008
Respostas 5
Participantes 2