JAVA - Skriva på specifika rader i en fil

Permalänk
Medlem

JAVA - Skriva på specifika rader i en fil

Hej

Jag gör ett program i JAVA där jag ska spara nummer tillsammans med ett namn i en fil för att sedan kunna läsa namnet om jag har numret.

Tex:
135,Namn 1
164,Namn 2

Senare ska jag även spara annan information tillsammans med namnen men det är ett senare problem.

Jag tänker att det antagligen är bäst att skriva nr 135 på rad 135 oavsett om det finns tomma rader innan eller ej. Då kan man helt enkelt gå till rad 135 om man ska ha den informationen och slipper kolla varje rad från början om den har nummer 135.

Problemet är att jag inte vet hur jag skriver på en specifik rad. Ska man ha en lista eller finns det nån funktion jag kan använda?

Permalänk

om det skulle ha varit python skulle jag ha kunnat hjälpa dig men på python skulle jag ha väl gjort något i den här sitlen:

rad = 0
while rad != 135:
print "\n"
rad +=1

edit: nu skämde jag allt ut mig xD det kommer ju inte funka så vidare bra
edit2: gör typ en lista där varje rad är en element !

Permalänk
Medlem

Det är ju inge slöseri på minnesutrymme iaf
tänk dig om du har 100 nummer i början, sen har du en på rad 59864, då får du ha massa radbrytningar på några miljoner platser...

Permalänk
Medlem

Du vill alltså kunna öppna filen med en textredigerare för att avläsa namn och nummer?

Visa signatur

I'm Winston Wolfe. I solve problems.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Dalton Sleeper
Det är ju inge slöseri på minnesutrymme iaf
tänk dig om du har 100 nummer i början, sen har du en på rad 59864, då får du ha massa radbrytningar på några miljoner platser...

Funkar ju någorlunda bra om man gzippar den också... men världens bästa metod är det nog inte.

Permalänk
Medlem

Skapa en HashMap med nummer och namn. Sedan kan du spara ner hashmap-objektet till en fil med serialize

HashMap<Integer, String> map = new HashMap<Interger, String>();
map.put(136, "filip");
map.put(139, "johan");

String s = map.get(136); //ger filip

För att spara:
ObjectOutputStream os = .......
os.writeObject(map);

För att läsa in:
ObjectInputStream is = .......
HashMap<Integer, String> map= (HashMap<Integer, String>) is.readObject();

Visa signatur

www.filipsprogram.tk - lite freeware
"Delight, herregud. Talang är bara förnamnet."

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Dalton Sleeper
Det är ju inge slöseri på minnesutrymme iaf
tänk dig om du har 100 nummer i början, sen har du en på rad 59864, då får du ha massa radbrytningar på några miljoner platser...

Just det, det tänkte jag inte på. Det ska ifs bara vara några hundra men det blir ju ganska onödigt.

Citat:

Ursprungligen inskrivet av matti4s
Du vill alltså kunna öppna filen med en textredigerare för att avläsa namn och nummer?

Precis. Kan man det om man kör med HashMap och Serialize?

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av dawe91
Kan man det om man kör med HashMap och Serialize?

Nej, det verkar man inte kunna. Hur ska man göra då?

Permalänk
Medlem

Om man vill kunna läsa specifika poster i filer på disk är det vanligtvis lättast att skriva filen i binärt format. På det sättet vet du exakt hur stor varje "rad" är, och man kan omedelbart hoppa till den post man vill ha genom att hoppa till den första byten som används till den posten. Filer i klartext är krångligare eftersom rader inte har någon innebörd för datorn, det är bara ett tecken som vilket som helst. Man måste alltså läsa in tecknet och avgöra om det är en ny rad "manuellt" (finns funktioner i vissa klasser för att läsa in en hel rad från en fil med klartext. Tror "Scanner" kan användas till detta t.ex.).
Nackdelen med binära filer är dock att man inte kan öppna filen och läsa/ändra den enkelt för hand (notepad etc.) eftersom den är skriven som bytekod. Man måste också se till att man ger varje post tillräckligt med plats för att lagra informationen, så med strängar kan det bli en del bortkastade byte.

Om du måste ha klartext så skulle jag tro att det är enklare att helt enkelt läsa in hela filen från början till slut och lagra på lämpligt sätt i minnet. Om du inte har väldigt mycket data att hantera så bör det inte vara något problem varken för hastigheten (sekventiell inläsning går ganska snabbt) eller för minnet (1GB ledigt minne skulle låta dig lagra över 9 miljarder tecken). När det väl är inläst så går det snabbt att helt enkelt gå igenom listan tills du hittar det du söker. Alternativt, om det ändå är ganska många element, så kan du sortera listan först (om den inte redan är sorterad) och sedan använda binärsökning.

Att lagra en massa tomma rader tror jag inte skulle hjälpa speciellt mycket. Du måste fortfarande läsa igenom hela filen tills du kommer till en icke-tom rad som dessutom matchar det du söker. Den enda fördelen är väl egentligen att du inte behöver lagra onödig data i minnet om du endast behöver en av raderna, men utifrån det som sagt så betvivlar jag att det skulle vara ett stort problem.

Permalänk
Medlem

Ok. Ska jag använda Serialize eller finns det något annat enklare sätt? Jag har bara sett det ett par gånger tidigare.

Permalänk
Medlem

Om du inte har några egna eller exotiska datatyper i det du vill lagra så ska det bara vara att lägga till "implements Serializable" till klassen om jag kommer ihåg rätt. Var ett tag sedan jag höll på det här i Java. Jag måste erkänna att jag inte har så bra koll på exakt hur Java uppför sig när det gäller sånt här heller. Pröva att skriva ett par poster binärt och sedan läsa in dom så ser du om det fungerar eller inte.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av dawe91
Nej, det verkar man inte kunna. Hur ska man göra då?

Spara nummer och namn som du skrev i första posten men hoppa över tomma rader.

Visa signatur

I'm Winston Wolfe. I solve problems.