Zapis textu do pliku. Łączenie strumieni.

0

Słuchajcie ma mproblem. Potrzebuje zapisac dane do pliku. Ale w taki sposób, żeby plik po otwarciu był czytelny(ma byc text a nie znaczki-dziwaczki). Chce odczytac plik, przejsc na koniec danych i zapisac cos noweo. Problem w tym ze nie wiem jak połączyc strumienie. RandomAccesFile ma metde seek i length()dzieki którym mógłbym przejsc do końca danych. implementuje interfejs DataInput i DataOutput, przez co niemoge zapisac danych jako text. Strumien PrintWriter zapisuje text ale nie wiem jak przejc do konca danych. Jeżeli tego nie zrobie to zapisze dane kasujac poprzednie. Chce tez móc zapisywac dane w kilku linijkach. Oto struktura pliku.

Jakies dane 1
kolejne dane 1
i jeszcze jedne dane 1
dane 2
kolejne dane 2
i jeszcze jedne dane 2

i tak dalej

I jeszcze jedno. jakiego strumienia użyc, aby móc odczytac np. linijke 3?

0

Uzyj PrintWriter i metody append. Do odczytania mozesz uzyc BufferedReader. Oczywiscie musisz odczytac rowniez 1 i 2 linijke, bo plik to zapis sekwencyjny.

pozdrawiam
johny

0

niestety próbuje z metodaappend ale to i tak nadpisuje mi wcześniejsze dane. Wyczytałem ze append dodaje znaki to konca bufora. podejrzewam ze ja ten bufor mam pusty i dlatego nadpisuje. Jak mam najpierw wczytac dane z pliku to tego bufora zeby potem móc dodac reszte danych? Mam costakiego:

PrintWriter zapis = new PrintWriter(new FileOutputStream("webapps/Pliki/newsy.txt"));
	zapis.append(rodzaj);
	zapis.println();
	zapis.append(kto);
	zapis.println();
	zapis.append(news);
	zapis.println();
	zapis.append("koniec");
	zapis.close();

I za kazdym razem kasuje mi poprzednie dane. Jak to zrobic?

0

Rzeczywiscie nie zauwazylem.

Wypadaloby zatem zrobic tak:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;

public class Test {
	public static void main(String [] args)
	{
		try
		{
			BufferedReader reader = new BufferedReader(new FileReader("plik.txt"));
			StringBuilder fileContents = new StringBuilder();
			
			int character;
			while((character=reader.read())!=-1)
				fileContents.append((char)character);
			reader.close();
			
			BufferedWriter writer = new BufferedWriter(new FileWriter("plik.txt"));
writer.append(fileContents.subSequence(0,fileContents.length()));
			writer.append("tekst dolaczony na koncu pliku");
			writer.flush();
			writer.close();
		}catch (Exception e)
		{
			System.out.println("Error opening file");
		}
		
	}
}

Powinno byc szybko bo wszystkie te obiekty sa buforowane, wiec chyba tylko z odczytywaniem po jednym znaku nie bedzie za szybko, ale to mozna jakos do tablicy wrzucic jakby bylo za wolno. Mysle, ze powinno byc dobrze, chociaz to niespecjalnie super przemyslany kod, wiec moze da sie lepiej albo latwiej.

pozdrawiam
johny

0

Rzeczywiście jestłatwiejszy sposób:) Klasa FileWritter ma taką metode, która zapisuje dane na końcu pliku. Oto kod dla reszty.

PrintWriter zapis = new PrintWriter(new FileWriter("webapps/Pliki/newsy.txt",true));
	zapis.append(rodzaj);
	zapis.println("");
	zapis.append(kto);
	zapis.println("");
        zapis.close();

Jezeli w konstruktorze FileWriter damy true dane bedą dopisywane do końca pliku

0

Cos czulem, ze to moje za bardzo wykombinowane jest :P

pozdrawiam
johny

1 użytkowników online, w tym zalogowanych: 0, gości: 1