Read an object stream from last

I write objects to a file in ascending order of their creation times. Later when I want to see the latest object(i.e. the last object written to the file), I need to trasverse through all the objects to the last object. Is there a way to read the stream from the last so that first thing I read is the last object I wrote ? I dont think it is impossible. All we need to do is to come to the begining index of the object somehow from the last and then read forward as usual. Though , I dont have any clue as to how to achieve this. If you have any ideas, I would be grateful.

Well! situation here is I dont have any such information. What I am talking about is a log file which is populated by various processes with a particular object type. I have no idea about the byte position of the last object , and so cant use skipBytes(). Any other way ?
Thanks anyway.

Similar Messages

  • Error while executing SSIS package - Error: 4014, Severity:20, State: 11. A fatal error occurred while reading the input stream from the network. The session will be terminated (input error: 109, output error: 0)

    Hi,
    We are getting the following error when running our SSIS packages on Microsoft SQL Server 2012 R2 on Windows Server 2008 R2 SP1:
    Error: 4014, Severity:20, State: 11.   A fatal error occurred while reading the input stream from the network. The session will be terminated (input error: 109, output error: 0)
    SQL Server Data Tools and SQL Server Database Engine reside on the same server.
    We tried the following:
    Disabling TCP Chimney Offload
    Installed Windows Server 2008 SP1
    Splitting our SSIS code into multiple steps so it is not all one large continuous operation
    The error occurs during a BulkDataLoad task.
    Other options we are investigating with the engineering team (out-sourced, so delayed responses):
    Firewall configurations (everything is local, so this should not make a difference)
    Disabling the anti-virus scanner
    Are there other things we can try?
    Any insight is greatly appreciated.
    Thanks!

    Hi HenryKwan,
    Based on the current information, the issue can be caused by many reasons. Please refer to the following tips:
    Install the latest hotfix based on your SQL Server version. Ps: there is no SQL Server 2012 R2 version.
    Change the MaxConcurrentExecutables property from -1 to another one based on the MAXDOP. For example, 8.
    Set "RetainSameConnection" Property to FALSE on the all the connection managers.
    Reference:
    https://connect.microsoft.com/SQLServer/feedback/details/774370/ssis-packages-abort-with-unexpected-termination-message
    If the issue is still existed, as Jakub suggested, please provide us more information about this issue.
    Thanks,
    Katherine Xiong
    Katherine Xiong
    TechNet Community Support

  • GP - WD Java: Cannot read callable object description from component

    Hi,
    i use Guided Procedures and therefore i will generate a WebDynproJ Callable Object inside the GP.
    When i try to intergate it into Design-Time i get follwoing error after i picked the WebDynpro Component:
    Cannot read callable object description from component: type com.sap.caf.gp.quotcreate.model.bapi_quotation_createfromdata2.types.Vbeln_Va could not be loaded: com.sap.dictionary.runtime.DdException: TypeBroker failed to access SLD: Error while obtaining JCO connection.
    Well because i could import the Model into the WD Component in NWDS with the given JCo i have no clue why this error is now popping up.
    Does someone have some experience with this phenomenon?!
    I also wanted to check the JCo's in Content Admin but even though i am an Admin (i am sure of this) i have no rights to enter this part. Also the SLD is properly configured!
    br

    Hi Fritz,
    how did you resolve the problem?  thanks a lot!
    Nicola

  • How to read Java Object message from JMS Queue using JMS Adapter .

    Dear All,
    In my scenario i have to read a java object message from JMS Queue . I tried by using the JMS Adaper ,but i am not getting any Payload . Can any one tell me is there any special settings for JMS Adapter to read the Java Object message .
    I am able to read the Message successfully thru JMS Adapter but in SXMB_MONI it is not showing any payload .
    I also went in Message monitoring but i am getting this type of message in Sender JMS Adapter  in Audit Log.
    JMS Message ID XXXXX Message Type Null unknown.Payload can not be read and will be empty.
    JMS Message ID XXXXX Payload Empty can not read.
    Please Help.
    Lateef

    Hi,
    As far as i know, JMS Object Messages is not supported by XI JMS adapter.
    you need to have the JMS provider to transform the message to bytes messages.
    (Refer to SAP note 856346)

  • Read object list from a transport datafile

    Hallo,
    does anyone know a way to read the object list from a transport datafile.
    The problem is, that the rewuest is not added to the STMS an so the files are not known by the STMS. But data and cofile is stored in the corresponding folders of the transport management system.
    Thanks
    Arnfried

    Hello,
    Have you tried to add the request to the import queue?
    While displaying the import  queue  Extras->Other Requests->Add
    Regards
    Greg Kern

  • Parsing input stream from a socket

    Hi, i must read a byte stream from a socket. My problem is that i cannot determine when a stream ends because there are no terminator characters. I tried to use the read() method of BufferedReader class but it blocks when server statement ends. Is there a way to read the stream and answer to the server?
    Thanks,
    Andrea

    andmus wrote:
    Hi, i must read a byte stream from a socket. My problem is that i cannot determine when a stream ends because there are no terminator characters. I tried to use the read() method of BufferedReader class but it blocks when server statement ends. Is there a way to read the stream and answer to the server?
    If you're reading HTTP...
    Unless the request has been sent with Connection: close, it's normal that your read blocks, since the connection is purposefully left open to accomodate further exchanges.
    You'll have to parse the data to know when each message is complete. The first empty line (bytes: \r\n\r\n ASCII) denotes the end of the header. The header will have a Content-Length property which tells you how many bytes are left to read.
    Google the HTTP specs if you don't know them.

  • Can i Read an Object[Hashtable] if i am using BufferReader

    Hi EveryOne,
    I am writing a Java Chat Program, an it seams that i can not read an Object[Hashtable] from the BufferReader, Do you thing there is an easy way around it. rather then me change ther BufferReader everywhere. Please let me know....
    Thanks

    Hi EveryOne,
    I am writing a Java Chat Program, an it seams that
    at i can not read an Object[Hashtable] from the
    BufferReader, Do you thing there is an easy way around
    it. rather then me change ther BufferReader
    everywhere. Please let me know....
    Thanks-------------------------------------------------------------------
    Can Someone please reply to these Question it is kind of argent for me to know these....
    Thanks

  • Web Dynpro Callable Object :"Cannot read callable object description "

    Hi All,
    I'm getting the following error:
    "Cannot read callable object description from component"
    and also "Cannot read callable object description from component" in two different Web Dynpros.
    The code in the Web Dynpros is similar:
    try
             IWDTextAccessor textAccessor = wdComponentAPI.getTextAccessor();
             WebDynproResourceAccessor resourceAccessor = new WebDynproResourceAccessor(textAccessor);
             //ITechnicalDescription techDesc = TechnicalDescriptionFactory.newTechnicalDescription("FRESH_PARAMS","Fresh_Parameters To Be Called",resourceAccessor,locale);
              ITechnicalDescription techDesc = TechnicalDescriptionFactory.newTechnicalDescription("FRESH_PARAMS","Fresh",resourceAccessor,locale);
             //Pre-Existing Structure for Input
             IStructureInfo input = techDesc.getInputStructureInfo();
             IAttributeInfo firstName = input.addAttribute("firstName",IAttributeInfo.BASE_STRING);
              IAttributeInfo lastName = input.addAttribute("lastName",IAttributeInfo.BASE_STRING);
              IAttributeInfo phoneNum = input.addAttribute("phoneNum",IAttributeInfo.BASE_STRING);
              IAttributeInfo Place = input.addAttribute("Place",IAttributeInfo.BASE_STRING);
              IAttributeInfo Email = input.addAttribute("Email",IAttributeInfo.BASE_STRING);
              IAttributeInfo Company = input.addAttribute("Company",IAttributeInfo.BASE_STRING);
              //Setting multiplicity
              firstName.setMultiplicity(IAttributeInfo.MULITIPLICITY_1_1);
              lastName.setMultiplicity(IAttributeInfo.MULITIPLICITY_1_1);
              phoneNum.setMultiplicity(IAttributeInfo.MULITIPLICITY_1_1);
              Place.setMultiplicity(IAttributeInfo.MULITIPLICITY_1_1);
              Email.setMultiplicity(IAttributeInfo.MULITIPLICITY_1_1);
              Company.setMultiplicity(IAttributeInfo.MULITIPLICITY_1_1);
              //Pre-Existing Structure for Output
              IStructureInfo output = techDesc.getOutputStructureInfo();
              IStructureInfo userStruct1 = output.addStructure("userStruct1");
              userStruct1.addAttribute("firstName",IAttributeInfo.BASE_STRING);
              userStruct1.addAttribute("lastName",IAttributeInfo.BASE_STRING);
              IStructureInfo userStruct2 = output.addStructure("userStruct2");
              userStruct2.addAttribute("phoneNum",IAttributeInfo.BASE_STRING);
              userStruct2.addAttribute("Place",IAttributeInfo.BASE_STRING);
              userStruct2.addAttribute("Email",IAttributeInfo.BASE_STRING);
              userStruct2.addAttribute("Company",IAttributeInfo.BASE_STRING);
              return techDesc;
        catch (InvocationException ex)
             ex.printStackTrace();
             return null;
    Can someone tell me where I'm going wrong.
    Thanks
    Srikant

    Hi Zornista Yankulova
    I'm getting  this error:
    " Cannot read callable object description from component: Failed to create delegate for custom controller com.infosys.creator.wdpco.COGetDocTypeInterface. (Hint: Is the corresponding DC deployed correctly? Does the DC contain the component?)"
    Where the places i can go wrong??
    Please let me know.
    My code is like this?
    public com.sap.caf.eu.gp.co.api.ITechnicalDescription getDescription( java.util.Locale locale )
        //@@begin getDescription()
        try
             IWDTextAccessor textAccessor = wdComponentAPI.getTextAccessor();
             WebDynproResourceAccessor resourceAccessor = new WebDynproResourceAccessor(textAccessor);
             //ITechnicalDescription techDesc = TechnicalDescriptionFactory.newTechnicalDescription("FRESH_PARAMS","Fresh_Parameters To Be Called",resourceAccessor,locale);
              ITechnicalDescription techDesc = TechnicalDescriptionFactory.newTechnicalDescription("FRESH_PARAMS","Fresh",resourceAccessor,locale);
             //Pre-Existing Structure for Input
             IStructureInfo input = techDesc.getInputStructureInfo();
             IAttributeInfo firstName = input.addAttribute("firstName",IAttributeInfo.BASE_STRING);
              IAttributeInfo lastName = input.addAttribute("lastName",IAttributeInfo.BASE_STRING);
              IAttributeInfo phoneNum = input.addAttribute("phoneNum",IAttributeInfo.BASE_STRING);
              IAttributeInfo Place = input.addAttribute("Place",IAttributeInfo.BASE_STRING);
              IAttributeInfo Email = input.addAttribute("Email",IAttributeInfo.BASE_STRING);
              IAttributeInfo Company = input.addAttribute("Company",IAttributeInfo.BASE_STRING);
              //Setting multiplicity
              firstName.setMultiplicity(IAttributeInfo.MULITIPLICITY_1_1);
              lastName.setMultiplicity(IAttributeInfo.MULITIPLICITY_1_1);
              phoneNum.setMultiplicity(IAttributeInfo.MULITIPLICITY_1_1);
              Place.setMultiplicity(IAttributeInfo.MULITIPLICITY_1_1);
              Email.setMultiplicity(IAttributeInfo.MULITIPLICITY_1_1);
              Company.setMultiplicity(IAttributeInfo.MULITIPLICITY_1_1);
              //Pre-Existing Structure for Output
              IStructureInfo output = techDesc.getOutputStructureInfo();
              IStructureInfo userStruct1 = output.addStructure("userStruct1");
              userStruct1.addAttribute("firstName",IAttributeInfo.BASE_STRING);
              userStruct1.addAttribute("lastName",IAttributeInfo.BASE_STRING);
              IStructureInfo userStruct2 = output.addStructure("userStruct2");
              userStruct2.addAttribute("phoneNum",IAttributeInfo.BASE_STRING);
              userStruct2.addAttribute("Place",IAttributeInfo.BASE_STRING);
              userStruct2.addAttribute("Email",IAttributeInfo.BASE_STRING);
              userStruct2.addAttribute("Company",IAttributeInfo.BASE_STRING);
              return techDesc;
        catch (InvocationException ex)
             ex.printStackTrace();
             return null;
        //@@end
      //@@begin javadoc:execute()
      /** Declared method. */
      //@@end
      public void execute( com.sap.caf.eu.gp.co.api.IExecutionContext executionContext )
        //@@begin execute()
        try
              IWDTextAccessor textAccessor = wdComponentAPI.getTextAccessor();
              WebDynproResourceAccessor resourceAccessor = new WebDynproResourceAccessor(textAccessor);
              this.executionContext = executionContext;
              //Input
              IStructure input = executionContext.getInputStructure();
              String firstName = (String)input.getAttribute("firstName");
              String lastName = (String)input.getAttribute("lastName");
              String phoneNum = (String)input.getAttribute("phoneNum");
              String Email= (String)input.getAttribute("Email");
              String Place = (String)input.getAttribute("Place");
              String Company = (String)input.getAttribute("Company");
              wdContext.nodeInput().currentInputElement().setFirstName(firstName);
              wdContext.nodeInput().currentInputElement().setLastName(lastName);
              wdContext.nodeInput().currentInputElement().setPhoneNum(phoneNum);
              wdContext.nodeInput().currentInputElement().setEmail(Email);
              wdContext.nodeInput().currentInputElement().setPlace(Place);
              wdContext.nodeInput().currentInputElement().setCompany(Company);
              //Output
              IStructure output = executionContext.getOutputStructure();
              String f = wdContext.nodeInput().currentInputElement().getFirstName();
              String l = wdContext.nodeInput().currentInputElement().getLastName();
              String pn = wdContext.nodeInput().currentInputElement().getPhoneNum();
              String e = wdContext.nodeInput().currentInputElement().getEmail();
              String p = wdContext.nodeInput().currentInputElement().getPlace();
              String c = wdContext.nodeInput().currentInputElement().getCompany();
              output.setAttributeValue("firstName",f);
              output.setAttributeValue("lastName",l);
              output.setAttributeValue("phoneNum",pn);
              output.setAttributeValue("Email",e);
              output.setAttributeValue("Place",p);
              output.setAttributeValue("Company",c);
        catch(Exception ex)
             ex.printStackTrace();
        //@@end
      //@@begin javadoc:complete()
      /** Declared method. */
      //@@end
      public void complete( )
        //@@begin complete()
        try
              IWDTextAccessor textAccessor = wdComponentAPI.getTextAccessor();
                        WebDynproResourceAccessor resourceAccessor = new WebDynproResourceAccessor(textAccessor);
              IStructure output = executionContext.getOutputStructure();
              IStructure user1 = output.addStructure("userStruct1");
              IStructure user2 = output.addStructure("userStruct2");
              String f = wdContext.nodeInput().currentInputElement().getFirstName();
                        String l = wdContext.nodeInput().currentInputElement().getLastName();
                        String pn = wdContext.nodeInput().currentInputElement().getPhoneNum();
                        String e = wdContext.nodeInput().currentInputElement().getEmail();
                        String p = wdContext.nodeInput().currentInputElement().getPlace();
                        String c = wdContext.nodeInput().currentInputElement().getCompany();
              user1.setAttributeValue("firstName",f);
              user1.setAttributeValue("lastName",l);
              user2.setAttributeValue("phoneNum",pn);
              user2.setAttributeValue("Email",e);
              user2.setAttributeValue("Place",p);
              user2.setAttributeValue("Company",c);
              executionContext.addResultState("Success");
              executionContext.processingComplete();
        catch(InvocationException e)
             e.printStackTrace();
        catch(EngineException ex)
             ex.printStackTrace();
        //@@end
       * The following code section can be used for any Java code that is
       * not to be visible to other controllers/views or that contains constructs
       * currently not supported directly by Web Dynpro (such as inner classes or
       * member variables etc.). </p>
       * Note: The content of this section is in no way managed/controlled
       * by the Web Dynpro Designtime or the Web Dynpro Runtime.
      //@@begin others
      private IExecutionContext executionContext;
      //@@end
    Thanks
    Srikant

  • Reading a char array from Serial port

    Need help!
    Hi, I've got the following problem - I wanna read a input stream from serial port and I use at the moment the following method (reading bytewise):
    public String receiveText (){
          byte ch;
          fStrBuf.delete(0,fStrBuf.length()); //clearing the buffer
    try{
              do {
              ch = (byte) fPortInStream.read();
              fStrBuf.append( (char) ch);
            while ( (byte) ch != 0x03); //The end of frame byte
             }catch(IOException ioe) {};
          return fStrBuf.toString();It works pretty well, but disadvantage is that it's too slow to use it in the thread (at least I think so)
    How can I change it to read all available data from the port (or simply faste). I don't need event listeners, because it's a request-responde communication.
    I tried smth. like this
    byte[] readBuffer = new byte[20];
                try {
                    while (fPortInStream.available() > 0) {
                        int numBytes = inputStream.read(readBuffer);
                        fStrBuf.append(readBuffer);
                } catch (IOException e) {}
          return fStrBuf.toString();But it doesn't seem to work :-(

    May I suggest that you use StringBuilder rather than StringBuffer. It has less overhead because it is not threadsafe. I do synchronous serial port stuff with Opto 22, and i have no listeners enabled.
    Appending to the String(Builder/Buffer) directly from the byte buffer mangles it. So I use a string (ugh). With the Opto22 brain boards, i am looking for a carriage return as a term char. It either finds it or times out.
    This is the best i have come up with so far:
    StringBuilder response = new StringBuilder();
    String data = new String();
    long msTimeOut = 2000;
    public void getResponse () throws IOException {
            byte[] readBuff = {0};
            int charAvail;
            response.delete(0,response.length());
            long ts = Calendar.getInstance().getTimeInMillis();
            try {
                while ( readBuff[readBuff.length-1] != '\r' ) {
                    charAvail = inputStream.available();
                    if ( charAvail > 0 ) {
                        readBuff = new byte[charAvail];
                        inputStream.read(readBuff);
                        response.append(new String(readBuff));
                    if ( Calendar.getInstance().getTimeInMillis() > (ts + msTimeOut) ) {
                        response.delete(0,response.length());
                        response.append("TIMEOUT");
                        break;
            } catch (IOException e) { e.printStackTrace(); throw e; }        
            data = response.substring(0);
        } I just starting writing Java about 4 days ago, so caveat emptor.

  • Reading an object from a binary file

    i am writing objects into my binary file using printwriter class. i am able to write objects into the file but i am having problems reading the object from the file. is there any other way of going about it. i tried using the objectoutputstream and object input stream class. but i am getting run time errors coz of something to do with serialization
    i am storing records as a object into a binary file so that it is easy to seek my records

    Of course you have trouble reading objects after you wrote them with a PrintWriter.
    You should rather have fixed the Serialization errors: only objkects that implement Serializable correctly can be serialized.

  • Create a continuous data stream from C++, and read it in LabView

    Hello all.
    I'm working on a project which involves connecting to a motion tracker and reading position and orientation data from it in realtime. The code to get the data is in c++, so I decided that the best way to do this would be to create a c++ DLL file which contains all the necessary functions to first connect to the device and read the data from it, and use the Call Library Function node to feed this data into Labview. 
    I'm having trouble though, since ideally I would like a continuous stream of data from the c++ code into Labview, and I'm not sure how to achieve this. Putting the call library function node in a while loop seems like an obvious solution, but if I do it this way I would have to reconnect to the device every time I get the data, which is quite a bit too slow. 
    So my question is, if I created c++ function which created a data stream, could I read this into Labview without having to continually call a function? I'd prefer to only have to call a function once, and then read the data stream until a stop command is given.
    I'm using Labview 2010, version 10.0.
    Apologies if the question is poorly phrased, many thanks for your help.
    Dave
    Solved!
    Go to Solution.

    dr8086 wrote:
    This method sounds like an excellent suggestion, but I do have a few questions where I dont think I've understood fully.
    From what I understand the basic premise is to use one call library function node to access a DLL which creates an instance of the device object, and passes a pointer too it into labview. Then a seperate call library function node would pass this pointer to another DLL which could access the device object, update it and read the data. This part could be in a while loop and carry on reading the data until a stop command is given.
    That's it. I'm including some skeleton code as an example. I'm also including the code because I don't know how much you have experience with multi threading, so I'm showing how you'd have to use critical sections to guard the interactions between threads so that they don't lead to issues.
    // exported function to access the devices
    extern "C" __declspec(dllexport) int __stdcall init(uintptr_t *ptrOut)
    *ptrOut= (uintptr_t)new CDevice();
    return 0;
    extern "C" __declspec(dllexport) int __stdcall get_data(uintptr_t ptr, double vals[], int size)
    return ((CDevice*)ptr)->get_data(vals, size);
    extern "C" __declspec(dllexport) int __stdcall close(uintptr_t ptr, double last_vals[], int size)
    int r= ((CDevice*)ptr)->close();
    ((CDevice*)ptr)->get_data(last_vals, size);
    delete (CDevice*)ptr;
    return r;
    // h file
    // Represents a device
    class CDevice
    public:
    virtual ~CDevice();
    int init();
    int get_data(double vals[], int size);
    int close();
    // only called by new thread
    int ThreadProc();
    private:
    CRITICAL_SECTION rBufferSafe; // Needed for thread saftey
    vhtTrackerEmulator *tracker;
    HANDLE hThread;
    double buffer[500];
    int buffer_used;
    bool done; // this HAS to be protected by critical section since 2 threads access it. Use a get/set method with critical sections inside
    //cpp file
    DWORD WINAPI DeviceProc(LPVOID lpParam)
    ((CDevice*)lpParam)->ThreadProc(); // Call the function to do the work
    return 0;
    CDevice::~CDevice()
    DeleteCriticalSection(&rBufferSafe);
    int CDevice::init()
    tracker = new vhtTrackerEmulator();
    InitializeCriticalSection(&rBufferSafe);
    buffer_used= 0;
    done= false;
    hThread = CreateThread(NULL, 0, DeviceProc, this, 0, NULL); // this thread will now be saving data to an internal buffer
    return 0;
    int CDevice::get_data(double vals[], int size)
    EnterCriticalSection(&rBufferSafe);
    if (vals) // provides a way to get the current used buffer size
    memcpy(vals, buffer, min(size, buffer_used));
    int len= min(size, buffer_used);
    buffer_used= 0; // Whatever wasn't read is erased
    } else // just return the buffer size
    int len= buffer_used;
    LeaveCriticalSection(&rBufferSafe);
    return len;
    int CDevice::close()
    done= true;
    WaitForSingleObject(hThread, INFINITE); // handle timeouts etc.
    delete tracker;
    tracker= NULL;
    return 0;
    int CDevice::ThreadProc()
    while (!bdone)
    tracker->update();
    EnterCriticalSection(&rBufferSafe);
    if (buffer_used<500)
    buffer[buffer_used++]= tracker->getRawData(0);
    LeaveCriticalSection(&rBufferSafe);
    Sleep(100);
    return 0;
    dr8086 wrote:
    My main concern is that the object may go out of memory or be deallocated, since it wouldnt be held in any namespace or anything.
    Since you create the object with new, the object won't expire until either the dll is unloaded or the process (LabVIEW) closes. So the object will stay valid between dll calls provided LabVIEW didn't unload the dll (which it does if the VIs are closed). When that happens, I'm not exactly sure what happens to live objects (i.e. if you forgot to call close), I imagine the system reclaims the memory but the device might still be open.
    What I do to make sure that everything gets closed when the dll unloads before I could call close and delete the object is to everytime I create a new object in the dll I add it to a list, when the dll unloads, if the object is still on the list I delete it.
    dr8086 wrote:
    I also have a more general programming question about the purpose of the buffer. Would the buffer basically be a big table of position values, which are stored until they can be read into the rest of the VI? 
    Yes, see the example code.
    However, depending on the frequency with which you need to collect data from the device you might not need this buffer at all. I.e. if you collect a sample about every 100ms then you could remove all threading and buffer related functions and instead read the data from the read function itself like this:
    double CDevice::get_data()
    tracker->update();
    return tracker->getRawData(0);
     Because you'd only need a buffer and a seperate thread if you collect data at a high frequency and you cannot lose any data.
    Matt

  • How to read OLE objects from Access ??

    Hi,
    I have an field of type OLE in my Access Database table. This field has some files stored in it in the form of attachment. The file types of the OLE objects can be different (xls,txt,doc). Now, I want to query the database and find the extension of the files and save it occordingly using java.
    I'm using the following now.
    JdbcOdbcInputStream jois = (JdbcOdbcInputStream) rs     .getBinaryStream("SupportingData");
    byte[] supportingData = jois.readData();
    String data = new String(supportingData);
    I'm getting data in binary format and when I try to look into it, all I can see is the header info of the file.
    Is there anyother way to read the OLE object easily ?
    Please suggest.
    Thanks,
    Mary

    How to read appended objects from file with ObjectInputStream? The short answer is you can't.
    The long answer is you can if you put some work into it. The general outline would be to create a file with a format that will allow the storage of multiple streams within it. If you use a RandomAccessFile, you can create a header containing the length. If you use streams, you'll have to use a block protocol. The reason for this is that I don't think ObjectInputStream is guaranteed to read the same number of bytes ObjectOutputStream writes to it (e.g., it could skip ending padding or such).
    Next, you'll need to create an object that can return more InputStream objects, one per stream written to the file.
    Not trivial, but that's how you'd do it.

  • How to read appended objects from file with ObjectInputStream?

    Hi to everyone. I'm new to Java so my question may look really stupid to most of you but I couldn't fined a solution by myself... I wanted to make an application, something like address book that is storing information about different people. So I decided to make a class that will hold the information for each person (for example: nickname, name, e-mail, web address and so on), then using the ObjectOutputStream the information will be save to a file. If I want to add a new record for a new person I'll simply append it to the already existing file. So far so good but soon I discovered that I can not read the appended objects using ObjectInputStream.
    What I mean is that if I create new file and then in one session save several objects to it using ObjectOutputStream they all will be read with no problem by ObjectInputStream. But after that if in a new session I append new objects they won't be read. The ObjectInputStream will read the objects from the first session after that IOException will be generated and the reading will stop just before the appended objects from the second session.
    The following is just a simple test it's not actual code from the program I was talking about. Instead of objects containing different kind of information I'm using only strings here. To use the program use as arguments in the console "w" to create new file followed by the file name and the strings you want save to the file (as objects). Example: "+w TestFile.obj Thats Just A Test+". Then to read it use "r" (for reading), followed by the file name. Example "+r TestFile.obj+". As a result you'll see that all the strings that are saved in the file can be successfully read back. Then do the same: "+w TestFile.obj Thats Second Test+" and then read again "+r TestFile.obj+". What will happen is that the strings only from the first sessions will be read and the ones from the second session will not.
    I am sorry for making this that long but I couldn't explain it more simple. If someone can give me a solution I'll be happy to hear it! ^.^ I'll also be glad if someone propose different approach of the problem! Here is the code:
    import java.io.*;
    class Fio
         public static void main(String[] args)
              try
                   if (args[0].equals("w"))
                        FileOutputStream fos = new FileOutputStream(args[1], true);
                        ObjectOutputStream oos = new ObjectOutputStream(fos);
                        for (int i = 2; i < args.length ; i++)
                             oos.writeObject(args);
                        fos.close();
                   else if (args[0].equals("r"))
                        FileInputStream fis = new FileInputStream(args[1]);
                        ObjectInputStream ois = new ObjectInputStream(fis);
                        for (int i = 0; i < fis.available(); i++)
                             System.out.println((String)ois.readObject());
                        fis.close();
                   else
                        System.out.println("Wrong args!");
              catch (IndexOutOfBoundsException exc)
                   System.out.println("You must use \"w\" or \"r\" followed by the file name as args!");
              catch (IOException exc)
                   System.out.println("I/O exception appeard!");
              catch (ClassNotFoundException exc)
                   System.out.println("Can not find the needed class");

    How to read appended objects from file with ObjectInputStream? The short answer is you can't.
    The long answer is you can if you put some work into it. The general outline would be to create a file with a format that will allow the storage of multiple streams within it. If you use a RandomAccessFile, you can create a header containing the length. If you use streams, you'll have to use a block protocol. The reason for this is that I don't think ObjectInputStream is guaranteed to read the same number of bytes ObjectOutputStream writes to it (e.g., it could skip ending padding or such).
    Next, you'll need to create an object that can return more InputStream objects, one per stream written to the file.
    Not trivial, but that's how you'd do it.

  • Write / read objects to/from File

    Hello,
    I have a problem with the writing and reading objects to/from a file.
    So what excatly I'm trying to is:
    I have a class Data. A thread creates constantly (until some limit) objects of this class Data.
    Once an object is created, is placed in a buffer (I wrote my own class DataBuffer extention of LinkedList).
    I have a limit on this buffer, so when the limit is reached, another thread starts getings objects from the buffer, writes them on the disk and removing them from the buffer.
    I'm putting the object always on the "top" and I'm reading them and removing always from the "bottom" of the buffer (FIFO).
    For writing the objects Data to the file, I'm using a FileOutputStream and ObjectOutputStream:
    I have something like that:
    FileOutputStream fos = new FileOutputStrea("file_name");
    ObjectOutputStream oos = new ObjectOutputStream(fos);after that I have this:
    while(size > i ){
                        try {
                             Data d = buff.getData();
                             //write to File
                             oos.writeObject(buff.getData());
                             oos.flush();
                             buff.removeData();
                             System.out.println("written data " + d);
                             i++;
                        } catch (IOException e) {
                             e.printStackTrace();
                   }here size is the limit for the buffer.
    So, when the size is equal to the total number of objects that were created and placed in the buffer, I have no problems with the writing/reading from the file.
    But if size is equal, for example, to the half of the total number of objects that were created, I have a problem.
    A more detailed exmple is:
    10 objects were created, the 10 objects were places to the buffer, a test was made and all the objects were written on the disk -> writing and reading are OK.
    if 10 objects were created, and I want to write 5 objects, and after that more 5, the first thing I remarqued is that the size of the file is different from the size of the file created by the first method. Second thing is when I'm reading from the file I can read only 5 objects and after that I have this exception:
    java.io.StreamCorruptedException : invalid type code : AC
    So ... is anyone has an idea why I have this problem?
    PS. For reading from the file I'm using another thread that executes this code:
    fis = new FileInputStream(readFile);
                        ois = new ObjectInputStream(fis);
                        while(true){
                             try{
                                  Data d = (Data)ois.readObject();
                                  System.out.println("data read " + d); //here I'm displaying the object that was read
                                  buff.putData(d);
                             }catch(EOFException e){
                                  break;
                        ois.close();
                        fis.close();
                   }catch (FileNotFoundException e) {
                        e.printStackTrace();
                   }catch(IOException e){
                        e.printStackTrace();
                   }catch (ClassNotFoundException e) {
                        e.printStackTrace();
                   }Regards,
    Anton
    PS. At present I'm writing first all the Data objects, and after that I'm trying to read from the file.
    Edited by: anton_tonev on Oct 5, 2007 4:14 AM

    Hello again :)
    Finally I found the solution :)
    In fact it is important to not to close the FileOutputStream and ObjectOutputStream until all the data was written on the disk.
    What I mean:
    in the begining of the program you have to open these two streams and write down the data that comes from somewhere.
    But you musn't close these streams before the final writing on the disk.
    It must look like this:
    1 Open file stream & opent object stream
    2 you're writing your all objects: one by one; 10 by 10 or as you wish ... but after each writing down you don't close the streams
    3 you already finished with the writing, (the end of your program), now you can close the streams.
    Unfortunatly I don't know why if I write the data and close the stream every time, after that it is impossible to append new data (with reopen the file)

  • I can't read a Object from file, Please help me

    i want to write a Object into File. this is code of Object
    class objStoreCus implements Comparable, Serializable
    String customerID = new String();
    String customerName = new String();
    String customerEmail = new String();
    objStoreCus(String cusID, String cusName, String cusEmail)
    customerID = cusID;
    customerName = cusName;
    customerEmail = cusEmail;
    objStoreCus(){}
    public int compareTo(Object o)
    objStoreCus oS = new objStoreCus();
    oS = (objStoreCus)o;
    return(customerEmail.compareTo(oS.customerEmail));
    private void writeObject(ObjectOutputStream s) throws IOException {
    s.defaultWriteObject();
    private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException {
    try
    s.defaultReadObject();
    }catch(IOException ie){throw new IOException();}
    catch(ClassNotFoundException cnt){throw new ClassNotFoundException();}
    And I was wrote above Object into File by this code :+
    FileOutputStream fos;
    ObjectOutputStream oos;
    FileInputStream fis;
    ObjectInputStream ois;
    public void writeObjToFile(objStoreCus obj)
    try
    fos = new FileOutputStream("Exrcise3.ex3", true);
    }catch(FileNotFoundException fnfe){}
    try
    oos = new ObjectOutputStream(fos);
    //ghi doi tuong vao file
    oos.writeObject(obj);
    //dong stream
    oos.close();
    fos.close();
    }catch(IOException ie){}
    But i can't read above Object from file. allway have a Exception occur "StreamCorruptedException".
    this is code read Object form file :
    *parameter is ArrayList will be store Object from file.
    public void readObjFromFile(ArrayList al)
    try
    fis = new FileInputStream("Exrcise3.ex3");
    }catch(FileNotFoundException fnfe){}
    try
    ois = new ObjectInputStream(fis);
    while(true)
    try
    objStoreCus osc = new objStoreCus();
    osc = (objStoreCus)ois.readObject();
    System.out.println(osc.customerEmail);
    }catch(Exception e)
    e.printStackTrace();
    //System.out.println();
    break;
    ois.close();
    fis.close();
    }catch(IOException ie){}
    }

    Problem lies in
    os = new FileOutputStream("Exrcise3.ex3", true);
    You are trying to append to that file, You should always use new file to serialize objects.
    os = new FileOutputStream("Exrcise3.ex3");
    Try with above line.

Maybe you are looking for

  • Can I surf  other internet options through Apple TV or is it limited to the icons that are displayed?

    My Apple TV always seems to work fine in the a.m. but has no signal in the p.m. Does it have to be reset when this happens?

  • Error on the error log of the apache

    Hi, my site configuration is an oracle application server is installed on a dell server power edge 2800 type of installation is forms and reports . i am not using all the services i am using only report services and java service. i am deploying on th

  • Electronic Data Interchange

    Would Electronic Data Interchange be easy to implemnt and does Oracle support EDI for monthly CIS returns? Any documentation will help

  • How do you make an image appear by clicking on a link?

    I have a div set up as a box for my  images. Underneath I have put a several divs, each of which have numbers in them...01.....02....03....04 I would like to know how to make it so that when you click on 01, an image appears in the box, when you clic

  • Another Magnetic Case Thread

    So, I see that several people have asked about the cases with magnets causing problems. The resounding answer seems to be no, so I'm looking for some theories on what might be going on with my touch. I got a leather case that has two magnets on the s