26. december 2003 - 14:14Der er
18 kommentarer og 1 løsning
Problem med String.split()
Jeg har en lille kringle vedr. String.split(String regex), som jeg mangler nogle ideer til at få løst.
Det drejer som om modtagelse af data på en server fra en række klienter. Når data modtages, er der ofte tale om flere beskeder i samme læsning fra netværksforbindelsen, og beskeder adskilles fra hinanden med \0.
Det problem der skal kringles er så, at det ikke er sikkert at hele beskeder modtages, der kan også være halve. F.eks. kan serveren modtage 1½ besked hvilket vil sige, at den første, hele besked skal afvikles, men den halve gemmes, til der igen læses fra netværksforbindelsen.
Pt. anvender jeg String.split() til at opdele modtagede beskeder: String[] messages = data.split("\0");
Problemet er så, at modtager serveren 1½ besked, vil messages indeholde to String's, den hele og den halve besked, men \0 er fjernes altid split("\0"), således at jeg ikke kan se om den sidste besked i messages er hel eller halv.
Hvordan løser jeg dette problem? Det ville være bedst, om "\0" kom med i indholdet af messages. Løsningen må ikke være en StringTokenizer. Sun fraråder at den bruges og den vil koste for meget CPU-tid, da der hver gang data modtages skal oprettes en ny StringTokenizer - for meget garbage collection...
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
Eriks løsning går ikke, begge eksempler vil returnere 2 strenge.
Arnes: 1) Funktionaliteten køres rigtig ofte på serveren og lidt betyder derfor meget. Det problem jeg ser er, at at en StringTokenizer skal oprettes hver gang, og oprettelse af nye objekter er netop noget der tager tid.
2) Kan ikke lade sig gøre. Protokollen bygger på XML og håndteres automatisk af i Flash-klienten.
3) Ku være jeg skulle kigge lidt på dette. For at sige det mildt er jeg ikke meget inde i dette område.
Følgende sætning fra Suns API for StringTokenizer skræmmer mig også lidt: "StringTokenizer is a legacy class that is retained for compatibility reasons although its use is discouraged in new code. It is recommended that anyone seeking this functionality use the split method of String or the java.util.regex package instead."
Jeg vil lige prøve at lege lidt med det; egentlig anvender String.split() jo blot Pattern.compile(regex).split()...
Hvad er så reglen for at adskille beskeder, hvis du ikke kan gøre som jeg foreslår? Hvordan ville det se ud med StringTokenizer hvis du kan få det til at virke? Hvordan kan du se at beskeden kun er halv og ikke det hele?
Ku godt være man skulle overveje StringTokenizer så. Behandling af regular expressions er åbenbart ikke det mindst tidskrævende man kan sætte CPU'en til...
Regular expressions er et kraftfuyldt værktøj, men det må i sagens natur koste lidt at bruge.
Man kan jo bare prøve at overveje hvordan man selv ville kode regular expressions og string tokenizer. Den sidste er lige ud af landevejen. Den første er lidt giftig.
Når det er sagt så skal man notere sig at reg exp jo er ny i 1.4 og at der formentlig vil blive brugt tid på at optimere den i de kommende versioner (mine tal er iøvrigt kun for 1.4.1_01 på Win32).
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.