browse: forums | FAQ
Connecting Tech Pros Worldwide

Hey there! Do you need Java help?

Get answers from our community of Java experts on BYTES! It's free.

Problem with FileWriter class

Nimmi Srivastav
Guest
 
Posts: n/a
#1: Jul 17 '05
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:
\
/
:
*
?
<[color=blue]
>[/color]
|


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());
}
}
}



FGB
Guest
 
Posts: n/a
#2: Jul 17 '05

re: Problem with FileWriter class


Nimmi Srivastav wrote:[color=blue]
> 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
>
>
>[/color]

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

Nimmi Srivastav
Guest
 
Posts: n/a
#3: Jul 17 '05

re: Problem with FileWriter class


FGB <au714@osfn.org> wrote in message news:<H4BSa.3462$If5.934@lakeread06>...[color=blue]
> Nimmi Srivastav wrote:[color=green]
> > 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
> >
> >
> >[/color]
>
> 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[/color]


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
Sandeep Sharma
Guest
 
Posts: n/a
#4: Jul 17 '05

re: Problem with FileWriter class


nimmi_srivastav@yahoo.com (Nimmi Srivastav) wrote in message news:<8b0c42d.0307231102.1482972@posting.google.co m>...
[color=blue]
> 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[/color]

Nimmi,

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

Regards,
Sandeep
Weichao Wang
Guest
 
Posts: n/a
#5: Jul 17 '05

re: Problem with FileWriter class


nimmi_srivastav@yahoo.com (Nimmi Srivastav) wrote in message news:<8b0c42d.0307200758.64d76213@posting.google.c om>...[color=blue]
> if((c = (char) ret) != '\n')
> {
> urlAddr.append(c);
> continue;
> }[/color]

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
Roedy Green
Guest
 
Posts: n/a
#6: Jul 17 '05

re: Problem with FileWriter class


On 18 Aug 2003 05:36:59 -0700, weichao_wang@yahoo.de (Weichao Wang)
wrote or quoted :
[color=blue]
>nimmi_srivastav@yahoo.com (Nimmi Srivastav) wrote in message news:<8b0c42d.0307200758.64d76213@posting.google.c om>...[color=green]
>> if((c = (char) ret) != '\n')
>> {
>> urlAddr.append(c);
>> continue;
>> }[/color][/color]

Check out the PrintWriterPlus class in the hunkio package.

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

--
Canadian Mind Products, Roedy Green.
Coaching, problem solving, economical contract programming.
See http://mindprod.com/jgloss/jgloss.html for The Java Glossary.
Thomas Weidenfeller
Guest
 
Posts: n/a
#7: Jul 17 '05

re: Problem with FileWriter class


Roedy Green <roedy@mindprod.com> writes:[color=blue]
> Check out the PrintWriterPlus class in the hunkio package.
>
> See http://mindprod.com/products.html#HUNKIO[/color]

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
Closed Thread