Problem with FileWriter class

N

Nimmi Srivastav

Brief:- I am having trouble getting a FileWriter to write to a
non-existent file if I instantiate the FileWriter with a String that
is manipulated at run time. It works fine with a hard-coded char
array. The error that I get in the former case is:
(The specified path is invalid)tion



Detailed:- This is my first serious foray into Java ----- I recently
completed the Hello World program ----- so my apologies if I am not
doing things the right way (which, I am sure is the case).


I am trying to write a Java application that reads a list of URLs from
a file and accesses each URL and stores it associated web-page locally
on the file system. The filename associated with each webpage is the
same as its URL except that the following characters are replaced by
the '^' character:
\
/
:
*
?
<|


I am not getting any error if I uncomment the line that says
//[UNCOMMENT ME] and comment the immediately preceding line (which
says [COMMENT ME]).

I was also able to successfully get the application to work by
maintaining an array of hard-coded strings and indexing into that
array for each iteration of the main loop.


Here's the program listing. Again my apologies for not doing things
the "right" way:


=======================Program Listing begin ==================


import java.net.*;
import java.io.*;

public class URLDownloader
{
public static void main(String[] args) throws Exception
{
if(args.length == 0)
{
System.out.println("usage: <this-utility> <filename>");
System.out.println("Exiting.....");
return;
}


File inputFile = new File(args[0]);

FileInputStream finStm = new FileInputStream(inputFile);
int ret;

StringBuffer urlAddr = new StringBuffer("");
char c;

DataInputStream inStm = null;

try
{
while ((ret = finStm.read()) != -1)
{
if((c = (char) ret) != '\n')
{
urlAddr.append(c);
continue;
}

System.out.println(urlAddr);
int len = urlAddr.length();
if(len <= 1)
continue;

URL thisURL = new URL(urlAddr.toString());
try
{
inStm = new DataInputStream(thisURL.openStream());
}
catch (Exception xcpn)
{
// FileNotFoundException, ProtocolException,
ConnectionException
urlAddr.delete(0, len);
System.out.println("Error: " + xcpn.toString());
continue;
}

String urlAddrStr = new String(urlAddr);
StringBuffer urlFile = new StringBuffer(urlAddrStr);
for(int i=0; i < urlFile.length(); i++)
{
char ch = urlFile.charAt(i);
switch(ch)
{
case '/':
case '\\':
case ':':
case '*':
case '?':
case '\"':
case '<':
case '>':
case '|':
urlFile.setCharAt(i, '^');
break;

default:
break;
}
}

String fileName = new String(urlFile);
System.out.println(fileName);
FileWriter fWriter = new FileWriter(fileName); // [COMMENT ME]
//[UNCOMMENT ME] FileWriter fWriter = new
FileWriter("http^^^www.yahoo.com");

String inputLine;

while ((inputLine = inStm.readLine()) != null)
{
char[] bytes = inputLine.toCharArray();
fWriter.write(bytes);
}
fWriter.close();

urlAddr.delete(0, urlAddr.length());
urlFile.delete(0, urlFile.length());
}
}
catch (Exception e)
{
System.out.println("Error: " + e.toString());
}
}
}
 
F

FGB

Nimmi said:
Brief:- I am having trouble getting a FileWriter to write to a
non-existent file if I instantiate the FileWriter with a String that
is manipulated at run time. It works fine with a hard-coded char
array. The error that I get in the former case is:
(The specified path is invalid)tion

It worked ok for me. I uncommented the line that creates fileName(s)
and used the a "data file" with the following URLs:

http://java.sun.com
http://groups.google.com



Not sure what is happening for you...


Fred Burkley
 
S

Steve Horsley

Brief:- I am having trouble getting a FileWriter to write to a
non-existent file if I instantiate the FileWriter with a String that is
manipulated at run time. It works fine with a hard-coded char array. The
error that I get in the former case is:
(The specified path is invalid)tion



Detailed:- This is my first serious foray into Java ----- I recently
completed the Hello World program ----- so my apologies if I am not doing
things the right way (which, I am sure is the case).


I am trying to write a Java application that reads a list of URLs from a
file and accesses each URL and stores it associated web-page locally on
the file system. The filename associated with each webpage is the same as
its URL except that the following characters are replaced by the '^'
character:
\
/
:
*
?
<|

I am not getting any error if I uncomment the line that says //[UNCOMMENT
ME] and comment the immediately preceding line (which says [COMMENT ME]).

I was also able to successfully get the application to work by maintaining
an array of hard-coded strings and indexing into that array for each
iteration of the main loop.


Here's the program listing. Again my apologies for not doing things the
"right" way:
<snip>

I suspect you have the wrong file name. Instead of using:
System.out.println(fileName);
try using:
System.out.println("fileName = '" + fileName + "'");
This should show up any unexpected characters such as '\r'.

If you want to read a text file, you would be better off treating it as a
text file and using a Reader. This way you will more likely get the
characterset right, and handle line endings better.


Steve
 
N

Nimmi Srivastav

FGB said:
It worked ok for me. I uncommented the line that creates fileName(s)
and used the a "data file" with the following URLs:

http://java.sun.com
http://groups.google.com



Not sure what is happening for you...


Fred Burkley


Since the original posting, I have tried this program on Solaris. It
works fine on Solaris, but on Windows (98 & 2000) I keep getting error
messages. Could someone kindly try it out on Windows and share their
experience please?

--NS
 
S

Sandeep Sharma

Since the original posting, I have tried this program on Solaris. It
works fine on Solaris, but on Windows (98 & 2000) I keep getting error
messages. Could someone kindly try it out on Windows and share their
experience please?

--NS

Nimmi,

I tried your program on Solaris and Windows, and I ran into similar
problems on Windows. It worked fine on Solaris.

Regards,
Sandeep
 
W

Weichao Wang

if((c = (char) ret) != '\n')
{
urlAddr.append(c);
continue;
}

Replace the code above with the following, it may work on Windows:

if((c = (char) ret) != '\r')
{
urlAddr.append(c);
continue;
} else {
ret = finStm.read(); // skip '\n'
}

The reason is that the line end is '\n' on Unix whereas it is '\r\n'
on Windows/DOS.
I have not tested the code (because of firewall?). If someone has tested
it, please post the result here.

Weichao
 
T

Thomas Weidenfeller

Roedy Green said:
Check out the PrintWriterPlus class in the hunkio package.

See http://mindprod.com/products.html#HUNKIO

Roedy, if you look at the original, very old posting, you will see that
the problem is not the FileWriter. There are a number of problems in
the original code, including:

- Using an InputStream and not a Reader to read some text file

- Doing line-by-line reading via the InputStream with a home-made EOL
detection that will break on any file not using the Unix convention,
instead of using a LineReader.

- Usage of a DataInput stream for reading from a URL, serving no
apparent purpose other then messing up the input data.

- Improper handling of empty lines (might be an artefact of the
problems with handling EOL).

- Rather strange mixture of using String and StringBuffer, including
converting a StringBuffer to a String and back to a StringBuffer on
the next line, multiple times converting the same StringBuffer (with
the same contents) to a String, etc.

- Improper attempt to convert a URL to a local file name (here the
broken EOL detection can sneak control chars into the name, and some
valid URL chars are not handled at all, like '=', '&', or '%').

And the control char \r from the name is why the creation of the
FileWriter breaks.

- Usage of the deprecated DataInputStream.readLine() to read a String.

- Usage of FileWriter to write bytes - which have just been converted
from the String gotten from DataInputStream.readLine() ...

- Manual memory handling: Manually clearing existing objects instead of
just creating new ones.

And I might have missed a few things.

In other words: THAT CODE DESERVES TO BE TAKEN OUT AND SHOT! The
remains have to be treated as toxic waste. Please, leave it alone.

/Thomas
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Similar Threads


Members online

Forum statistics

Threads
473,768
Messages
2,569,575
Members
45,053
Latest member
billing-software

Latest Threads

Top