Szkolenia programowania we Wrocławiu
Kurs Java Podstawy - rozszerzony

Rozwiązanie 1.8

Zadanie nieco bardziej rozbudowane utrwalające korzystanie z zapisu i odczytu pliku za pomocą prostych Klas Scanner i PrintWriter. Podążając powoli według lekcji nie powinniście mieć problemów z ich użyciem.

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.Scanner;

public class OdczytZapis{
  public static void main(String[] args) throws FileNotFoundException{
	  Scanner input = new Scanner(System.in);
	  System.out.println("Podaj swoje imię");
	  String imie = input.nextLine();

	  PrintWriter zapis = new PrintWriter("imie.txt");
	  zapis.print(imie);
	  zapis.close();

	  Scanner odczyt = new Scanner(new File("imie.txt"));
	  System.out.println(odczyt.nextLine());
  }
}

Należy pamiętać o imporcie odpowiednich klas i zamknięciu strumienia zapisu, poza tym nie było tutaj wielu pułapek.

Komentarze

Komentarze zamknięte. Zapraszamy do grupy na Facebooku
YeeeZooo

Odczyt miał być bez dodatkowej zmiennej ;) można ostatnie dwie linie zastąpić jedną:
System.out.println(new Scanner(new File("imie.txt")).nextLine());

Slawek

Hm, wymyślając zadanie miałem raczej na myśli, aby nie robić:
String dodatkowaZmienna = odczyt.nextLine();
System.out.println(dodatkowaZmienna);

Ale Twoja interpretacja też jest ok

Patrycjusz

i tak tez jest chyba ok :-) zadnej zmiennej, nie wiem tylko czy to ma jakies znaczenie ??


import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.Scanner;

public class Oz{
public static void main(String[] args) throws FileNotFoundException{
Scanner input = new Scanner(System.in);
System.out.println("Podaj swoje imie");

PrintWriter zapis = new PrintWriter("imie.txt");
zapis.print(input.nextLine());
zapis.close();

Scanner odczyt = new Scanner(new File("imie.txt"));
System.out.println(odczyt.nextLine());
}
}

Tomek

Ma to jakieś znaczenie, w którym miejscu w kodzie będę deklarował strumienie korzystające dokładnie z tego samego pliku? Mogą oba jeden po drugim wskazywać na ten sam obiekt typu plik jeśli powiedzmy drugi zadeklarowany strumień korzysta jako pierwszy z pliku?

Kefiru

Nie bardzo rozumiem dlaczego musi byc odczyt.nextLine(), a nie sam odczyt. Bez nextLine() nie dziala, ale dlaczego? Czy z tym nie ma chodzic tylko o pobiernie jednej lini? To znaczy, ze nie moge wypisac calej zawartosci pliku jesli ma wiecej niz jedna linie?

Tymi

Wydaje mi się, że jest to oczywiste, ponieważ metoda nextLine() pobiera ciąg znaków, aż do znaku enter. Sam obiekt odczyt nie pobiera żadnego ciągu znaków.

Mateusz

Udało mi się skleić nieco inny kod:

import java.io.File;
import java.io.PrintWriter;
import java.io.FileNotFoundException;
import java.util.Scanner;

//@uthor Mateusz

public class Imie{
public static void main(String[] args) throws FileNotFoundException{
System.out.println("Enter the name file ending .txt!"); //Wysłanie informacji do użytkownika co ma wpisać
Scanner writeName = new Scanner(System.in); //Obiekt pobierający nazwę pliku
String fileName = writeName.nextLine(); //Zapisanie nazwy pliku do String'a fileName

System.out.println("Enter contents file."); //Wysłanie informacji do użytkownika co ma wpisać
Scanner writeContents = new Scanner(System.in); //Obiekt pobierający imię użytkownika
String contents = writeContents.nextLine(); //Zapisanie imienia do String'a contents

PrintWriter saveName = new PrintWriter(fileName); //Zapisanie pliku
saveName.println(contents);
saveName.close();
System.out.println("I save "+contents+" in the "+fileName+" file.");

Scanner loadName = new Scanner(new File(fileName)); //Załadowanie pliku
String name = loadName.nextLine();
System.out.println("I load the file..."+"\n"+"Contents of this file: "+name);
}
}
//Koniec programu

Co o tym myślicie?

Macias

Proponowałbym wymyślenie dodatkowych zadań do tego rozdziału, gdyż może on przysporzyć niemałych problemów początkującym użytkownikom. Jak do tej pory wszystko pięknie.

Pozdrawiam ;)

Saper

Moje rozwiązanie, minimalne różne od autora:

/* ZADANIE 1.8: Pobieranie stringa, zapisywanie go do pliku tekstowego i odczyt z pliku tekstowego*/

import java.util.Scanner;
import java.io.PrintWriter;
import java.io.File;
import java.io.FileNotFoundException;

public class Zad18{
public static void main(String[] args) throws FileNotFoundException{
/*POBIERANIE STRINGA*/
String imie;
Scanner pobieranie = new Scanner(System.in);
System.out.println("Podaj swoje imie: ");
imie = pobieranie.nextLine();

/*ZAPISYWANIE DO PLIKU*/
File plik = new File("test.txt");
PrintWriter zapis = new PrintWriter("test.txt");
zapis.print(imie);
zapis.close();
System.out.println("Twoje imie (" +imie+") zostalo zapisane do pliku: "+plik);

/*ODCZYT Z PLIKU*/
System.out.println("Oto dowod: ");
Scanner odczyt = new Scanner(plik);
System.out.println(odczyt.nextLine());
}
}

Grzegorz

Saper - fajne :) Ja jeszcze bym przy zapisywaniu pliku dodał:

File plik = new File("imiona/"+imie+".txt");
PrintWriter zapis = new PrintWriter("imiona/"+imie+".txt");

Będziemy wtedy mieli katalog z plikami o nazwach odpowiadających poszczególnym imionom :)

szczepan

Zaczynam się powoli wdrażać do Javy, ale wydaje się być zagmatwana w porównaniu z Pythonem lub C.

Kostek

A jak zrobić, żeby dopisać coś do już istniejącego pliku, powiedzmy na jego końcu.
Bo zdaję się, że linia:

PrintWriter zapis = new PrintWriter("imie.txt");

kasuje nam cała zawartośc pliku imie.txt

lolo

Możesz odczytać, całą zawartość pliku a następnie ją z powrotem wpisać i na końcu dopisać nową linią albo zastosować np. klasę FileWriter.

Adam

Czy wczytywanie nie powinno być zamykane?
W tym wypadku np.:
odczyt.close();

Sławek Ludwiczak

tak, powinno się zamknąć strumień.
Kurs czeka na gruntowną korektę.

k2marko

Mam jeden drobny problem z moim programem. Kiedy wczytuje go przy pomocy cmd, podane imię nie zapisuje się w pliku. Mimo to odczytuje się poprawnie. Natomiast w Eclipse wszystko jest ok. To mój kod:

import java.util.Scanner;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;

public class ZapisOdczytZadanie {

public static void main(String[] args) throws FileNotFoundException {
String imie;
Scanner odczyt = new Scanner(System.in);
System.out.println("Podaj swoje imię");
imie = odczyt.nextLine();


PrintWriter zapis = new PrintWriter("imię.txt");
zapis.println(imie);
zapis.close();

System.out.println("Witaj "+imie+"!"+"\nTwoje imię zostało właśnie zapisane w pliku tekstowym!");
System.out.println("Aby je zobaczyć otwórz plik o nazwie imię.txt");
System.out.println("Znajdziesz go w katalogu H:"+"\\"+"Workplace"+"\\"+"JavaStart");
System.out.println("Możesz także wyświetlić zawartość pliku poniżej. Aby to zrobić wciśnij ENTER");

String enter;
Scanner odczyt2 = new Scanner(System.in);
enter = odczyt2.nextLine();
odczyt2.close();

File name = new File("imię.txt");
Scanner odczyt3 = new Scanner(name);
String name2 = odczyt3.nextLine();
System.out.println(name2);
odczyt3.close();

}

}

Janosch

A oto mój kawałek kodu zapisujący ilość wierszy podanych przez użytkownika i odczytujących zapisane wiersze.
http://forum.javastart.pl/Thread-Zapis-i-odczyt-plik%C3%B3w?pid=982#pid982