views:

1235

answers:

6

I have the directory mapped on my machine so that I can browse and write to it via Windows explorer. I would like to write files via java.

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

f.createNewFile();

I am getting the following error:

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)

Is there any way to write files to a mapped directory that has the http:// in front? Because thats the way the directory is provided to me. It is a virtual directory that an oracle database is creating.

+3  A: 

I'm not really sure what I'm talking about here (not a Java guy) but although you may "have it mapped" you're passing in a URL instead of an expected file system path. If (for example) you have a mapped drive under Windows, use the drive letter assigned.

Andrew Flanagan
I cannot access it via a letter drive I must use dev1:8080/data/lo/xml
joe
+3  A: 

Your trying to pass the location URI with a protocol. You need to pass location sans protocol:

\\dev1\data\xml\myTestFile123.xml

entens
I was only able to map it so it says dev1:8080/data/lo/xml
joe
If your having problems getting the right string for the URI, then I would navigate to the file in explorer, then copy the directory out of the address bar.
entens
the location http://dev1:8080/data/xml/ came from the url bar
joe
+1  A: 

How have you mapped the file in Windows? I suspect it is not using the HTTP protocol, because no such mechanism exists for creating files. So you will not get anywhere using "http" as your protocol.

Find the mapped drive letter, you probably want something more like:

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

If you are using Samba you might want to take a look at JCIFS then you can use:

smb://server/share/
Nosrama
A: 

Use the local path

If you can see myTestFile123.xml in windows explorer, then right-click it and copy the Location: property value. Then use exactly this as the new File() argument, but either double up the backslashes or change them to forward slashes.

DigitalRoss
when I right click it says dev1:8080/data/lo/xml
joe
Oh...when you said "windows explorer" you really meant "internet explorer"?
DigitalRoss
no its windows explorer. Mapped drive.
joe
+1  A: 

Instead of trying to using a mapped drive letter (seems very weak), have a look at JCIFS:

JCIFS is an Open Source client library that implements the CIFS/SMB networking protocol in 100% Java. CIFS is the standard file sharing protocol on the Microsoft Windows platform (e.g. Map Network Drive ...). This client is used extensively in production on large Intranets.

This piece of code shows how to Logon to a Remote Machine and Write File using jCifs (credits to 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");
    }
}

Edit: As mentioned in a comment added to the original question, my understanding is now that you are trying to write to a WebDAV directory. I'll cover the WebDAV topic in another answer for more clarity.

Pascal Thivent
Thanks this may help, although I still need to find a way to use http:// Anyway.. what is smb: do I have to have the drive mapped?
joe
You do not have to have http:// in there. HTTP is not a protocol for working with remote file systems. SMB is a different protocol, which is designed for working with remote file systems, and is the one that Pascal is telling you how to use.
jprete
Well my remote directory is a virtual directory created by an oracle database, it is not really there.
joe
+2  A: 

My understanding is that you are trying to write to an Oracle XML DB Repository. Oracle XML DB Repository is a feature that has been introduced by Oracle9i Database Release 2 for XML storage and that can be accessed through FTP or HTTP/WebDAV. In your case, it looks like you're trying to use HTTP/WebDAV.

As explained in the WedDAV page on Wikipedia:

WedDAV is a set of extensions on top of HTTP that allows users to edit and manage files collaboratively on remote World Wide Web servers.

In other words, adding files, deleting them, renaming them, etc in a WebDAV repository is done using HTTP words: PUT, DELETE, MOVE, etc (see RFC 4918 for more details).

Consequently, interacting with a WebDAV server can be done using classes from java.net.

Or you could use a higher level API like Jakarta Commons HttpClient.

Or you could use a Java WebDAV client like the one provided by the Slide project. This article shows how to do it and it looks simple. However, as the Slide project is now retired, I wouldn't recommend it.

Luckily (or not), the Apache Jackrabbit project is an alternative to Slide... but AFAIK the WebDAV support in Jackrabbit is more focused on server-side implementations than clients. Anyway, you'll find some code samples in this thread on the jackrabbit-users mailing list.

I think I'd choose HttpClient and use the Tutorial or the Sample Code as starting points.

Pascal Thivent