Pergunta

Eu tenho o diretório mapeado na minha máquina para que eu possa navegar e escrever para ela através do Windows Explorer. Eu gostaria de escrever arquivos via java.

File f = new File("http://dev1:8080/data/xml/myTestFile123.xml");

f.createNewFile();

Estou recebendo o seguinte erro:

Exception in thread "main" java.io.IOException: The filename, directory name, or volume label syntax is incorrect
    at java.io.WinNTFileSystem.createFileExclusively(Native Method)
    at java.io.File.createNewFile(Unknown Source)
    at MainTest.createTestFile(MainTest.java:156)
    at MainTest.main(MainTest.java:72)

Existe alguma maneira para gravar arquivos para um diretório mapeada que tem a http: // na frente? Porque isso é a forma como o diretório é fornecido para mim. É um diretório virtual que um banco de dados Oracle está criando.

Foi útil?

Solução

O meu entendimento é que você está tentando gravar em um A oracle XML DB Repository . A Oracle XML DB Repositório é um recurso que foi introduzido pela Oracle9i Database Release 2 para o armazenamento XML e que pode ser acessado através de FTP ou HTTP / WebDAV. No seu caso, parece que você está tentando usar HTTP / WebDAV.

Como explicado na página WedDAV na Wikipedia:

WedDAV é um conjunto de extensões no cima de HTTP que permite aos usuários editar e gerenciar arquivos de forma colaborativa em remoto servidores da World Wide Web.

Em outras palavras, adicionando arquivos, excluí-los, renomeá-los, etc em um WebDAV repositório é feito usando palavras http: PUT, apagar, mover, etc (ver RFC 4918 para mais detalhes).

Por isso, interagindo com um servidor WebDAV pode ser feito usando as classes de java.net.

Ou você poderia usar uma API de nível superior como Jakarta Commons HttpClient .

Ou você poderia usar um cliente Java WebDAV como os fornecidos pela projeto Slide. mostra esta artigo como fazê-lo e parece simples. No entanto, como o projeto de slides agora está aposentado, eu não recomendo.

Felizmente (ou não), o Apache Jackrabbit projeto é uma alternativa para deslizar ... mas AFAIK o apoio WebDAV no Jackrabbit é mais focado em implementações do lado do servidor do que clientes. De qualquer forma, você encontrará alguns exemplos de código em este segmento em a lista de discussão de usuários jackrabbit.

Eu acho que eu escolheria HttpClient e usar o Tutorial ou o Código de exemplo como pontos de partida.

Outras dicas

Eu não sou realmente certo o que eu estou falando aqui (não é um cara Java), mas embora você possa "ter mapeado" você está passando em uma URL em vez de um caminho de sistema de arquivo esperado. Se (por exemplo) você tem uma unidade mapeada no Windows, utilize a letra de unidade atribuída.

Seu tentando passar a localização URI com um protocolo. Você precisa passar protocolo localização sans:

\\ dev1 \ data \ xml \ myTestFile123.xml

Em vez de tentar usar uma letra de unidade mapeada (parece muito fraco), ter um olhar para JCIFS :

JCIFS é uma biblioteca cliente Open Source que implementa o CIFS / SMB protocolo de rede em Java 100%. CIFS é o protocolo padrão de compartilhamento de arquivos na plataforma Microsoft Windows (por exemplo Mapear unidade de rede ...). Este cliente é usado extensivamente na produção em grandes Intranets.

Esta peça de mostra o código como Logon para uma máquina remota e gravação de arquivos usando JCIFS (créditos para Muneeb Ahmad):

import jcifs.smb.NtlmPasswordAuthentication;
import jcifs.smb.SmbFile;
import jcifs.smb.SmbFileOutputStream;

public class Logon {
    public static void main( String argv[] ) throws Exception {
        String user = "user:password";
        NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(user);
        String path = "smb://my_machine_name/D/MyDev/test.txt";
        SmbFile sFile = new SmbFile(path, auth);
        SmbFileOutputStream sfos = new SmbFileOutputStream(sFile);
        sfos.write("Muneeb Ahmad".getBytes());
        System.out.println("Done");
    }
}

Editar : Como mencionado em um comentário adicionado à pergunta original, o meu entendimento é agora que você está tentando escrever para um diretório WebDAV. Vou cobrir o tema WebDAV em outra resposta de maior clareza.

Como você tem mapeado o arquivo no Windows? Eu suspeito que ele não está usando o protocolo HTTP, porque não existe tal mecanismo para a criação de arquivos. Então você não vai chegar a lugar nenhum com "http" como seu protocolo.

Encontre a letra da unidade mapeada, você provavelmente vai querer algo mais parecido com:

File f = new File("F:\\dir\\file.ext");

Se você estiver usando Samba que você pode querer dar uma olhada JCIFS então você pode usar:

smb://server/share/

Use o caminho local

Se você pode ver myTestFile123.xml No Windows Explorer, clique com o botão direito e copiar o valor da propriedade Location:. Em seguida, use exatamente isso como o novo argumento File (), mas de qualquer dobrar as barras invertidas ou alterá-los para barras.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top