Input/Output FileInputStream

dan1996

Aktives Mitglied
Hallo ich hab ein kleines Problem die read() Methode aus dem InputStream zu schreiben..
der OutputStream speichert in einer .txt Datei zwei Strings und zwar einmal einen "Key" und einmal einen "value"
Angenommen der Key und Value wären
Key: "56765" Value: "55"
Dann speichert er diese Werte in der Datei als "5676555"

Die read() Methode soll jetzt das nächste in der Datei enthaltene Key-Value-Pair auslesen und zurückgeben
kann mir da bitte jemand helfen...
mein Problem ist es, dass ich nicht weiß, wie man den key und den value zurückgeben soll
Code:
public KeyValuePair readkvp() throws IOException {
        
        

        //@key und @value sind Strings
        return new KeyValuePair(key, value);
            
    
    }
 

dan1996

Aktives Mitglied
ich hätte eine Lösung (nicht von mir selbst)
doch verstehe
int keyLength = fileInputStream.read();
int valueLength = fileInputStream.read();
nicht.. woher weiß er wie die Länge vom key/value ist ?

Code:
public KeyValuePair readKVP() throws IOException{
        int keyLength = fileInputStream.read();
        int valueLength = fileInputStream.read();

        byte[] keyByteArray = new byte[keyLength];
        for(int i=0; i<keyLength; i++){
            keyByteArray[i] = (byte) fileInputStream.read();
        }

        byte[] valueByteArray = new byte[valueLength];
        for(int i=0; i<valueLength; i++){
            valueByteArray[i] = (byte) fileInputStream.read();
        }

        String key = new String(keyByteArray);
        String value = new String(valueByteArray);


        return new KeyValuePair(key, value);
    }
 

httpdigest

Top Contributor
Woher willst du denn bei einem Dateiinhalt von lediglich "5676555" wissen, was davon der Key und was der Value ist? (angenommen, der Key ist nicht immer exakt 5 Zeichen lang)
Der Code nimmt an, dass an dem ersten Byte die Länge des Schlüssels (in Byte) steht und am zweiten Byte die Länge des Values.
 

dan1996

Aktives Mitglied
vielen Dank hab das Problem verstanden, man kann im OutputStream in der write() Methode die Länge von key und value bestimmen
 
X

Xyz1

Gast
Das ist ganz einfach. Du setzt zwei Zeichen fest, für die Länge des nachfolgenden Zeichen. Die nachfolgende Zahl kann dann eine Länge von 1 bis 99 haben. Die übrigen Zeichen bilden die zweite Zahl.
 
X

Xyz1

Gast
Zum Bleistift:
Java:
	public static void main(String[] args) throws IOException {
		Map<Integer, Integer> map = new HashMap<>();
		map.put(6, 5);
		map.put(4, 3);
		map.put(2, 1);

		writeMap(map, "bla.txt");

		Map<Integer, Integer> mapb = readMap("bla.txt");

		System.out.println(map.equals(mapb));
	}

	public static void writeMap(Map<Integer, Integer> map, String fn) throws IOException {
		FileWriter w = new FileWriter(fn);
		for (Entry<Integer, Integer> e : map.entrySet()) {
			w.write(String.format("%02d", e.getKey().toString().length()));
			w.write(e.getKey().toString());
			w.write(e.getValue().toString());
			w.write(System.lineSeparator());
		}
		w.close();
	}

	public static Map<Integer, Integer> readMap(String fn) throws IOException {
		Map<Integer, Integer> map = new HashMap<Integer, Integer>();
		BufferedReader r = new BufferedReader(new FileReader(fn));
		String s;
		while ((s = r.readLine()) != null) {
			int i = Integer.parseInt(s.substring(0, 2));
			int k = Integer.parseInt(s.substring(2, 2 + i));
			int v = Integer.parseInt(s.substring(2 + i));
			map.put(k, v);
		}
		r.close();
		return map;
	}


Allerdings Platzersparnis 0.
 

Neumi5694

Top Contributor
nvm, ... sorry. Hab im OP was übersehen.
Deine Speichermethode (Zahlen einer bestimmten Länge an einer bestimmten Position splitten) solltest du aber vielleicht nochmal überdenken. Verwende doch zumindest Trennzeichen. Oder speichere das Ganze gleich als Properties (mit den bereits vorhandenen Methoden) ab. Viel mehr Platz brauchn die auch nicht, bis auf die Zeilenumbrüche und '=' Zeichen.
 

Neumi5694

Top Contributor
Nenn mich altmodisch, aber wenn man Zahlen schon als Zeichenketten abspeichert, dann kann man meiner Meinung nach das Format genausogut mit freiem Auge lesbar gestalten. Dann braucht man sich 2 Jahre später nicht daran zu erinnern, wie zum Geier man das damals gemeint hat.
Außerdem macht es viel weniger Arbeit, wenn man vorhandene Mechanismen nutzt als jeden Fitzel manuell auszuwerten.
 

Ähnliche Java Themen

Neue Themen


Oben