File I/O Restrictions
cannot read or write from the disk on the machine where
the browser is running. (unless you request and are granted
permission)
You can read or write (theoretically) to
files on the system where the applet is originally stored.
you cannot read/write to other remote servers (unless
you request and are granted permission)
The steps
- Unlike File I/O in a application that is doing file
I/O with the machine it is running on, you can be default only do file
I/O with the Applet Server. Hence you need to do file I/O with
a remote server. As a consequence, getting the stream
involves a few additional steps using the java.net package:
Applet File Input: Reading
1)Create an instance of URL pointing to the url of
the file
2)Create an instance of URLConnection class by calling
the
openConnection() method of your URL instance
from step 1
3)Create an instance of InputStream class associated
with your
URLConnection object of step 2 by calling
its method
getInputStream() (see
below for more details on writing)
Example Code for File Reading
Example Applet Reading a File (bring up Java
Console to see results)
Data File did reading from
Applet Output: Writing
Reading is easy, but to write, the server must support your connection.
What does this mean? Well, the URL we used to read data from a file above
used the scheme HTTP. But HTPP is a protocol that only allows downloading
(i.e. reading), but, not uploading (i.e. writing). So, we can't use this
here.
There are 3 Solutions to accomplish writing to a file on the server
the Applet resides on.
- Solution 1 = The first solution is to use a protocol like FTP for
your URL as it does support uploading (i.e. writing). But, there are
some bugs
with specifying a non-anonymous ftp URL as well as other problems.
So, while I have given you the code below, it doesn't work..but, they
are attempting to add this to the next version of Java. Note: the
fix to these bugs is to compile with version 1.3 and have a browser
who's JVM is 1.3 standard!!!!!!
So, the are 2 othere solutions, will support uploading on the server
via:
- Solution 2 = server has CGI application that can connect to via
http URL and send information to it. The CGI application runs on the
server and then writes the data for the Applet to the data file.
- Solution 3 = Forget using the URL class which has trouble supporting
non-anonymous ftp connections, and instead use the alternative Socket
class in java.net to form a FTP-based connection to your datafile.
Solution Synopsis
|
Solution 1
- does not work on our Newton
server with most Browsers due to Bug in Java.
- directly open up a connection to the data file on the server
using URL, and URLConnection from Applet.
- Note: URL should be made with an uploading scheme like ftp and
not http.
|
Solution 2
- works only with Internet
Explorer on our Newton server.
- Reason does not work on Netscape
is unknown but, is a reported bug at java.sun.com
- open up a connection to a separate Server Application
(e.g. Perl script) on the server using URL, and URLConnection
from Applet. Via writes send data to Server Application. Server
Application actually performs the output to a data file on the
server
|
Solution 3
- works with both I.E and Netscape
on our Newton server
- Use Socket class instead of URL and URLConnection to open a
connection to write using FTP to the data file on the server from
the Applet.
|
OUR SITUATION FOR NEWTON SERVER:
Newton will work with IE browser via Solution
2 and both browsers via Solution 3.
SOLUTION 1
Directly from Applet
|
SOLUTION 2
Using a SEPARATE Server Application in Perl to Perform Writing:
|
Idea:
- As in the previous example of file reading, open connection
to data file directly from Applet using URL and URLConnection.
- Note: URL should be made with an uploading scheme like ftp and
not http.
- NOTE: There are a number of reported
bugs (search on ftp URL at javasoft.com ) with creating a
URL with ftp using a login and password....hence this example
uses http. BUT, it should use ftp for uploading. Because of bugs,
WILL NOT WORK!!!! (need latest version 1.3 for supposed fix....but,
your browser's JVM should also be of this version).
|
Idea:
- One way of working around access restrictions is to use a separate
server application that executes on the applet's host. Thus,
even with these firewall, etc. restrictions on writing, you can
use the server application to recieve the data and write to the
file. This application can be written in Java or any other language
like Perl. In the case of Java you need to actually, use sockets
to communicate with it. In the case of Perl, it is a bit easier.
|
Process:
- Open up direct outputstream to the datafile from Applet thru
a URLConnection.
- Writes out data using this outputstream.
|
Process:
- Opens up an outputstream to a separate Server Application
from Applet thru a URLConnection. Server Application, here in
Perl must be on host machine Applet resides on.
- Server Application is actually responsible for recieving output
from the Applet and then parsing this output and writing the information
to a data file on the server.
- "Send" information to the Server Application from
the Applet by writing out data to outputstream of step 1...that
is connected to the Server Application.
|
EXAMPLE
|
EXAMPLE
|
Solution 3:
Directly from Applet using Sockets and FTP
|
Idea:
- Another way of working around access restrictions is to use
the Socket class in java.net package instead of URL and URLConnection.
By opening a Socket that uses the FTP protocol we can transfer
data to the file.
- This requires the Applet web-server is also an ftp-server.
- The data file is located in a directory where you have ftp access
(and you know the login and password for an account which can
access it).
|
Process:
- The solution code below uses 2 classes, but you could do this
all inside of a single class if desired.
- The applet is really simple and creates an instance of a class
called LinLyn that was retrieved from the internet at http://www.afu.com/jdownload.html
- This class LinLyn has comments in the header showing how to
use it. It uses Sockets to open connections to the ftp server
(at the port number referenced by the class variable CNTRL_PORT
). See the code for details.
|
EXAMPLE
|
POTENTIAL Problem with Applet
Writing to a File on Host Server
Note:
Depending on the networking environment an applet is loaded into, and
depending on the browser that runs the applet, an applet might not be
able to communicate with its originating host. For example, browsers running
on hosts inside firewalls often cannot get much information about the
world outside the firewall. As a result, some browsers might not allow
applet communication to hosts outside the firewall. This restriction can
be only on writing and not on reading files.
|