webForumDet fria alternativet

RandomAccessFile

4 svar · 242 visningar · startad av Blårand

BlårandMedlem sedan jan. 20031 504 inlägg
#1

Har skapat en klass där jag har följande method. Poängen är att man ska skriva in det medsända uppgifterna i en "RandomAccessFile". Har försökt och vridit och vänt på detta, men får det inte att fungera.

Vad är det som är fel i nedanstående kod, alternativt vad krävs för justeringar för att jag ska kunna lagra de tre värdena på en post i "RandomAccessFile"-filen?

public void writePost(String strFilnamn, int intPost, int intOrgnr, String strNamn, String strOrt)throws IOException
{
	try {
		RandomAccessFile file = new RandomAccessFile(strFilnamn,"rw");
	
	file.seek(intPost);

	// Skriver in orgnr
	file.writeInt(intOrgnr);

	// Skriver in namn
	StringBuffer buffer = null;
	if ( strNamn != null )
		buffer = new StringBuffer( strNamn );
	else
		buffer = new StringBuffer( 15 );

	buffer.setLength( 15 );
      	file.writeChars( buffer.toString() );

      	// Skriver in filial
      	buffer = null;
	if ( strOrt != null )
		buffer = new StringBuffer( strOrt );
	else
		buffer = new StringBuffer( 15 );

	buffer.setLength( 15 );
      	file.writeChars( buffer.toString() );
      	file.close();

        } catch (IOException e) {
                JOptionPane.showMessageDialog(null,"FEL - Något gick knas tyvärr.");
	}
}
LimeMedlem sedan sep. 2001837 inlägg
#2

Jag antar att du har tänkt såhär:

post 1: Organisationsnummer Namn Ort
post 2: Organisationsnummer Namn Ort
...
post n: Organisationsnummer Namn Ort

Vet inte hur du anropar writePost men om jag antar att du skriver:
tr.writePost("c:\\temp\\test.txt", 7, 10002, "Lime7", "Stockholm");
för att få post 7 så blir det lite fel...

Då flyttar då markören till position 7 i filen och skriver därifrån. Vad du borde göra är att kolla hur lång en post är. I ditt fall blir den alltid orgnr + 15 +15. Du borde, om du inte väljer att ha en delare, t.ex. ; eller en post på varje rad, även sätta ett fast avstånd på organisationsnummret. Som det är nu så skriver den char-representationen av organisationsnummret.

Kod kommer strax...

LimeMedlem sedan sep. 2001837 inlägg
#3
    static final int POST_LENGTH_NAME = 15;
    static final int POST_LENGTH_TOWN = 15;
    static final int POST_LENGTH_ORGNO = 15;
    static final int POST_LENGTH_TOTAL = POST_LENGTH_NAME + POST_LENGTH_ORGNO + POST_LENGTH_TOWN+1;
    

    public void writePost(String strFilnamn, int intPost, int intOrgnr, String strNamn, String strOrt)
            throws IOException
    {
        try
        {
            RandomAccessFile file = new RandomAccessFile(strFilnamn, "rw");

            file.seek(intPost*POST_LENGTH_TOTAL);
            StringBuffer buffer = new StringBuffer();
            StringBuffer tmp_buffer = new StringBuffer(15);
            // Skriver in orgnr
            tmp_buffer.append(intOrgnr);
            tmp_buffer.setLength(POST_LENGTH_ORGNO);
            buffer.append(tmp_buffer);
            

            // Skriver in namn
            
            if (strNamn != null)
                tmp_buffer = new StringBuffer(strNamn);
            else
                tmp_buffer = new StringBuffer(POST_LENGTH_NAME);

            tmp_buffer.setLength(POST_LENGTH_NAME);
            buffer.append(tmp_buffer);

            // Skriver in filial
            if (strOrt != null)
                tmp_buffer = new StringBuffer(strOrt);
            else
                tmp_buffer = new StringBuffer(POST_LENGTH_TOWN);

            tmp_buffer.setLength(POST_LENGTH_TOWN);
            buffer.append(tmp_buffer);
            buffer.append(System.getProperty("line.separator"));
            buffer.setLength(POST_LENGTH_TOTAL);
                    
            
            file.writeChars(buffer.toString());
            file.close();

        }
        catch (IOException e)
        {
            System.out.println("FEL - Något gick knas tyvärr.");
            e.printStackTrace();
        }

Kanske lite bättre... men inte bra...

BlårandMedlem sedan jan. 20031 504 inlägg
#4

Tack för informationen.

Det var visst placeringen av vart datat skulle skrivas in som var grundorsaken till problemet, då jag missat att flytta markören till rätt post i filen med file.seek(intPost*POST_LENGTH_TOTAL);.

När jag ändå är på gång, vad fyller e.printStackTrace(); som du använder när du felhanterar i din exempelkod, för funktion?

LimeMedlem sedan sep. 2001837 inlägg
#5

e.printStackTrace() printar ut call-stacken. Då går det att se anropskjedjan och man får då exakt veta vilken rad som går åt helvete och vilka metoder som har anropat vem i vilken ordning.

Användbart när man kan få anrop till samma klass och samma metod från 100 olika andra klasser. Svårt att veta om det är "min" klass som gjort fel eller den som anropat metoden som skickat skräp.

Genererad på 371 ms · cache AV · v20260730165559-full.f96bc7eb