ObjectStreams

Scenario: I have a Tomcat servlet engine running on a server.
Tomcat is connected to a MySQL database.
I have written an applet in Java which polls every 5 seconds (URLConnection)
to a servlet. The servlet replies whether there are updates available. When there are
updates available they get transmitted to the client. Think of thousands of objects that get transmitted to the client.
The communication process all runs with (zipped) ObjectOutputStream and ObjectInputStream.
Problem: The transfer speed is roughly in the beginning 1MB/s but the longer the client is connected and the more objects are streamed, the speed
drops down to 400 KB/s. This happends out of the blue. Also why is 1MB/s a limit? Why not 10MB or 50MB?
My question: Can someone summarize what steps Java does hardware-wise when using ObjectOutputStream and ObjectInputStream?
I've read the API and know the technique behind object serialization and how Java handles this all.
I am interested in knowing where the bottleneck lies. When I look at my CPU, it is barely in use. (10%).
When I look at RAM, I notice -nothing- is swapping. Disk I/O isn't extraordinairy high as well..
Finally as a sidenote, caching of ObjectStreams is unshared. Meaning objects arent cached.

Im guessing you're aiming at HttpURLConnection.
I'm not using that. Also not sure if that was an advise to start using it...
I've decided to add some code to give an impression how it works.
    private URLConnection CreateConnection(URL urlServlet) throws IOException
        URLConnection connection = urlServlet.openConnection();
        connection.setDoInput(true);
        connection.setDoOutput(true);
        connection.setUseCaches(false);
        connection.setRequestProperty("Content-Type", "application/x-java-serialized-object");
        return connection;
public static Poll doPollingRequest(URLConnection urlCon, Poll pollObj) throws ClassNotFoundException
        OutputStream outstream = null;
        Poll replyPoll = null;
        try
            outstream = urlCon.getOutputStream();
            GZIPOutputStream gout = new GZIPOutputStream(outstream);
            ObjectOutputStream oos = new ObjectOutputStream(gout);
            oos.writeObject(pollObj);
            oos.flush();
            oos.close();
            InputStream instr = urlCon.getInputStream();
            GZIPInputStream gin = new GZIPInputStream(instr);
            ObjectInputStream inputFromServlet = new ObjectInputStream(gin);
            replyPoll = (Poll) inputFromServlet.readObject();
            inputFromServlet.close();
            gin.close();
            instr.close();
        } catch (IOException ex)
            Logger.getLogger(Polling.class.getName()).log(Level.SEVERE, null, ex);
        } finally
            try
                outstream.close();
            } catch (IOException ex)
                Logger.getLogger(Polling.class.getName()).log(Level.SEVERE, null, ex);
        return replyPoll;
    }The doPollingRequest works with a "Poll" object. There are all kinds of objects that get streamed to update or alter the client after the client requests them.

Similar Messages

  • Communication between servlet & rich client - ObjectStream or OutputStream?

    Hi,
    I need to send a text file from a servlet to a rich client. Is it better to send it over OutpputStream or wrap it up as an Object(eg: StringBuffer) and send it over OutputStream?
    Will the performance be significantly be affected if I try to wrap the file into an object at the Servlet's end and send it over ObjectStream? We are planning to wrap all responses from the servlet into a generic response object (containing data, exceptions and error codes if any) and send it to the client
    Please advice. Thanks in advance!

    Using object streams will create some protocole overhead. But you can minimize the effect by using compression.
    Ex:- java.util.zip.GZIPOutputStream & GZIPInputStream
    If you have already decided to use a genaric responce object then it will be good to have a generic request object too that will make your communication more flexible.
    But remember when you are doing serialization you might get problems when having different java versions in different ends if your object structures use data structures provided by java API (Ex:- Collections). You can work arround this problem (In most cases) by implementing custom serialization using writeReplace and readResolve methods.

  • ObjectStream communication between servlet and rich client

    Hi,
    I need to send multiple objects from a servlet to a rich client.
    Is it possible to send 2 objects of different types at the same time - ie, a hashtable and a custom object by writing them one after another into the response's ObjectOutputStream?
    Also, if I have two vectors containing different object types, say a Vector of Strings and a Vector of custom objects, how do I read the ObjectStream at the client end to get these two objects? Do I read two Vectors from the ObjectInputStream and then check the contained object using instanceOf?
    In the above scenarios, is it better to wrap the entire set of objects with a serialized wrapper class and send that single object from the server to the client?
    Please advice. Thanks in advance!

    You can send any number of objects in a stream one after other. If they are in different types/classes then you have to be carefull when casting to the specific types at the other end becouse if you try to cast to wrong type you get a runtime exception.
    Normally when you receive the objects you will know in advande (programming time) which vector comes first in the stream so you can treat them acordingly.
    Since both of them are vectors you can cast them to vector references at the read end and can tread the elements of the first vectors as strings and the elements of the other vectors as something else provided that the client always send the string vector first.
    Whether to make it a single object or ot is a design decision that you have to make. It it make sence to put those two vectors together(logically related) then its better to do so.

  • Objectstreams... how do they work???

    Hi,
    I am trying to write a program that uses objectstreams but i can't get it to work properly. I have found about the initialisation-sequence but i still get a streamcoprruptedexception. I am wondering if I should do something extra for it to work? who has tips and tricks on the matter???
    thanx

    public void run() {
            String Str;
            Object o;
            try {
                //Send(server.WelcomeMsg);
                while ((o = ois.readObject()) != null) {
                    //System.out.println(Str);
                    Str = (String) o;
                    if ("quit".equals(Str)) break;
                    try {
                        String Params[] = Str.split(" ");
                        for(int i=0;i<ActionMap.size();i++) {
                            //System.out.println((String)((Event)(ActionMap.get(i))).Name);
                            Event e = (Event)ActionMap.get(i);
                            if (Params[0].equals(e.Trigger)) {
                                e.actionPerformed(Params);
                                if ((Params[0].startsWith("$")) && ("end".equals(Params[1]))) {
                                    ActionMap.remove(i);
                                break;
                    } catch (Exception ex) {ex.printStackTrace(); }
            } catch (Exception ex ) { ex.printStackTrace(); }
            finally {
                System.out.println("Disconnected! ID="+ID);
                try {
                    socket.close();
                } catch (Exception ex) { ex.printStackTrace(); }
        }

  • Arraylist Improperly transfered through ObjectStreams

    code from client:
    public void listen()
           String readtext;
           field.setText("");
           System.out.println("Starting to Listen");
           while(!socket.isClosed()){
                     try{
                    dataType obj = (dataType)(in.readObject());
                    switch(obj)
                         case String:
                         readtext = in.readUTF();
                         field.append(readtext);
                         System.out.println("Text recieved: " + readtext);
                         break;
                         case Userlist:
                         System.out.println("USERLIST UPDATE");
                         setUserList((Userlist)(in.readObject()));
                         break;
                            } catch (IOException e){}
                            catch(ClassNotFoundException cnfe){cnfe.printStackTrace();}
      private void setUserList(Userlist ul)
           System.out.println((ul.size()) + " Users");
           userlist.removeAll();
           for(int i = 0; i < ul.size(); i++)
           userlist.add(((User)(ul.get(i))).getName());
      }code from server's client threads:ClientWorker(Socket client, Server s) {
       this.client = client;
       this.server = s;
    public void run(){
        String line;
        try{
          in = new ObjectInputStream(client.getInputStream());
          out = new ObjectOutputStream(client.getOutputStream());
        } catch (IOException e) {
          System.out.println("in or out failed");
          System.exit(-1);
        try{
         String userName = in.readUTF();
         This = new User(userName);
         server.UserNames.add(This);
         server.updateList();
         userset = true;
         } catch(IOException ieo){}
      ...code from server:  public void updateList()
           System.out.println((UserNames.size()) + " Users");
           for(int i = 0; i < Users.size(); i++)
           try{((ClientWorker)Users.get(i)).getOutputStream().writeObject(dataType.Userlist);
                ((ClientWorker)Users.get(i)).getOutputStream().writeObject(UserNames);
                catch(IOException e){e.printStackTrace();}
      }this code improperly prints the userlist (extends Arraylist) usernames object from the server to the clients
    for one client, userlist usernames.size() = 1, works for both server and client...
    for two clients:
    client one:
    userlist usernames.size() = 1 <- incorrect
    client two:
    userlist usernames.size() = 2 <- correct
    it seems that after the first time the server sends the client the list that the list doesnt change on the client even though it is sending the same userlist object to all the clients

    Your posted code is too fragmented to get clear understanding but if you are sending a same object repeatedly, try using writeUnshared() method instead of writeObject().

  • ObjectStream

    ApartmentWriterProgram asks information about appartments
    and saves it to a file with help of ApartmentFileHandler.
    There happens IOException in the method write(Apartment apartment)
    because class Apartment doesn't implement Serializable as it should (I use ObjectOutputStream).
    Apartment has given me in class-file, so I can't change it to implement Serializable.
    Is there still some other way to use Object Streams?
    Can I make a subclass that implements Serializable, does it help?
    I hope somebody will like to check my code. Thank you very much.
    I have javadocs and class-files about:
    Space
    public abstract class Space extends Object
    public Space()
    public abstract String getType()
    public abstract double getSize()Room
    public class Room  extends Space
    public Room(String type,
                double area)
    public String getType()
    public double getSize()Apartment
    public class Apartment extends Space
    public static final String KITCHEN
    public String getType()
    public double getSize()
    public Room[] getRooms()---------------------------------------------------
    java-code:
    public class ApartmentFileHandler extends Object implements Serializable {
        private OutputStream outStream;
        private ObjectOutputStream obStream;
        private String filePath;
            public ApartmentFileHandler(String filePath) {
               this.filePath = filePath;
    /** Writes the given apartment data in the file. If the file already
    exists, the old contents are overwritten.
    Parameters:
    apartment - the apartment to be written in the file
    Throws:
    IOException - if other problems arose when handling the file (e.g. the
    file could not be written)
            public void write(Apartment apartment)
               throws IOException {
               outStream = new FileOutputStream(filePath);
               obStream = new ObjectOutputStream(outStream);
               obStream.writeObject(apartment);
    java-code:
    import java.io.*;
    import java.util.*;
    public class ApartmentWriterProgram
    extends Object
        private KeyboardReader keyboardReader;
        private List roomsInList;
        private Room[] rooms;
        private int numberOfRooms;
        private String file;
              public ApartmentWriterProgram()
                this.keyboardReader = new KeyboardReader();
                this.roomsInList = new ArrayList();
                this.rooms = new Room [numberOfRooms];
    /** Runs the writer program. The program asks the user for some
    apartment data and a file name, and saves the data in the file. */
              public void run() {
                try {
                  numberOfRooms = keyboardReader.getInt("Give number of rooms: ");
                  for (int i =1; i<numberOfRooms+1; i++) {
                     String type =keyboardReader.getString("Give " +i+ ". " + "type of the room: ");
                     double area =keyboardReader.getDouble("Give " +i+ ". " + "area of room: ");
                     Room room= new Room(type, area);
                     this.roomsInList.add(room);
                  roomsInList.toArray(rooms);
                  Apartment apartment = new Apartment(rooms);
                  System.out.println();
                  file = keyboardReader.getString("Give name of the file: ");
                  ApartmentFileHandler handler = new ApartmentFileHandler(file);
                  handler.write(apartment);
               } catch (IOException ioe) {
                 System.out.println("Writing to file "+file+ " failed.");
             public static void main(String[]  args) {
                  ApartmentWriterProgram program = new ApartmentWriterProgram();
                  program.run();

    Dont you have the source of the 'Appartment' with you? If you have
    it, implement serialzable in it. You cant serialze and object unless
    it implement it.I have only a compiled class-file of "Appartmet". Not the source. :(
    I have javadoc of it, so I see which methods is there.
    If you cant do the above, then make another custom class that holds
    the information from the appartment(But it shouldnot have any
    reference to the appartment, rather has all the fields correspondig
    to it), and serialize this custom class..Good idea but
    this is quite complicated. I dont know how to do it.
    Or save the data in custom format.. ie, instead of serializng the
    whole 'appartment' class, get the required fields in it, and write
    those to the file.how to get the fields?

  • Help, experiencing minor bugs in program

    this is supposed to use rectangles and you should be able to load and save and they have colors and do a few more things with them, the loading is where it doesn't work.
    *-------------------------------------------------------------- 80 columns ---|
    * This is the main class for the application. It is built along the same
    * lines as the Editor class of project 1. It has a constructor, two instance
    * methods, and a static main()  that kicks the whole thing off.
    * The two instance methods are a menu creation method, and a menuItems
    * initialisation method.  The constructor instantiates the window
    * and sets up its internals by creating and installing the drawing canvas,
    * toolbar, and menus. All of the code works correctly as is and should
    * require no changes.
    * @version      1.1 15/04/01
    * @author       Julie Zelenski
    * @author       Restructured by Ian A. Mason
    * @see       javax.swing.JFrame
    * @see       javax.swing.JMenuBar
    * @see       javax.swing.JMenuItem
    * @see       javax.swing.JMenu
    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
    public class JavaDraw extends JFrame {
        final Toolbar toolbar = new Toolbar();
        final DrawingCanvas canvas = new DrawingCanvas(toolbar, 350, 350);
        final int menuMask = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
        final JMenuBar mb = new JMenuBar();
        final String[]
             fileMenuItems = {"Clear all", "Load file", "Save to file", "Quit"};
        final int[] fileKeyCodes = {KeyEvent.VK_N, KeyEvent.VK_O, KeyEvent.VK_S, KeyEvent.VK_Q};
        final ActionListener[] fileActionListeners = {
         new ActionListener() {
              public void actionPerformed(ActionEvent e) {
                  canvas.clearAll();}},
         new ActionListener() {
              public void actionPerformed(ActionEvent e) {
                  canvas.loadFile();}},
         new ActionListener() {
              public void actionPerformed(ActionEvent e) {
                  canvas.saveToFile();}},
         new ActionListener() {
              public void actionPerformed(ActionEvent e) {
                  System.exit(0);}}
        final String[] editMenuItems = {"Cut", "Copy", "Paste", "Delete"};
        final int[] editKeyCodes = {KeyEvent.VK_X, KeyEvent.VK_C, KeyEvent.VK_V, KeyEvent.VK_BACK_SPACE};
        final int[] editMenuMasks = {menuMask, menuMask, menuMask, 0};
        final ActionListener[] editActionListeners = {
         new ActionListener() {
              public void actionPerformed(ActionEvent e) { canvas.cut();}},
         new ActionListener() {
              public void actionPerformed(ActionEvent e) { canvas.copy();}},
         new ActionListener() {
              public void actionPerformed(ActionEvent e) { canvas.paste();}},
         new ActionListener() {
              public void actionPerformed(ActionEvent e) { canvas.delete();}}
        final String[] layeringMenuItems = {"Bring to front", "Send to back"};
        final int[]    layeringKeyCodes = {KeyEvent.VK_F, KeyEvent.VK_B};
        final ActionListener[] layeringActionListeners = {
         new ActionListener() {
              public void actionPerformed(ActionEvent e) {
                  canvas.bringToFront();}},
         new ActionListener() {
              public void actionPerformed(ActionEvent e) {
                  canvas.sendToBack();}}
        private JavaDraw(){
         super("JavaDraw!");
         toolbar.setCanvas(canvas);
         getContentPane().add(toolbar, BorderLayout.SOUTH);
         getContentPane().add(canvas, BorderLayout.CENTER);
         createMenus();
         setJMenuBar(mb);
         setLocation(100, 20);
         pack();
         setVisible(true);
        static public void main(String[] args){
         JavaDraw javaDraw = new JavaDraw();
        private void initMenus(JMenu m,
                      String  miLabel,
                      int keyCode,
                      int menuMask,
                      ActionListener al){
         JMenuItem mi = new JMenuItem(miLabel);
         m.add(mi);
         mi.addActionListener(al);
         mi.setAccelerator(KeyStroke.getKeyStroke(keyCode, menuMask));
        private void createMenus(){
         JMenu m;
         m = new JMenu("File");
         for(int i = 0; i < fileMenuItems.length; i++)
             initMenus(m,
                    fileMenuItems,
              fileKeyCodes[i],
              menuMask,
              fileActionListeners[i]);
         mb.add(m);
         m = new JMenu("Edit");
         for(int i = 0; i < editMenuItems.length; i++)
         initMenus(m,
              editMenuItems[i],
              editKeyCodes[i],
              editMenuMasks[i],
              editActionListeners[i]);
         mb.add(m);
         m = new JMenu("Layering");
         for(int i = 0; i < layeringMenuItems.length; i++)
         initMenus(m,
              layeringMenuItems[i],
              layeringKeyCodes[i],
              menuMask,
              layeringActionListeners[i]);
         mb.add(m);
    *-------------------------------------------------------------- 80 columns ---|
    * The DrawingCanvas class a small extension of JComponent
    * @version 1.1 15/04/01
    * @author Julie Zelenski
    * @author (touched up by Ian A. Mason)
    * @see javax.swing.JComponent
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.event.*;
    import java.util.*;
    public class DrawingCanvas extends JComponent{
    static final int DRAG_NONE = 0;
    static final int DRAG_CREATE = 1;
    static final int DRAG_RESIZE = 2;
    static final int DRAG_MOVE = 3;
    // list of all shapes on canvas
    protected Vector allShapes;          
    // currently selected shape (can be null at times)
    protected Rect selectedShape;
    // reference to toolbar to message for tool&color settings
    protected Toolbar toolbar;
    protected Rect clipboard=null;          
    /* These are the unimplemented menu commands. The menus are already
    * set up to send the correct messages to the canvas, but the
    * method bodies themselves are currently completely empty. It will
    * be your job to fill them in!
    public void cut() {
         copy();
         delete();
    public void copy() {
         int x=(int)selectedShape.getBounds().getX();
         int y=(int)selectedShape.getBounds().getY();
         Point p=new Point(x,y);
         clipboard=new Rect(p,this);
         clipboard.setBounds(selectedShape.getBounds());
    public void paste() {
         if(clipboard==null)
              return;
         allShapes.add(clipboard);
         setSelectedShape(clipboard);
         copy();
         this.repaint();
    public void delete() {
         if(selectedShape==null)
              return;
         else{
         int num=allShapes.indexOf(selectedShape);
         allShapes.remove(num);
         selectedShape=null;
         this.repaint();
    public void clearAll() {
         allShapes.removeAllElements();
         this.repaint();
    public void loadFile() {
         Load load=new Load(this);
         load.setSize(250,200);
         load.validate();
         load.setVisible(true);
    public void done(Vector vect){
         allShapes.removeAllElements();
         for(int i=0;i<vect.size();i++){
              allShapes.add(vect.elementAt(i));
         this.repaint();
    public void saveToFile() {
         Save save=new Save(allShapes);
         save.setSize(250,200);
         save.validate();
         save.setVisible(true);
    public void bringToFront() {
         if(selectedShape==null)
              return;
         int size=allShapes.size();
         int index=allShapes.indexOf(selectedShape);
         for(int i=index+1;i<=size-1;i++){
              allShapes.set(i-1,allShapes.elementAt(i));
         allShapes.set(size-1,selectedShape);
         this.repaint();
    public void sendToBack() {
         if(selectedShape==null)
              return;
         int index=allShapes.indexOf(selectedShape);
         for(int i=index-1;i>=0;i--){
              allShapes.remove(allShapes.elementAt(i+1));
              allShapes.add(i+1,allShapes.elementAt(i));
         allShapes.remove(allShapes.elementAt(0));
         allShapes.add(0,selectedShape);
         this.repaint();
    * Constructor for creating a new empty DrawingCanvas. We set up
    * our size and background colors, instantiate an empty vector of shapes,
    * and install a listener for mouse events using our inner class
    * CanvasMouseHandler
    public DrawingCanvas(Toolbar tb, int width, int height){
         setPreferredSize(new Dimension(width, height));
         setBackground(Color.white);
         toolbar = tb;
         allShapes = new Vector();
         selectedShape = null;
         CanvasMouseHandler handler = new CanvasMouseHandler();
         addMouseListener(handler);
         addMouseMotionListener(handler);
    * All components are responsible for drawing themselves in
    * response to repaint() requests. The standard method a component
    * overrides is paint(Graphics g), but for Swing components, the default
    * paint() handler calls paintBorder(), paintComponent() and paintChildren()
    * For a Swing component, you override paintComponent and do your
    * drawing in that method. For the drawing canvas, we want to
    * clear the background, then iterate through our shapes asking each
    * to draw. The Graphics object is clipped to the region to update
    * and we use to that avoid needlessly redrawing shapes outside the
    * update region.
    public void paintComponent(Graphics g){
         Rectangle regionToRedraw = g.getClipBounds();
         g.setColor(getBackground());
         g.fillRect(regionToRedraw.x, regionToRedraw.y,
              regionToRedraw.width, regionToRedraw.height);
         Iterator iter = allShapes.iterator();
         while (iter.hasNext())
         ((Rect)iter.next()).draw(g, regionToRedraw);
    * Changes the currently selected shape. There is at most
    * one shape selected at a time on the canvas. It is possible
    * for the selected shape to be null. Messages the shape to
    * change its selected state which will in turn refresh the
    * shape with the knobs active.
    protected void setSelectedShape(Rect shapeToSelect) {
         // if change in selection
         if (selectedShape != shapeToSelect) {
         // deselect previous selection
         if (selectedShape != null)
              selectedShape.setSelected(false);
         // set selection to new shape
         selectedShape = shapeToSelect;
         if (selectedShape != null) {
              shapeToSelect.setSelected(true);
    * A hit-test routine which finds the topmost shape underneath a
    * given point.We search Vector of shapes in back-to-front order
    * since shapes created later are added to end and drawn last, thus
    * appearing to be "on top" of the earlier ones. When a click comes
    * in, we want to select the top-most shape.
    protected Rect shapeContainingPoint(Point pt){
         for (int i = allShapes.size()-1; i >= 0; i--) {
         Rect r = (Rect)allShapes.elementAt(i);
         if (r.inside(pt)) return r;
         return null;
    * The inner class CanvasMouseHandler is the object that handles the
    * mouse actions (press, drag, release) over the canvas. Since there is
    * a bit of state to drag during the various operations (which shape,
    * where we started from, etc.) it is convenient to encapsulate all that
    * state with this little convenience object and register it as the
    * handler for mouse events on the canvas.
    protected class CanvasMouseHandler
         extends MouseAdapter implements MouseMotionListener {
         Point dragAnchor;          
         // variables using to track state during drag operations
         int dragStatus;
         /** When the mouse is pressed we need to figure out what
         * action to take. If the tool mode is arrow, the click might
         * be a select, move or reisze. If the tool mode is one of the
         * shapes, the click initiates creation of a new shape.
         public void mousePressed(MouseEvent event){
         Rect clicked = null;
         Point curPt = event.getPoint();
         // first, determine if click was on resize knob of selected shape
         if (toolbar.getCurrentTool() == Toolbar.SELECT) {
              if (selectedShape != null &&
              (dragAnchor = selectedShape.getAnchorForResize(curPt))
              != null) {
              // drag will resize this shape
              dragStatus = DRAG_RESIZE;     
              } else if ((clicked = shapeContainingPoint(curPt)) != null) {
              // if not, check if any shape was clicked
              setSelectedShape(clicked);
              // drag will move this shape      
              dragStatus = DRAG_MOVE;
              dragAnchor = curPt;
              } else {     
              // else this was a click in empty area,
              // deselect selected shape,
              setSelectedShape(null);
              // drag does nothing in this case
              dragStatus = DRAG_NONE;
         } else {
              Rect newShape = new Rect(curPt, DrawingCanvas.this);
              // create rect here
              allShapes.add(newShape);
              setSelectedShape(newShape);
              dragStatus = DRAG_CREATE;          
              // drag will create (resize) this shape
              dragAnchor = curPt;
         /** As the mouse is dragged, our listener will receive periodic
         * updates as mouseDragged events. When we get an update position,
         * we update the move/resize event that is in progress.
         public void mouseDragged(MouseEvent event){
         Point curPt = event.getPoint();
         switch (dragStatus) {
         case DRAG_MOVE:
              selectedShape.translate(curPt.x - dragAnchor.x,
                             curPt.y - dragAnchor.y);
              // update for next dragged event
              dragAnchor = curPt;
              break;
         case DRAG_CREATE: case DRAG_RESIZE:
              selectedShape.resize(dragAnchor, curPt);
              break;
         public void mouseMoved(MouseEvent e) {}
    /** A little helper routine that will be useful for the load & save
    * operations. It brings up the standard JFileChooser dialog and
    * allows the user to specify a file to open or save. The return
    * value is the full path to the chosen file or null if no file was
    * selected.
    protected String filenameChosenByUser(boolean forOpen){
         JFileChooser fc = new JFileChooser(System.getProperty("user.dir") +
                             java.io.File.separator + "Documents");
         int result = (forOpen? (fc.showOpenDialog(this)) :
              fc.showSaveDialog(this));
         java.io.File chosenFile = fc.getSelectedFile();
         if (result == JFileChooser.APPROVE_OPTION && chosenFile != null)
         return chosenFile.getPath();
         return null;
         // return null if no file chosen or dialog cancelled
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.util.Vector;
    import java.io.*;
    class Load extends JFrame implements ActionListener, Serializable{
         Container contentPane;
         JTextField jtf;
         JButton jb;
         Object obj=null;
         Load load;
         Thread thread;
         DrawingCanvas draw;
         public Load(DrawingCanvas dc){
              draw=dc;
              contentPane=getContentPane();
              contentPane.setLayout(new FlowLayout());
              jtf=new JTextField(20);
              jb=new JButton("Load");
              jb.addActionListener(this);
              contentPane.add(jtf);
              contentPane.add(jb);
         public void actionPerformed(ActionEvent e){
              String text=jtf.getText();
              SimpleObjectReader reader=SimpleObjectReader.openFileForReading(text+".shp");
              if(reader==null){
                   System.out.println("Couldn't open file!");
                   return;
              obj=reader.readObject();
              reader.close();
              draw.done((Vector)obj);
              this.setVisible(false);
    import javax.swing.*;
    import java.awt.event.*;
    import java.awt.*;
    import java.util.Vector;
    import java.io.*;
    class Save extends JFrame implements ActionListener, Serializable{
         Container contentPane;
         JTextField jtf;
         Vector shapes;
         JButton jb;
         public Save(Vector shapeVector){
              shapes=shapeVector;
              contentPane=getContentPane();
              contentPane.setLayout(new FlowLayout());
              jtf=new JTextField(20);
              jb=new JButton("Save");
              jb.addActionListener(this);
              contentPane.add(jtf);
              contentPane.add(jb);
         public void actionPerformed(ActionEvent e){
              String text=jtf.getText();
              SimpleObjectWriter writer=SimpleObjectWriter.openFileForWriting(text+".shp");
              if(writer==null){
                   System.out.println("Couldn't open file!");
                   return;
              writer.writeObject(shapes);
              writer.close();
              this.setVisible(false);
    *-------------------------------------------------------------- 80 columns ---|
    * The RectShape class defines a simple rectangular shape object.
    * It tracks its bounding box, selected state, and the canvas it is being
    * drawn in. It has some basic methods to select, move, and resize the
    * rectangle. It has methods that draw the shape in the selected or unselected
    * states and updates the canvas whenever the state or bounds of the rectangle
    * change. The code that is there works properly, but you will need to extend
    * and change the code to support additional features.
    * @version 1.1 15/04/01
    * @author Julie Zelenski
    * @author (touched up by Ian A. Mason)
    import java.awt.*;
    import java.io.*;
    public class Rect implements Serializable{     
    protected Rectangle bounds;
    protected boolean isSelected;
    public Color color;
    public DrawingCanvas canvas;
    protected static final int KNOB_SIZE = 6;
    protected static final int NONE = -1;
    protected static final int NW = 0;
    protected static final int SW = 1;
    protected static final int SE = 2;
    protected static final int NE = 3;
    /** The constructor that creates a new zero width and height rectangle
    * at the given position in the canvas.
    public Rect(Point start, DrawingCanvas dcanvas){
         canvas = dcanvas;
         bounds = new Rectangle(start);
         color=canvas.toolbar.getCurrentColor();
    /** The "primitive" for all resizing/moving/creating operations that
    * affect the rect bounding box. The current implementation just resets
    * the bounds variable and triggers a re-draw of the union of the old &
    * new rectangles. This will redraw the shape in new size and place and
    * also "erase" if bounds are now smaller than before. It is a good
    * design to have all changes to a critical variable bottleneck through
    * one method so that you can be sure that all the updating that goes
    * with it only needs to be implemented in this one place. If any of your
    * subclasses have additional work to do when the bounds change, this is
    * the method to override. Make sure that any methods that change the
    * bounds call this method instead of directly manipulating the variable.
    protected void setBounds(Rectangle newBounds){
         Rectangle oldBounds = bounds;
         bounds = newBounds;
         updateCanvas(oldBounds.union(bounds));
    /** The resize operation is called when first creating a rect, as well as
    * when later resizing by dragging one of its knobs. The two parameters
    * are the points that define the new bounding box. The anchor point
    * is the location of the mouse-down event during a creation operation
    * or the opposite corner of the knob being dragged during a resize
    * operation. The end is the current location of the mouse. If you
    * create the smallest rectangle which encloses these two points, you
    * will have the new bounding box. Use the setBounds() primitive which
    * is the bottleneck we are using for all geometry changes, it handles
    * updating and redrawing.
    public void resize(Point anchor, Point end){
         Rectangle newRect = new Rectangle(anchor);
         // creates smallest rectange which
         // includes both anchor & end
         newRect.add(end);
         // reset bounds & redraw affected areas
         setBounds(newRect);      
    public Rectangle getBounds(){
         return bounds;
    /** The translate operation is called when moving a shape by dragging in
    * the canvas. The two parameters are the delta-x and delta-y to move
    * by. Note that either or both can be negative. Create a new rectangle
    * from our bounds and translate and then go through the setBounds()
    * primitive to change it.
    public void translate(int dx, int dy){
         Rectangle newRect = new Rectangle(bounds);
         newRect.translate(dx, dy);
         setBounds(newRect);
    /** Used to change the selected state of the shape which will require
    * updating the affected area of the canvas to add/remove knobs.
    public void setSelected(boolean newState){
         isSelected = newState;
         // need to erase/add knobs
         // including extent of extended bounds
         updateCanvas(bounds, true);
    /** The updateCanvas() methods are used when the state has changed
    * in such a way that it needs to be refreshed in the canvas to properly
    * reflect the new settings. The shape should take responsibility for
    * messaging the canvas to properly update itself. The appropriate AWT/JFC
    * way to re-draw a component is to send it the repaint() method with the
    * rectangle that needs refreshing. This will cause an update() event to
    * be sent to the component which in turn will call paint(), where the
    * real drawing implementation goes. See the paint() method in
    * DrawingCanvas to see how it is implemented.
    protected void updateCanvas(Rectangle areaOfChange, boolean enlargeForKnobs){
         Rectangle toRedraw = new Rectangle(areaOfChange);
         if (enlargeForKnobs)
         toRedraw.grow(KNOB_SIZE/2, KNOB_SIZE/2);
         canvas.repaint(toRedraw);
    protected void updateCanvas(Rectangle areaOfChange){
         updateCanvas(areaOfChange, isSelected);
    /** When the DrawingCanvas needs a shape to draw itself, it sends a draw
    * message, passing the graphics context and the current region being
    * redrawn. If the shape intersects with that region, it must draw itself
    * doing whatever it takes to properly represent itself in the canvas
    * (colors, location, size, knobs, etc.) by messaging the Graphics object.
    public void draw(Graphics g, Rectangle regionToDraw){
         if (!bounds.intersects(regionToDraw))
         return;
         g.setColor(color);
         g.fillRect(bounds.x, bounds.y, bounds.width, bounds.height);
         if (isSelected) { // if selected, draw the resizing knobs
         // along the 4 corners
         Rectangle[] knobs = getKnobRects();
         for (int i = 0; i < knobs.length; i++)
              g.fillRect(knobs[i].x, knobs[i].y,
                   knobs[i].width, knobs[i].height);
    /** When the DrawingCanvas needs to determine which shape is under
    * the mouse, it asks the shape to determine if a point is "inside".
    * This method should returns true if the given point is inside the
    * region for this shape. For a rectangle, any point within the
    * bounding box is inside the shape.
    public boolean inside(Point pt){
         return bounds.contains(pt);
    /** When needed, we create the array of knob rectangles on demand. This
    * does mean we create and discard the array and rectangles repeatedly.
    * These are small objects, so perhaps it is not a big deal, but
    * a valid alternative would be to store the array of knobs as an
    * instance variable of the Shape and and update the knobs as the bounds
    * change. This means a little more memory overhead for each Shape
    * (since it is always storing the knobs, even when not being used) and
    * having that redundant data opens up the possibility of bugs from
    * getting out of synch (bounds move but knobs didn't, etc.) but you may
    * find that a more appealing way to go. Either way is fine with us.
    * Note this method provides a nice unified place for one override from
    * a shape subclass to substitute fewer or different knobs.
    protected Rectangle[] getKnobRects(){
         Rectangle[] knobs = new Rectangle[4];
         knobs[NW] = new Rectangle(bounds.x - KNOB_SIZE/2,
                        bounds.y - KNOB_SIZE/2, KNOB_SIZE, KNOB_SIZE);
         knobs[SW] = new Rectangle(bounds.x - KNOB_SIZE/2,
                        bounds.y + bounds.height - KNOB_SIZE/2,
                        KNOB_SIZE, KNOB_SIZE);
         knobs[SE] = new Rectangle(bounds.x + bounds.width - KNOB_SIZE/2,
                        bounds.y + bounds.height - KNOB_SIZE/2,
                        KNOB_SIZE, KNOB_SIZE);
         knobs[NE] = new Rectangle(bounds.x + bounds.width - KNOB_SIZE/2,
                        bounds.y - KNOB_SIZE/2,
                        KNOB_SIZE, KNOB_SIZE);
         return knobs;
    /** Helper method to determine if a point is within one of the resize
    * corner knobs. If not selected, we have no resize knobs, so it can't
    * have been a click on one. Otherwise, we calculate the knob rects and
    * then check whether the point falls in one of them. The return value
    * is one of NW, NE, SW, SE constants depending on which knob is found,
    * or NONE if the click doesn't fall within any knob.
    protected int getKnobContainingPoint(Point pt){
         // if we aren't selected, the knobs
         // aren't showing and thus there are no knobs to check
         if (!isSelected) return NONE;
         Rectangle[] knobs = getKnobRects();
         for (int i = 0; i < knobs.length; i++)
         if (knobs[i].contains(pt))
              return i;
         return NONE;
    /** Method used by DrawingCanvas to determine if a mouse click is starting
    * a resize event. In order for it to be a resize, the click must have
    * been within one of the knob rects (checked by the helper method
    * getKnobContainingPoint) and if so, we return the "anchor" ie the knob
    * opposite this corner that will remain fixed as the user drags the
    * resizing knob of the other corner around. During the drag actions of a
    * resize, that fixed anchor point and the current mouse point will be
    * passed to the resize method, which will reset the bounds in response
    * to the movement. If the mouseLocation wasn't a click in a knob and
    * thus not the beginning of a resize event, null is returned.
    public Point getAnchorForResize(Point mouseLocation){
         int whichKnob = getKnobContainingPoint(mouseLocation);
         // no resize knob is at this location
         if (whichKnob == NONE)
         return null;
         switch (whichKnob) {
         case NW: return new Point(bounds.x + bounds.width,
                        bounds.y + bounds.height);
         case NE: return new Point(bounds.x, bounds.y + bounds.height);
         case SW: return new Point(bounds.x + bounds.width, bounds.y);
         case SE: return new Point(bounds.x, bounds.y);
         return null;
    import java.io.*;
    * SimpleObjectReader is a small class to wrap around the usual ObjectStream
    * to shield you from the exception handling which we haven't yet gotten
    * to in class.
    * <P>It has just three methods of note: one to open a new file for reading,
    * one to read an object from an open file, and one to close the file when done.
    * <P>Any object that you attempt to read must properly implement the Serializable
    * interface. Here is a simple example that shows using the SimpleFileReader to
    * to rehydrate objects from a file and print them:
    * <PRE>
    * SimpleObjectReader reader = SimpleObjectReader.openFileForReading("shapes");
    * if (reader == null) {
    * System.out.println("Couldn't open file!");
    * return;
    * Object obj;
    * while ((obj = reader.readObject()) != null)
    * System.out.println(obj);
    * reader.close();
    * </PRE>
    * <P>You are free to edit or extend this class, but we don't expect that
    * you should need to make any changes.
    * @version 1.1 15/04/01
    * @author Julie Zelenski
    * @author (touched up by Ian A. Mason)
    public class SimpleObjectReader {
    private ObjectInputStream ois;
    * Opens a new file for reading. The filename can either be a relative
    * path, which will be relative to the working directory of the program
    * when started, or an absolute path. If the file exists and can be
    * opened, a new SimpleObjectReader is returned. If the file cannot be
    * opened (for any reason: wrong name, wrong path, lack of permissions, etc.)
    * null is returned.
    public static SimpleObjectReader openFileForReading(String filename){
         try {
         return new SimpleObjectReader(new ObjectInputStream(new FileInputStream(filename)));
         } catch(IOException e) {     
         return null;
    * Reads a single object from the file and returns it. If there are
    * no more objects in the file (i.e, we have reached the end of file),
    * null is returned null is returned. null is also
    * returned on any I/O error.
    public Object readObject (){
         try {
         return ois.readObject();
         } catch (IOException e) {
         e.printStackTrace();
         return null;
         } catch (ClassNotFoundException e) {
         e.printStackTrace();
         return null;
    * Closes the file when done reading. You should close a reader when
    * you are finished to release the OS resources for use by others.
    public void close (){
         try {
         ois.close();
         catch (IOException e) {}
    * Constructor is private so that only means to create a new reader
    * is through the static method which does error checking.
    private SimpleObjectReader(ObjectInputStream ois){
         this.ois = ois;
    import java.io.*;
    * SimpleObjectWriter is a small class to wrap around the usual
    * ObjectOutputStream to shield you from the exception handling
    * which we haven't yet gotten to in class.
    * <P>It has just three methods of note: one to open a new file for writing,
    * one to write an object to the file, and one to close the
    * the file when done.
    * <P>Here is a simple example that shows using the SimpleObjectWriter
    * to create a new file and write some objects into it:
    * <PRE>
    * SimpleObjectWriter writer =
    * SimpleObjectWriter.openFileForWriting("objects");
    * if (writer == null) {
    * System.out.println("Couldn't open file!");
    * return;
    * writer.writeObject("Here is a string");
    * writer.writeObject("And another one.");
    * writer.writeObject(new Date());
    * writer.close();
    * </PRE>
    * <P>You are free to edit or extend this class, but we don't expect that
    * you should need to make any changes.
    * @version 1.1 15/04/01
    * @author Julie Zelenski
    * @author (touched up by Ian A. Mason)
    public class SimpleObjectWriter {
    private ObjectOutputStream oos;
    * Opens a new file for writing. The filename can either be a relative
    * path, which will be relative to the working directory of the program
    * when started, or an absolute path. If the file can be created, a
    * new SimpleObjectWriter is returned. If the file already exists, this
    * will overwrite its content

    I'm not reading that either, but to help you for next time:
    - use more than 1 sentence to describe your problem
    - only post the RELEVANT code, or a small test program with the same problem if possible.
    At least you formatted it, I'll give you that.
    Cheers,
    Radish21
    PS. I think in this case, posting another (better worded) thread might be a good idea, because no one is going to read this one. In general though, don't :)

  • Upload Excel File to SharePoint using VBA

    Hi,
    I copied and modified the code from a friend which he got it from this website forum.
    This apprantely works for some people and not me. Please tell me what I am doing wrong.
    Ignore xxxxxx part of the Sharepoint site. Nothing wrong with the site, i tried many combinations, but I get not response, not even an error.
    Public Const HR_URL = "http://sun.xxxxxx.com/eng/st/Lists/Database%20Change% 20Request"
    Sub test()
    'Upload new Excel sheet to SharePoint
    Call copyToSharePoint(HR_URL, ThisWorkbook.FullName)
    End Sub
    '''''''code block from Forum
    Public Sub copyToSharePoint(sharepointURL As String, filePath As String)
    'On Error GoTo errhandler
    'sharePointUrl should not end in a "/"
    'Initialize Variables
    Dim LlFileLength As Long
    Dim Lvarbin() As Byte
    Dim LobjXML As Object
    Dim LvarBinData As Variant
    Dim LstrFileName As String, PstrFullfileName As String, PstrTargetURL As String
    Dim fileName As String, lenFileName As Long
    'Extract file name
    lenFileName = Len(filePath) - InStrRev(filePath, "\")
    fileName = Right(filePath, lenFileName)
    'Check that the webUrl ends in an "/"
    If Right(sharepointURL, 1) <> "/" Then
    sharepointURL = sharepointURL & "/"
    End If
    '**************************** Upload binary files *****************
    Set LobjXML = CreateObject("Microsoft.XMLHTTP")
    PstrFullfileName = filePath
    LlFileLength = FileLen(PstrFullfileName) - 1
    ' Read the file into a byte array.
    ReDim Lvarbin(LlFileLength)
    Open PstrFullfileName For Binary As #1
    Get #1, , Lvarbin
    Close #1
    ' Convert to variant to PUT.
    LvarBinData = Lvarbin
    PstrTargetURL = sharepointURL & fileName
    ' Put the data to the server; false means synchronous.
    LobjXML.Open "PUT", PstrTargetURL, False
    ' Send the file in.
    LobjXML.Send LvarBinData
    Set LobjXML = Nothing
    Exit Sub
    errhandler:
    If Err.Number = 53 Then
    MsgBox "Excel was unable to create the HR file to submit to SharePoint. " & vbNewLine & _
    "Please check that you are not running out of disk space and that no MS Office add-in is causing issues with Excel.", vbCritical, "File Error"
    Exit Sub
    Else
    MsgBox "Your HR could not be submitted to SharePoint. The following error occurred:" & vbNewLine & _
    "Error " & Err.Number & ": " & Err.Description, vbCritical, "Error Uploading to SharePoint"
    Exit Sub
    End If
    End Sub

    I have made the following code work successfully on a Windows 8 machine with the VBA executing from an Excel 2010 file and the file you want to upload going to a SharePoint 2010 site. If you don't need to use SP content types then simply
    take that out of the code. Also, pay attention to the FieldInformation as the Field Display names and Field Internal names can sometimes be different. Cheers.
    Public Sub copyDocToSP()
    Const strLocalFile = "C:\temp\myLocalFile.pdf"
    Const spBASE_URL = "https://thesharepointdomian/sites/yoursite/"
    Const spDOC_LIB = "Your SP Doc Library Name"
    Const spFILE_NAME = "FileNameOnceOnSharepoint.pdf"
    Const spCONTENT_TYPE = "0x000000000000000000000000000000000000000"
    Set ObjectStream = CreateObject("ADODB.Stream")
    Set ObjectDOM = CreateObject("Microsoft.XMLDOM")
    Set ObjectElement = ObjectDOM.createElement("TMP")
    Set ObjectHTTP = CreateObject("Microsoft.XMLHTTP")
    'Reading binary file
    ObjectStream.Open
    ObjectStream.Type = 1 'Type Binary
    ObjectStream.LoadFromFile (strLocalFile)
    BinaryFile = ObjectStream.Read()
    ObjectStream.Close
    'Conversion Base64
    ObjectElement.DataType = "bin.base64" 'Type Base64
    ObjectElement.nodeTypedValue = BinaryFile
    EncodedFile = ObjectElement.Text
    'Build request to load document
    strURLService = spBASE_URL + "_vti_bin/copy.asmx"
    strSOAPAction = "http://schemas.microsoft.com/sharepoint/soap/CopyIntoItems"
    strSOAPCommand = "<?xml version='1.0' encoding='utf-8'?>" & _
    "<soap:Envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'>" & _
    "<soap:Body>" & _
    "<CopyIntoItems xmlns='http://schemas.microsoft.com/sharepoint/soap/'>" & _
    "<SourceUrl>" + strLocalFile + "</SourceUrl>" & _
    "<DestinationUrls>" & _
    "<string>" + spBASE_URL + spDOC_LIB + "/" + spFILE_NAME + "</string>" & _
    "</DestinationUrls>" & _
    "<Fields>" & _
    "<FieldInformation Type='Text' InternalName='Title' DisplayName='Title' Value='this is the title value' />" & _
    "<FieldInformation Type='Choice' InternalName='Our_x0020_Status' DisplayName='Our Document Status' Value='Ready-to-distribute' />" & _
    "<FieldInformation Type='Text' InternalName='ContentTypeId' DisplayName='Content Type ID' Value='" + spCONTENT_TYPE + "' />" & _
    "</Fields>" & _
    "<Stream>" + EncodedFile + "</Stream>" & _
    "</CopyIntoItems>" & _
    "</soap:Body>" & _
    "</soap:Envelope>"
    ObjectHTTP.Open "Get", strURLService, False
    ObjectHTTP.SetRequestHeader "Content-Type", "text/xml; charset=utf-8"
    ObjectHTTP.SetRequestHeader "SOAPAction", strSOAPAction
    ObjectHTTP.Send strSOAPCommand
    MsgBox (ObjectHTTP.responseText)
    End Sub

  • How do I establish a connection to another Java program on the net?

    Hi all,
    I have been reading the java tutorial to find a solution to my problem but I havent really found what Im looking for.
    I want to establish a connection that allows a client to get a copy of an object from a running java-application on a server on the internet.
    I have read about the Socket-class but the tutoral advices only to use it on a locale network. I know IDL and RMI only by name - is this what I should be reading about?
    If one of you guys have a source-code example on how to make java programs communicate over the net, please post it!
    Regards Albert

    Assuming this is "wide area" stuff, not just on a local area network, your best bet is to stick to http connections. You need a web server, probably Tomcat.
    Your client can connect using URL.openConnection().
    As to protocols you could use SOAP. It has the advantage that you can get the code for it for free, but it can be pretty complicated to configure. In particular it only knows how to transmit a limited set of object types and if you want to go beyond them you have to write converters. SOAP servers typically run under an web server anyway. SOAP converts all the data to XML for transmission.
    However it may be simpler to use Java's built in serialisation facility and send your data as an ObjectStream.
    In the set up you're talking about the message going to the server seems a lot simpler than the response. It may make sense to send your data as normal keyword parameters of a POST transaction but to have the server respond with an Object stream. That's well within the normal operation of a web server.

  • Writing files to disk.....

    Hi, any ideas why this code to read in an array of bytes (a file) from a server and then write the file to a user chosen directory does not work??
    Should I be using a fileObject and not just a fileoutputstream?? I am using an example from a book that just reads in the array of bytes, creates a fileoutputstream and uses its write method to save the file....
    Any ideas??
    Thanks!
    byte[] theDocument = (byte[])objectIn.readObject();
    if (theDocument.length > 0)
         //Let user choose where to put this file
         JFileChooser fileChooser = new JFileChooser();
         fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
         fileChooser.setApproveButtonText("Save");
         fileChooser.setApproveButtonToolTipText("Click to save the document in this directory");
         selection = fileChooser.showOpenDialog(null);
         if (selection == JFileChooser.APPROVE_OPTION)
               //Get the address to the folder they chose
               String thePath = fileChooser.getSelectedFile().toString();
               thePath = thePath + fileName;     //FILENAME CREATED & INITIALISED ELSEWHERE AND IS ALWAYS SOMETHING LIKE MYFILE.TXT  FILE NAME MAY HAVE SPACES SOMETIMES, PROBLEM???
               //now write the file out to the folder chosen by the user
               try
                          FileOutputStream fileOut = new FileOutputStream(thePath);
          fileOut.write(theDocument);//Write the array of bytes to disk to save the file!               fileOut.close();                                        System.out.println("We saved the file to disk!"); //THIS IS DISPLAYED WHEN CODE IS RUN!!
               catch (FileNotFoundException FNF)
                          clientLogin.showUserMessage("Could not save the document.  Check that you have permission to write to the chosen destination directory.");
    else
               clientLogin.showUserMessage("No document was sent back from the server.");
    }

    Yes, I am using a serialised byte array to send the file accross the network from server to client. It just seemed a neat way to do it.....
    All communication between my server and client is done using objectoutput and objetcinputstreams because i had problems using printwriters, buffered readers and objectstreams on the same socket....
    my server has to receive, populate and send back custom user objects so it made sense (to me anyway) to send all communication like that.....
    Is there a better way?
    Thanks for speedy replies.

  • URGENT -java MAil sending pdf as attachment

    I have a small java program that sends the pdf as an attachment without using phisical pdf file.
    but the problem is i am unable to open the pdf that comes as as attachment in mail.
    error while opening pdf : " acrobat cannot open file bcos the file type is not supported or the file is curropted(for example it was sent as email attachment and was not properly decoded)"
    here is the code :
    import java.util.Properties;
    import javax.mail.*;
    import javax.mail.internet.*;
    import javax.activation.*;
    import java.io.*;
    import java.util.*;
    public class Mailer {
    public static void main (String args[]) {
    String host = "abc";
    String from ="[email protected]";
    String to = "[email protected]";
    //String fileAttachment = args[0];
    // Get system properties
    Properties props = System.getProperties();
    // Setup mail server
    props.put("mail.smtp.host", host);
    // Get session
    Session session =
    Session.getInstance(props, null);
    // Define message
    MimeMessage message = new MimeMessage(session);
    message.setFrom( new InternetAddress(from));
    message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
    message.setSubject("Hello JavaMail Attachment subject");
    // create the message part
    MimeBodyPart messageBodyPart = new MimeBodyPart();
    //fill message
    messageBodyPart.setText("Hi hello this is the msg in mail");
    Multipart multipart = new MimeMultipart();
    multipart.addBodyPart(messageBodyPart);
    // Part two is attachment
    messageBodyPart = new MimeBodyPart();
    String data_to_send = "This msg is sent as an attachment with out using physical file";
    String att_type = "application/pdf";
    messageBodyPart.setText(data_to_send);
    messageBodyPart.setHeader("Content-Type", att_type);
    messageBodyPart.setHeader("Content-Transfer-Encoding", "BASE64");
    messageBodyPart.setFileName("attachment.pdf");
    /* ByteArrayOutputStream byteStream=new ByteArrayOutputStream();
    ObjectOutputStream objectStream=new ObjectOutputStream(byteStream);
    objectStream.writeObject(data_to_send);
    messageBodyPart.setDataHandler(new DataHandler( new ByteArrayDataSource( byteStream.toByteArray(), "application/pdf" )));
         messageBodyPart.setFileName("attachment.pdf");
    multipart.addBodyPart(messageBodyPart);
    // Put parts in message
    message.setContent(multipart);
    // Send the message
    Transport.send( message );
    System.out.println("sent msg");
    Thanks
    Smi

    It's "corrupted" because you are sending a text string and not a PDF document.
    And that commented-out code that uses an ObjectOutputStream would have corrupted a PDF document anyway, if you had one.
    I suggest if this problem is urgent then you hire professional programming help to get it done. You are a long way from a solution.

  • Wrapping CipherStreams

    Hi
    I am having problems implementing CipherStreams. While encrypting objects with the Cipher-Class works perfectly fine, wrapping CipherStreams around ObjectStreams, or ObjectStreams around CipherStreams wont work. While i first tried to use the following:
    inputstream
    cipherinputstream(inputstream)
    objectinputstream(cipherinputstream)
    i tried to switch the cipher- and objectinputstream initialization, which in the end didnt change anything. What happens is:
    Both ways compile ( NetBeans 3.5 ), but in both cases the program stops executing when trying to wrap a cipherstream around an inputstream or an objectinputstream ( same goes for outputstreams of course ).
    No exception is being thrown, the program just stops.
    Any suggestions? :)

    Ah, thx for your answer. While in my working code, i first created the OutputStream, and then the InputStream, i switched the order when implementing the CipherStreams. I am going to test it now, i guess though, that was the problem.
    thx again, if this doesnt solve the problem, be sure to read again from me ;)
    thx, Ben

  • What's this?

    Hi, I am trying to write a simple file using an objectStream. When I write the file, it add
    this to the begining of the file:
    \254\355^Et^E
    and when I try to write one or more things, it puts this inbetween them:
    t^G
    Does anyone know what is going on? I think that it might have something to do with the platform
    that I am running on because the first message is different in a different OS.
    Please help.
    Remember: There are two ways to tell a sexy man. The first is he forgets things easily, the second,
    I forget.

    Never mind. I found some help from another part of the forum. But I might have another
    question in a little bit about how to read an enumeration if anyone might be able to
    help with.
    Thanks

  • SaxParser.parse(sok.getInputStream(), new handler()) [clarification please]

    this code works, however i am not sure how/why?
    i am interested in how Strings/characters are sent over tcp
    streams:
    here is sender:
    Socket sok = new Socket(server, port);
    OutputStreamWriter streamWriter = new OutputStreamWriter(sok.getOutputStream());
    streamWriter.write(xmlString, 0, xmlString.length());i am ok with this.
    i see that the OutputStreamWriter does "something" about converting the
    socket's OutputStream to characters.
    here is receiver:
    SAXParser parser = saxFactory.newSAXParser();
    Socket sok = serverSok.accept();
    parser.parse(sok.getInputStream(), new MyHandler());see, i am plugging:
    sok.getInputStream()
    directly into the sax parser without providing context
    that those bytes are characters (and what character encodings ).
    so, what is going on? i might imagine using:
    ObjectOutputStream.appendClass();
    ObjectInputStream.resolveClass();to provide context that the byte stream are
    characters of the "x" character set.
    however, i am not using any
    ObjectStreams.
    if this is a ridiculous question, and the answer is
    in the api somehow, i am sorry. i am not good
    at always understanding the api.

    then my fundamental confusion is the difference between
    java.io.Reader;
    java.io.InputStream;
    consider the set of polymorphic method signatures for the
    SAXParser parse () methods.
    parser.parse(sok.getInputStream(), new MyHandler());clearly invokes:
    public void parse(InputStream is, DefaultHandler dh);however i don't see any method signature that matches:
    parser.parse(new InputStreamReader(sok.getInputStream(), myCharSet), new MyHandler());for example, in the api, there is no:
    public void parse(Reader r, DefaultHandler dh);this has been very helpful.
    i will Google the interchangability of Reader/InputStream tomorrow, however any
    further guidance would be welcomed. the java.io heirarchy confuses me.

  • Serializing objects with the NIO API

    I try to use the new IO API to implement a non-blocking multi-threaded server that communicates with client applications by exchanging serialized objects. I started from the code in the JavaWorld article at http://www.javaworld.com/javaworld/jw-09-2001/jw-0907-merlin.html .
    With the new features of J2SDK 1.4.0, you don't have to create a separate thread per connected client. That is a big improvement.
    But when I read an object with ObjectInputStream, I get a java.nio.channels.IllegalBlockingModeException.
    Has anybody successfully implemented such a server since the release of the new io API?
    Thanks.
    Jean-Robert

    The ObjectStream code is basically incompatible with non blockin I/O since you must block on the stream until a whole Object is available. You could roll something like this yourself, by reading bytes until there are enough available to build the next object and then getting that Object from the buffer and shipping it to your client thread. All of this is far more trouble than just using the Stream oriented I/O.
    NIO and mutilple threads are a nightmare, the whole idea of non-blocking I/O is to avoid needing multiple threads. If you do use multiple threads you will need queues between them. See the Taming the NIO Circus topic for lots of discussion of NIO and its problems. The system seems more stable in JDK 1.5, but most people haven't even started using 1.4 for production yet.
    Personally I avoid ObjectStreams. They are only useful between Java applications, if I want that I just use RMI and let Java do ALL the hard work. When I write a Socket based app, its probably because the other end is a mainframe of a C program. For that reason I send data as bytes, packaged up in packets, and encode as XML or ASN.1 so the other end can interpret it.

Maybe you are looking for