package easyIO; import java.io.*; /** * Klasse for enkel lesing fra tastatur og fil som brukes i boken * "Rett p? Java".2.utg. 2005 og 2007. Versjon 5 med forbedret versjon * ved bruk av brukerdefinerte skilletegn. * *
Klassen tilbyr tre lesemodi: Tegn for tegn (metoden inChar),
* grupper av tegn (ord og tall) (metodene inInt, inWord, inDouble, nextChar,...)
* og linjer med tekst (metodene inLine og readLine), og tilbyr mulighet for ? spesisere
* hva som skal oppfattes som skilletegn (forh?ndsvalge er at alle
* blanke tegn er skilletegn). I tillegg tilbyr klassen metoder for ?
* sjekke input. For eksempel kan man bruke metoden
* hasNextInt()
for ? sjekke om neste gruppe av tegn kan
* tolkes som et heltall, og dermed leses med metoden inInt uten at
* det oppst?r feil.
*
*
N?r man gj?r innlesing kan det opps? feil. Det kan for eksempel * hende at man har oppgitt feil filnavn slik at filen ikke finnes. * Denne typen feil kalles et IO-unntak (Input/Output). Hvis et IO-unntak * oppst?r avsluttes hele programmet, og det gis en melding om ?rsaken. * *
En annen type feil som kan oppst?, er at man for eksempel * ?nsker ? lese inn et heltall, men det man faktisk leser er en annen * type (for eksempel en tekst). Hvis man leser fra fil vil programmet * ogs? da avsluttes med en melding om hva som gikk galt, og hvilken * linje i fila det gikk galt p?. Hvis man leser fra tastatur bes * brukeren om ? skrive inn tallet en gang til. Brukeren gis to * muligheter for ? skrive riktig tall. Etter det avsluttes programmet * hvis brukeren ikke gir riktig input. * *
* // ?pner filen "test.txt" for lesing: * In in = new In("test.txt"); * * // Leser et ord fra filen * String ord = in.inWord(); * * // Leser et tall fra filen * int i = in.inInt(); * * // Leser resten av ordene i filen (blanke tegn ignoreres) * while (in.hasNext()) { * String ord = in.inWord(); * // ... * } ** *
* // ?pner en leser * In in = new (); * * // Leser inn ett ord - venter p? input fra bruker. * String s = in.inWord(); * * // Leser og returnerer resten av linja, * // evt. neste linje hvis linja kun hadde * // linjeskifttegn igjen. * // Venter p? input fra bruker. * String linje = in.inLine(); * ** *
inWord
) leser grupper
* med tegn. En gruppe med tegn er de tegn som finnes mellom to
* skilletegn. I utganspunktet er alle blanke tegn
* (mellomrom, tabulator, ny linje, osv) satt som skilletegn, men det
* kan endres p? to m?ter. Enten kan man sette skilletegn med
* metoden {@link #setDelimiter(String) setDelimiter(String
* delimiter)}, eller man kan bruke innlesingsvarianten som tar en
* tekst med skilletegn som parameter (for eksempel {@link
* #inWord(String) inWord(String sep)}. Det f?rste alternativet
* (setDelimiter
) vil p?virke alle
* innlesingsmetodene. Det andre alternativet vil kun gjelde for den
* ene innlesingen. N?r man setter egne skilletegn vil man fjerne
* blank (mellomrom) og tab fra skilletegne og legge til de tegn man m?tte ?nske
* som f.eks ; eller ,. Man vil imidlertid alltid ha med de andre
* 'skjulte' blanke tegnene og linjeskifttegnene som varierer
* mellom operativsystemene (CRLF) DOS/Windows, (LF) Unix og (LFCR) Mac som skilletegn.
*
*
* inLine() og readLine()
*
* Tenk at in-bufferet p? et tidspunkt inneholder f?lgende uleste
* tegn: '1' '0' '0' '\n'
, det vil si at brukeren har
* skrevet inn "100" og trykket [ENTER]. Hvis vi n? leser inn tallet
* med metoden inInt
leses de tre f?rste tegnene, som
* s? konverteres til en int
med verdien 100. In-bufferet
* inneholder da et eller to ulest tegn, nemlig '\n' (evt \n\r), som er tegn for
* linjeskift. Hvis vi s? ?nsker at brukeren skal skrive inn en linje
* med tekst, som vi skal lese, kan vi ikke uten videre bruke metoden
* readLine som returnerer resten av en linje. I dette tilfellet vil
* readLine kun returnere en tom tekst. Den leser nemlig teksten frem
* til og med f?rste linjeskifttegn, og returnerer teksten untatt
* linjeskifttegn. Man m? derfor f?rst kvitte seg med
* linjeskifttegn, ved for eksempel ? kalle p? metoden
* skipWhite
.
*
* For ? b?te p? dette problemet tilbyr klassen metoden
* inLine
. Denne metoden leser f?rst alle tegnene forbi
* f?rste linjeskift-tegn, og returnerer s? teksten frem til neste
* linjeskift-tegn. Programkoden kan dermed se slik ut:
*
* int tall = in.inInt(); * System.out.print("Skriv inn en linje: ") * String linje = in.inLine(); ** * @author Forfatterne av "Rett p? Java" * @version 5.0 (april.2007) */ public class In extends InExp { static final String versjon = "ver.5.0 - 2007-04"; /** * Konstrukt?r for lesing av standard input (tastatur). */ public In() { super(); } /** * Konstrukt?r for lesing av fil * @param filnavn navn p? filen */ public In(String filnavn) { try { bf = new BufferedReader(new FileReader(filnavn)); FILE = true; } catch (IOException ioe) { feil("In(filnavn): " + ioe.getMessage()); } } /** * Konstrukt?r for lesing av URL * @param url nettadressen til filen som skal leses. * @see java.net.URL */ public In(java.net.URL url) { try { bf = new BufferedReader(new InputStreamReader (url.openStream())); } catch (IOException ioe) { feil("In(url): " + ioe.getMessage()); } } /** * Setter hvilke tegn som skal brukes som skilletegn. * @param delimiter teksten med tegn som skal brukes som skilletegn. * @since versjon 2 * @see #resetDelimiter * @see #getDelimiter */ public void setDelimiter(String delimiter) { super.setDelimiter(delimiter); } /** * Setter skilletegn til forh?ndsvalgt * standardverdi, som er alle blanke tegn. * @since versjon 2 * @see #setDelimiter * @see #getDelimiter */ public void resetDelimiter() { super.resetDelimiter(); } /** * Returnerer skilletegnteksten. Hvis * teksten som returneres er
null
betyr det at alle
* blanke tegn er skilletegn (det er ogs? forh?ndsvalgt).
* @return en peker til teksten med skilletegn
* @since versjon 2
*/
public String getDelimiter() {
return super.getDelimiter();
}
/**
* Gir hvilken linje som leses n?. F?rste inputlinje er linje nummer 0.
* @return linjenummeret til linjen som leses n?.
*/
public int getLineNumber() {
return super.getLineNumber();
}
/**
* Leser og returnerer resten av en linje (linjeskifttegnet leses,
* men returneres ikke). Hvis linjen som leses kun bestod av et
* linjeskift-tegn, leses og returneres neste linje.
* @return en linje med tekst, eller null
hvis det
* ikke finnes mer ? lese.
* @see #readLine
*/
public String inLine() {
try {
return super.inLine();
} catch (IOException ioe) {
feil("inLine(): " + ioe.getMessage());
return null;
}
}
/**
* Leser og returnerer resten av linja. Linjeskifttegn leses, men
* returneres ikke som en del av teksten. Hvis linja kun inneholdt
* et linjeskifttegn betyr returneres en tom tekst
* (""
).
* @return en linje med tekst, eller null
* hvis et ikke finnes mer ? lese.
* @see #inLine
* @since versjon 2
*/
public String readLine() {
try {
return super.readLine();
} catch (IOException ioe) {
feil("readLine(): " + ioe.getMessage());
return null;
}
}
/**
* Leser og returnerer et tegn. Hvis parameteren er 'true', returnes
* f?rste tegnet som ikke h?rer til blant skilletegn., hvis parameteren er 'false'
* returneres det f?rste uleste tegnet (uansett om det er skilletegn eller ikke).
* @return tegnet som ble lest
* @see BufferedReader#read
*/
public char inChar(boolean useSep) {
try {
return super.inChar(useSep);
} catch (IOException ioe) {
feil("inChar(boolean): " + ioe.getMessage());
return 0;
}
}
/**
* Leser og returnerer et tegn. Denne metoden
* returnerer det f?rste uleste tegnet (uansett om det er skilletegn eller ikke).
* @return tegnet som ble lest.
* @see BufferedReader#read
*/
public char inChar() {
return inChar(false);
}
/**
* Leser og returnerer det f?rste uleste tegnet som ikke er et av
* skilletegn.
* i tekstensep
eller de blanke tegnene som alltid er skilletegn.
* @param sep teksten med skilletegn
* @return f?rste tegn etter innledende skilletegn
*/
public char inChar(String sep) {
try {
return super.inChar(sep);
} catch (IOException ioe) {
feil("inChar(String): " + ioe.getMessage());
return 0;
}
}
/**
* Tester om det ikke finnes mer ? lese. For lesing fra fil vil
* det v?re sant n?r alt p? fila er lest. For lesing fra tastatur
* vil det bety at kall p? en lesemetode vil blokkere,
* dvs. vente p? input fra brukeren.Hvis det leses tegnvis eller linjevis
* vil denne metoden ikke flytte lesemark?ren.
* @return true
hvis det ikke finnes flere uleste tegn.
*/
public boolean endOfFile() {
try {
return super.endOfFile();
} catch (IOException ioe) {
feil("endOfFile(): " + ioe.getMessage());
return false;
}
}
/**
* Leser og returnerer neste tegn som ikke er et skilletegn. Hvis ikke flere slike finnes
* returneres verdien -1 omtypet til en char. Dette er det samme
* tegnet som returneres ved slutt p? fil.
* @return neste ikke-blanke tegn
* @since versjon 2
*/
public char nextChar() {
try {
return super.nextChar();
} catch (IOException ioe) {
feil("nextChar(): " + ioe.getMessage());
return 0;
}
}
/**
* Sjekker om det finnes uleste tegn som ikke er et av
* skilletegnene.
* @return true
hvis det finnes uleste tegn som ikke
* er definert som skilletegn.
* @see #nextChar
* @since versjon 2
*/
public boolean hasNextChar() {
try {
return super.hasNextChar();
} catch (IOException ioe) {
feil("hasNextChar(): " + ioe.getMessage());
return false;
}
}
/**
* Sjekker om det finnes uleste tegn som ikke er blant skilletegnene i teksten
*sep
eller de blanke tegnene som alltid er skilletegn.
* @param sep teksten med skilletegn
* @return true
hvis det finnes uleste tegn som ikke
* er et skilletegn.
* @see #inChar(String)
* @since versjon 2
*/
public boolean hasNextChar(String sep) {
try {
return super.hasNextChar(sep);
} catch (IOException ioe) {
feil("hasNextChar(String): " + ioe.getMessage());
return false;
}
}
/**
* Flytter lesehodet frem slik at neste uleste tegn er et
* ikke-blankt tegn (evt. slutt p? fil/input)
* @see #skipSep(String)
*/
public void skipWhite() {
try {
super.skipWhite();
} catch (IOException ioe) {
feil("skipWhite(): " + ioe.getMessage());
}
}
/**
* Flytter lesehodet frem slik at neste uleste tegn ikke er et skilletegn (evt. slutt p? fil/input)
* @since versjon 2
*/
public void skipSep() {
try {
super.skipSep();
} catch (IOException ioe) {
feil("skipSep(): " + ioe.getMessage());
}
}
/**
* Flytter lesehodet frem slik at neste uleste tegn ikke er et skilletegnene definert i teksten
*sep
eller de blanke tegnene som alltid er skilletegn. (evt. slutt p? fil/input).
* @param sep teksten med skilletegn.
*/
public void skipSep(String sep) {
try {
super.skipSep(sep);
} catch (IOException ioe) {
feil("skipSep(String): " + ioe.getMessage());
}
}
/**
* Leser og returnerer f?rste gruppe med ikke-blanke tegn,
* evt. null
hvis alle ikke-blanke tegn er
* lest. Denne metoden erstatter {@link #inWord}
* @return en tekst med ikke-blanke tegn.
* @since versjon 2
*/
public String next() {
try {
return super.next();
} catch (IOException ioe) {
feil("next(): " + ioe.getMessage());
return null;
}
}
/**
* Leser og returnerer en gruppe med tegn. En gruppe med tegn er
* tegnene som finnes mellom to skilletegn.
*
* @return et gruppe med tegn
* @see #setDelimiter #next
*/
public String inWord() {
try {
return super.inWord();
} catch (IOException ioe) {
feil("inWord(): " + ioe.getMessage());
return null;
}
}
/**
* Leser og returnerer en gruppe med tegn. En
* gruppe med tegn er tegnene som finnes mellom to skilletegnene i teksten sep
.
* @param sep tekst med tegn som skal brukes som skilletegn
* @return en gruppe med tegn
*/
public String inWord(String sep) {
try {
return super.inWord(sep);
} catch (IOException ioe) {
feil("inWord(): " + ioe.getMessage());
return null;
}
}
/**
* Sjekker om det finnes flere uleste grupper av tegn som ikke er
* blant skilletegnene. Legg merke til
* at metoden ikke blokerer og venter p? input fra bruker (gjelder
* lesing fra tastatur). Det vil si at det kun sjekkes uleste tegn
* som allerede er i in-bufferet.
* @return true
hvis det finnes minst ett ulest
* ikke-blankt tegn.
* @since versjon 2
*/
public boolean hasNext() {
try {
return super.hasNext();
} catch (IOException ioe) {
feil("hasNext(): " + ioe.getMessage());
return false;
}
}
/**
* Sjekker om det finnes flere uleste grupper av tegn som ikke er
* blant skilletegnene i teksten
* sep
. Legg merke til at metoden ikke blokerer og
* venter p? input fra bruker (gjelder lesing fra tastatur). Det
* vil si at det kun sjekkes uleste tegn som allerede er i in-bufferet.
* @return true
hvis det finnes minst ett ulest
* ikke-blankt tegn.
* @since versjon 2
*/
public boolean hasNext(String sep) {
try {
return super.hasNext(sep);
} catch (IOException ioe) {
feil("hasNext(String): " + ioe.getMessage());
return false;
}
}
/**
* Tester slutt p? fil. Samme som: !hasNext( String sep);
*/
public boolean lastItem(String sep) {
try {
return ! super.hasNext(sep);
} catch (IOException ioe) {
feil("lastItem(String): " + ioe.getMessage());
return false;
}
}
/**
* Tester slutt p? fil. Samme som: !hasNext();
*/
public boolean lastItem() {
try {
return ! super.hasNext();
} catch (IOException ioe) {
feil("lastItem(): " + ioe.getMessage());
return false;
}
}
/**
* Leser neste gruppe med tegn, og tolker dette som en boolsk
* verdi. Hvis gruppen med tegn tilsvarer teksten "true"
* returneres true
ellers returneres
* false
. En gruppe med tegn er tegnene som finnes
* mellom to skilletegn.
* @return neste gruppe med tegn tolket som en boolean
* @since versjon 2
*/
public boolean inBoolean() {
try {
return super.inBoolean();
} catch (IOException ioe) {
feil("inBoolean(): " + ioe.getMessage());
return false;
}
}
/**
* Leser neste gruppe med tegn. Hvis gruppen med tegn tilsvarer
* teksten "true" returneres true
ellers returneres
* false
. En gruppe med tegn er tegnene som finnes
* mellom to av skilletegnene i teksten
*sep
eller de blanke tegnene som alltid er skilletegn.
* @return neste gruppe med tegn tolket som en boolean
* @since versjon 2
*/
public boolean inBoolean(String sep) {
try {
return super.inBoolean(sep);
} catch (IOException ioe) {
feil("inBoolean(String): " + ioe.getMessage());
return false;
}
}
/**
* Som {@link #hasNext}, men tester om neste gruppe kan tolkes som
* en boolsk verdi.
* @return true
hvis neste gruppe av tegn kan tolkes
* som en boolsk verdi.
* @see #inBoolean
* @since versjon 2
*/
public boolean hasNextBoolean() {
try {
return super.hasNextBoolean();
} catch (IOException ioe) {
feil("hasNextBoolean(): " + ioe.getMessage());
return false;
}
}
/**
* Som {@link #hasNext(String)}, men tester om neste gruppe kan
* tolkes som en boolsk verdi.
* @param sep teksten med skilletegn
* @return true
hvis neste gruppe av tegn kan tolkes
* som en boolsk verdi.
* @see #inBoolean(String)
* @since versjon 2
*/
public boolean hasNextBoolean(String sep) {
try {
return super.hasNextBoolean(sep);
} catch (IOException ioe) {
feil("hasNextBoolean(String): " + ioe.getMessage());
return false;
}
}
/**
* Leser neste gruppe med tegn, og returnerer denne tolket som en
* byte. For konvertering fra tekst til tall brukes
* desimaltallsystemet. Hvis teksten ikke lar seg oversette til en
* byte, kastes en {@link NumberFormatException}. En gruppe med
* tegn er tegnene mellom to av skilletegnene.
* @return neste gruppe med tegn tolket som en byte.
* @see Byte#parseByte
* @since versjon 2
*/
public byte inByte() {
String cause = null;
for (int i = 0; i < numTry(); i++) {
try {
return super.inByte();
} catch (IOException ioe) {
feil("inByte(): " + ioe.getMessage());
return 0;
} catch (NumberFormatException nfe) {
cause = getCause(nfe);
if (FILE) {
tallfeil("Ved lesing av byte, linje " +
getLineNumber() + ": " +
"leste " +
cause + ".");
} else {
System.out.print("Forventer en byte. Pr?v igjen: ");
}
}
}
tallfeil("Ved lesing av byte, leste " + cause + ".");
return 0;
}
/**
* Leser neste gruppe med tegn, og returnerer denne tolket som en
* byte. For konvertering fra tekst til tall brukes
* desimaltallsystemet. Hvis teksten ikkel ar seg oversette til en
* byte, kastes en {@link NumberFormatException}. En gruppe med
* tegn er tegnene mellom to av skilletegnene i tekstensep
eller de blanke tegnene som alltid er skilletegn. .
* false
* @return neste gruppe med tegn tolket som en boolean
* @since versjon 2
*/
public byte inByte(String sep) {
String cause = null;
for (int i = 0; i < numTry(); i++) {
try {
return super.inByte(sep);
} catch (IOException ioe) {
feil("inByte(String): " + ioe.getMessage());
return 0;
} catch (NumberFormatException nfe) {
cause = getCause(nfe);
if (FILE) {
tallfeil("Ved lesing av byte, linje " +
getLineNumber() + ": " +
"leste " +
cause + ".");
} else {
System.out.print("Forventer en byte. Pr?v igjen: ");
}
}
}
tallfeil("Ved lesing av byte, leste " + cause + ".");
return 0;
}
/**
* Tester om neste gruppe med tegn kan konverteres til en
* byte. Det antas at teksten er skrevet i desimaltallsystemet. En
* gruppe med tegn er tegnene mellom to skilletegn.
* @return true
hvis neste gruppe med tegn lar seg
* konvertere til en byte.
* @see #inByte
* @see Byte#parseByte
* @since versjon 2
*/
public boolean hasNextByte() {
try {
return super.hasNextByte();
} catch (IOException ioe) {
feil ("hasNextByte(): " + ioe.getMessage());
return false;
}
}
/**
* Tester om neste gruppe med tegn kan konverteres til en
* byte. Det antas at teksten er skrevet i det
* desimaltallsystemet. En gruppe med tegn er tegnene mellom to av
* skilletegnene i teksten
*sep
eller de blanke tegnene som alltid er skilletegn.
* @return true
hvis neste gruppe med tegn lar seg
* konvertere til en byte.
* @param sep teksten med skilletegn.
* @see #inByte(String)
* @see Byte#parseByte
* @since versjon 2
*/
public boolean hasNextByte(String sep) {
try {
return super.hasNextByte(sep);
} catch (IOException ioe) {
feil("hasNextByte(String): " + ioe.getMessage());
return false;
}
}
/**
* Leser neste gruppe med tegn, og returnerer denne tolket som en
* double. For kokvertering fra tekst til tall brukes
* desimaltallsystemet. Hvis teksten ikke lar seg oversette til en
* double, kastes en {@link NumberFormatException}. En gruppe med
* tegn er tegnene mellom to skilletegn.
* @return neste gruppe med tegn tolket som en double.
* @see Double#parseDouble
*/
public double inDouble() {
String cause = null;
for (int i = 0; i < numTry(); i++) {
try {
return super.inDouble();
} catch (IOException ioe) {
feil("inDouble(): " + ioe.getMessage());
return 0;
} catch (NumberFormatException nfe) {
cause = getCause(nfe);
if (FILE) {
tallfeil("Ved lesing av en double, linje " +
getLineNumber() + ": " +
"leste " +
cause + ".");
} else {
System.out.print("Forventer et desimaltall. Pr?v igjen: ");
}
}
}
tallfeil("Ved lesing av en double, leste " + cause + ".");
return 0;
}
/**
* Leser neste gruppe med tegn, og returnerer denne tolket som en
* double. For kokvertering fra tekst til tall brukes
* desimaltallsystemet. Hvis teksten ikke lar seg oversette til en
* double, kastes en {@link NumberFormatException}. En gruppe med
* tegn er tegnene mellom to av skilletegnene i teksten
*sep
eller de blanke tegnene som alltid er skilletegn. .
* @return neste gruppe med tegn tolket som en double.
* @see Double#parseDouble
*/
public double inDouble(String sep) {
String cause = null;
for (int i = 0; i < numTry(); i++) {
try {
return super.inDouble(sep);
} catch (IOException ioe) {
feil("inDouble(String): " + ioe.getMessage());
return 0;
} catch (NumberFormatException nfe) {
cause = getCause(nfe);
if (FILE) {
tallfeil("Ved lesing av en double, linje " +
getLineNumber() + ": " +
"leste " +
cause + ".");
} else {
System.out.print("Forventer et desimaltall. Pr?v igjen: ");
}
}
}
tallfeil("Ved lesing av en double, leste " + cause + ".");
return 0;
}
/**
* Tester om neste gruppe med tegn kan konverteres til en
* double. Det antas at teksten er skrevet i
* desimaltallsystemet. En gruppe med tegn er tegnene mellom to skilletegn.
* @return true
hvis neste gruppe med tegn lar seg
* konvertere til en double.
* @see #inDouble
* @see Double#parseDouble(String)
* @since versjon 2
*/
public boolean hasNextDouble() {
try {
return super.hasNextDouble();
} catch (IOException ioe) {
feil ("hasNextDouble(): " + ioe.getMessage());
return false;
}
}
/**
* Tester om neste gruppe med tegn kan konverteres til en
* Double. Det antas at teksten er skrevet i det
* desimaltallsystemet. En gruppe med tegn er tegnene mellom to av
* skilletegnene i teksten
* sep
eller de blanke tegnene som alltid er skilletegn.
* @return true
hvis neste gruppe med tegn lar seg
* konvertere til en byte.
* @param sep teksten med skilletegn.
* @see #inDouble(String)
* @see Double#parseDouble(String)
* @since versjon 2
*/
public boolean hasNextDouble(String sep) {
try {
return super.hasNextDouble(sep);
} catch (IOException ioe) {
feil ("hasNextDouble(String): " + ioe.getMessage());
return false;
}
}
/**
* Leser neste gruppe med tegn, og returnerer denne tolket som en
* double. For kokvertering fra tekst til tall brukes
* desimaltallsystemet. Hvis teksten ikke lar seg oversette til en
* float, kastes en {@link NumberFormatException}. En gruppe med
* tegn er tegnene mellom to skilletegn.
* @return neste gruppe med tegn tolket som en float.
* @see Float#parseFloat(String)
* @since versjon 2
*/
public float inFloat() {
String cause = null;
for (int i = 0; i < numTry(); i++) {
try {
return super.inFloat();
} catch (IOException ioe) {
feil("inFloat(): " + ioe.getMessage());
return 0;
} catch (NumberFormatException nfe) {
cause = getCause(nfe);
if (FILE) {
tallfeil("Ved lesing av en float, linje " +
getLineNumber() + ": " +
"leste " +
cause + ".");
} else {
System.out.print("Forventer et desimaltall. Pr?v igjen: ");
}
}
}
tallfeil("Ved lesing av en float, leste " + cause + ".");
return 0;
}
/**
* Leser neste gruppe med tegn, og returnerer denne tolket som en
* float. For kokvertering fra tekst til tall brukes
* desimaltallsystemet. Hvis teksten ikke lar seg oversette til en
* float, kastes en {@link NumberFormatException}. En gruppe med
* tegn er tegnene mellom to av skilletegnene i teksten
* sep
eller de blanke tegnene som alltid er skilletegn. .
* @return neste gruppe med tegn tolket som en float.
* @param sep teksten med skilletegn.
* @see Float#parseFloat(String)
* @since versjon 2
*/
public float inFloat(String sep) {
String cause = null;
for (int i = 0; i < numTry(); i++) {
try {
return super.inFloat(sep);
} catch (IOException ioe) {
feil("inFloat(String): " + ioe.getMessage());
return 0;
} catch (NumberFormatException nfe) {
cause = getCause(nfe);
if (FILE) {
tallfeil("Ved lesing av en float, linje " +
getLineNumber() + ": " +
"leste " +
cause + ".");
} else {
System.out.print("Forventer et desimaltall. Pr?v igjen: ");
}
}
}
tallfeil("Ved lesing av en float, leste " + cause + ".");
return 0;
}
/**
* Tester om neste gruppe med tegn kan konverteres til en
* float. Det antas at teksten er skrevet i
* desimaltallsystemet. En gruppe med tegn er tegnene mellom to skilletegn.
* @return true
hvis neste gruppe med tegn lar seg
* konvertere til en float.
* @see #inFloat
* @see Float#parseFloat(String)
* @since versjon 2
*/
public boolean hasNextFloat() {
try {
return super.hasNextFloat();
} catch (IOException ioe) {
feil("hasNextFloat(): " + ioe.getMessage());
return false;
}
}
/**
* Tester om neste gruppe med tegn kan konverteres til en
* float. Det antas at teksten er skrevet i det
* desimaltallsystemet. En gruppe med tegn er tegnene mellom to av
* skilletegnene i teksten
*sep
eller de blanke tegnene som alltid er skilletegn.
* @return true
hvis neste gruppe med tegn lar seg
* konvertere til en byte.
* @param sep teksten med skilletegn.
* @see #inFloat(String)
* @see Float#parseFloat(String)
* @since versjon 2
*/
public boolean hasNextFloat(String sep) {
try {
return super.hasNextFloat(sep);
} catch (IOException ioe) {
feil("hasNextFloat(String): " + ioe.getMessage());
return false;
}
}
/**
* Leser neste gruppe med tegn, og returnerer denne tolket som en
* int. For kokvertering fra tekst til tall brukes
* desimaltallsystemet. Hvis teksten ikke lar seg oversette til en
* int, kastes en {@link NumberFormatException}. En gruppe med
* tegn er tegnene mellom to skilletegn.
* @return neste gruppe med tegn tolket som en int.
* @see Integer#parseInt(String)
*/
public int inInt() {
String cause = null;
for (int i = 0; i < numTry(); i++) {
try {
return super.inInt();
} catch (IOException ioe) {
feil("inInt(): " + ioe.getMessage());
return 0;
} catch (NumberFormatException nfe) {
cause = getCause(nfe);
if (FILE) {
tallfeil("Ved lesing av et heltall, linje " +
getLineNumber() + ": " +
"leste " +
cause + ".");
} else {
System.out.print("Forventer et heltall. Pr?v igjen: ");
}
}
}
tallfeil("Ved lesing av en heltall, leste " + cause + ".");
return 0;
}
/**
* Leser neste gruppe med tegn, og returnerer denne tolket som en
* int. For kokvertering fra tekst til tall brukes
* desimaltallsystemet. Hvis teksten ikke lar seg oversette til en
* int, kastes en {@link NumberFormatException}. En gruppe med
* tegn er tegnene mellom to av skilletegnene i teksten
* sep
eller de blanke tegnene som alltid er skilletegn. .
* @return neste gruppe med tegn tolket som en int.
* @param sep teksten med skilletegn
* @see Integer#parseInt(String)
*/
public int inInt(String sep) {
String cause = null;
for (int i = 0; i < numTry(); i++) {
try {
return super.inInt(sep);
} catch (IOException ioe) {
feil("inInt(String): " + ioe.getMessage());
return 0;
} catch (NumberFormatException nfe) {
cause = getCause(nfe);
if (FILE) {
tallfeil("Ved lesing av et heltall, linje " +
getLineNumber() + ": " +
"leste " +
cause + ".");
} else {
System.out.print("Forventer et heltall. Pr?v igjen: ");
}
}
}
tallfeil("Ved lesing av en heltall, leste " + cause + ".");
return 0;
}
/**
* Tester om neste gruppe med tegn kan konverteres til en
* int. Det antas at teksten er skrevet i
* desimaltallsystemet. En gruppe med tegn er tegnene mellom to skilletegn.
* @return true
hvis neste gruppe med tegn lar seg
* konvertere til en int.
* @see #inInt
* @see Integer#parseInt(String)
* @since versjon 2
*/
public boolean hasNextInt() {
try {
return super.hasNextInt();
} catch (IOException ioe) {
feil("hasNextInt(): " + ioe.getMessage());
return false;
}
}
/**
* Tester om neste gruppe med tegn kan konverteres til en
* int. Det antas at teksten er skrevet i det
* desimaltallsystemet. En gruppe med tegn er tegnene mellom to av
* skilletegnene i teksten
* sep
eller de blanke tegnene som alltid er skilletegn.
* @return true
hvis neste gruppe med tegn lar seg
* konvertere til en byte.
* @param sep teksten med skilletegn.
* @see #inInt(String)
* @see Integer#parseInt(String)
* @since versjon 2
*/
public boolean hasNextInt(String sep) {
try {
return super.hasNextInt(sep);
} catch (IOException ioe) {
feil("hasNextInt(String): " + ioe.getMessage());
return false;
}
}
/**
* Leser neste gruppe med tegn, og returnerer denne tolket som en
* long. For kokvertering fra tekst til tall brukes
* desimaltallsystemet. Hvis teksten ikke lar seg oversette til en
* long, kastes en {@link NumberFormatException}. En gruppe med
* tegn er tegnene mellom to skilletegn.
* @return neste gruppe med tegn tolket som en long.
* @see Long#parseLong(String)
* @since versjon 2
*/
public long inLong() {
String cause = null;
for (int i = 0; i < numTry(); i++) {
try {
return super.inLong();
} catch (IOException ioe) {
feil("inLong(): " + ioe.getMessage());
return 0;
} catch (NumberFormatException nfe) {
cause = getCause(nfe);
if (FILE) {
tallfeil("Ved lesing av et heltall, linje " +
getLineNumber() + ": " +
"leste " +
cause + ".");
} else {
System.out.print("Forventer et heltall. Pr?v igjen: ");
}
}
}
tallfeil("Ved lesing av en heltall, leste " + cause + ".");
return 0;
}
/**
* Leser neste gruppe med tegn, og returnerer denne tolket som en
* long. For kokvertering fra tekst til tall brukes
* desimaltallsystemet. Hvis teksten ikke lar seg oversette til en
* long, kastes en {@link NumberFormatException}. En gruppe med
* tegn er tegnene mellom to av skilletegnene i teksten
* sep
eller de blanke tegnene som alltid er skilletegn. .
* @param sep teksten med skilletegn.
* @return neste gruppe med tegn tolket som en long.
* @see Long#parseLong(String)
* @since versjon 2
*/
public long inLong(String sep) {
String cause = null;
for (int i = 0; i < numTry(); i++) {
try {
return super.inLong(sep);
} catch (IOException ioe) {
feil("inLong(int): " + ioe.getMessage());
return 0;
} catch (NumberFormatException nfe) {
cause = getCause(nfe);
if (FILE) {
tallfeil("Ved lesing av et heltall, linje " +
getLineNumber() + ": " +
"leste " +
cause + ".");
} else {
System.out.print("Forventer et heltall. Pr?v igjen: ");
}
}
}
tallfeil("Ved lesing av en heltall, leste " + cause + ".");
return 0;
}
/**
* Tester om neste gruppe med tegn kan konverteres til en
* long. Det antas at teksten er skrevet i
* desimaltallsystemet. En gruppe med tegn er tegnene mellom to skilletegn.
* @return true
hvis neste gruppe med tegn lar seg
* konvertere til en long.
* @see #inLong
* @see Long#parseLong(String)
* @since versjon 2
*/
public boolean hasNextLong() {
try {
return super.hasNextLong();
} catch (IOException ioe) {
feil("hasNextLong(): " + ioe.getMessage());
return false;
}
}
/**
* Tester om neste gruppe med tegn kan konverteres til en
* long. Det antas at teksten er skrevet i det
* desimaltallsystemet. En gruppe med tegn er tegnene mellom to av
* skilletegnene i teksten
* sep
eller de blanke tegnene som alltid er skilletegn.
* @return true
hvis neste gruppe med tegn lar seg
* konvertere til en byte.
* @param sep teksten med skilletegn.
* @see #inLong(String)
* @see Long#parseLong(String)
* @since versjon 2
*/
public boolean hasNextLong(String sep) {
try {
return super.hasNextLong(sep);
} catch (IOException ioe) {
feil("hasNextLong(String): " + ioe.getMessage());
return false;
}
}
/**
* Leser neste gruppe med tegn, og returnerer denne tolket som en
* short. For kokvertering fra tekst til tall brukes
* desimaltallsystemet. Hvis teksten ikke lar seg oversette til en
* short, kastes en {@link NumberFormatException}. En gruppe med
* tegn er tegnene mellom to skilletegn.
* @return neste gruppe med tegn tolket som en short.
* @see Short#parseShort(String)
* @since versjon 2
*/
public short inShort() {
String cause = null;
for (int i = 0; i < numTry(); i++) {
try {
return super.inShort();
} catch (IOException ioe) {
feil("inShort(): " + ioe.getMessage());
return 0;
} catch (NumberFormatException nfe) {
cause = getCause(nfe);
if (FILE) {
tallfeil("Ved lesing av et heltall, linje " +
getLineNumber() + ": " +
"leste " +
cause + ".");
} else {
System.out.print("Forventer et heltall. Pr?v igjen: ");
}
}
}
tallfeil("Ved lesing av en heltall, leste " + cause + ".");
return 0;
}
/**
* Leser neste gruppe med tegn, og returnerer denne tolket som en
* short. For kokvertering fra tekst til tall brukes
* desimaltallsystemet. Hvis teksten ikke lar seg oversette til en
* short, kastes en {@link NumberFormatException}. En gruppe med
* tegn er tegnene mellom to av skilletegnene i teksten
* sep
eller de blanke tegnene som alltid er skilletegn. .
* @return neste gruppe med tegn tolket som en short.
* @see Short#parseShort(String)
* @since versjon 2
*/
public short inShort(String sep) {
String cause = null;
for (int i = 0; i < numTry(); i++) {
try {
return super.inShort(sep);
} catch (IOException ioe) {
feil("inShort(String): " + ioe.getMessage());
return 0;
} catch (NumberFormatException nfe) {
cause = getCause(nfe);
if (FILE) {
tallfeil("Ved lesing av et heltall, linje " +
getLineNumber() + ": " +
"leste " +
cause + ".");
} else {
System.out.print("Forventer et heltall. Pr?v igjen: ");
}
}
}
tallfeil("Ved lesing av en heltall, leste " + cause + ".");
return 0;
}
/**
* Tester om neste gruppe med tegn kan konverteres til en
* short. Det antas at teksten er skrevet i
* desimaltallsystemet. En gruppe med tegn er tegnene mellom to skilletegn.
* @return true
hvis neste gruppe med tegn lar seg
* konvertere til en short.
* @see #inShort
* @see Short#parseShort(String)
* @since versjon 2
*/
public boolean hasNextShort() {
try {
return super.hasNextShort();
} catch (IOException ioe) {
feil("hasNextShort(): " + ioe.getMessage());
return false;
}
}
/**
* Tester om neste gruppe med tegn kan konverteres til en
* short. Det antas at teksten er skrevet i det
* desimaltallsystemet. En gruppe med tegn er tegnene mellom to av
* skilletegnene i teksten
* sep
eller de blanke tegnene som alltid er skilletegn.
* @return true
hvis neste gruppe med tegn lar seg
* konvertere til en byte.
* @param sep teksten med skilletegn.
* @see #inShort(String)
* @see Short#parseShort(String)
* @since versjon 2
*/
public boolean hasNextShort(String sep) {
try {
return super.hasNextShort(sep);
} catch (IOException ioe) {
feil("hasNextShort(String): " + ioe.getMessage());
return false;
}
}
/**
* Tester om det finnes tegn ? lese. Hvis det ikke finnes tegn ?
* lese vil lesemetodene blokkere og vente p? input fra brukeren.
* @return true
hvis det finnes tegn ? lese.
*/
public boolean ready() {
try {
return super.ready();
} catch (IOException ioe) {
feil("ready(): " + ioe.getMessage());
return false;
}
}
/**
* Lukker leseren
* @see BufferedReader#close
*/
public void close() {
try {
super.close();
} catch (IOException ioe) {
feil("close(): " + ioe.getMessage());
}
}
private void tallfeil(String feil) {
System.out.println("\nFeil: " + feil);
System.err.println("Programmet avsluttes.");
System.exit(1);
}
private void feil(String msg) {
System.err.println("\n\nFeil i metoden " + msg);
System.err.println("Programmet avsluttes.");
System.exit(0);
}
private int numTry() {
return FILE ? 1 : 3;
}
private String getCause(NumberFormatException nfe) {
String msg = nfe.getMessage();
String cause = null;
if (msg != null && msg.indexOf("\"") != -1) {
cause = msg.substring(msg.indexOf("\""), msg.lastIndexOf("\"") + 1);
}
return cause;
}
}