Szkolenia programowania we Wrocławiu
Kurs Java Podstawy - rozszerzony

Zapis i odczyt z plików

Zapis i odczyt danych z plików to już bardziej zaawansowane zagadnienie. w Javie, ale na szczęście w przypadku plików tekstowych nie taki diabeł straszny o czym się zaraz przekonamy. Aby sprawnie porozumiewać się z istniejącymi na naszym dysku danymi musimy przede wszystkim poznać kilka podstawowych klas.

Podstawowa klasa, która pozwoli nam utworzyć obiekt przechowujący dane pliku to File. Tworzymy je w następujący sposób:

File plik = new File("nazwa_pliku.txt");

W ten sposób mamy do dyspozycji obiekt File o nazwie plik, który pozwoli nam na operacje na nim.

Odczyt:

Na najprostszy odczyt danych pozwala już wcześniej poznana klasa Scanner. Aby utworzyć strumień, należy użyć takiej konstrukcji:

Scanner odczyt = new Scanner(new File("nazwa_pliku.txt"));

Widzimy tutaj typową dla Javy i języków obiektowych konstrukcję polegającą na przekazaniu jednego obiektu jako argument do utworzenia innego. Klasa Scanner "obudowuje" klasę File, rozszerzając jej funkcjonalność o możliwość odczytu pliku. Później przekonamy się, że takich zagnieżdżeń może być dużo więcej.

Gdy mamy utworzony obiekt Scanner z przekazanym jej odpowiednim obiektem File możemy już używać odpowiednich metod, czyli podobnie jak miało to miejsce w konsoli poprawna będzie taka instrukcja:

String text = odczyt.nextLine();

Wczytamy w ten sposób do zmiennej text linię tekstu z pliku tekstowego. Sprawdźmy to na przykładzie. Utwórz plik, w którym zapiszesz jedną dowolną linię tekstu, przykładowo "Ala ma kota, bo nie wzięła leków". Zapisz go jako ala.txt. Kod programu do odczytania tego zdania wyglądałby następująco:

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

public class Odczyt{
  public static void main(String[] args) throws FileNotFoundException{
	  File file = new File("ala.txt");
	  Scanner in = new Scanner(file);

	  String zdanie = in.nextLine();
	  System.out.println(zdanie);
  }
}

Pamiętaj, aby plik był w tym samym folderze, co plik .class, w innym wypadku podaj ścieżkę do pliku w miejsce jego nazwy.

Widać tutaj jedną dziwną rzecz, mianowicie dopisek FileNotFoundException - jest to wyjątek, który musimy zgłosić, zostawmy to na razie jako magiczny zapis, bez którego wszystko nie zadziała. Po skompilowaniu i uruchomieniu powyższego przykładu powinno nam się wyświetlić nasze zdanie.

Zapis:

Kolejnym ważnym zagadnieniem jest zapis do pliku. Możemy tutaj użyć klasy PrintWriter, i utworzyć jej obiekt , ale uwaga jako parametr konstruktora podajemy tutaj tylko nazwę pliku, a nie obiekt File.

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

Zapiszemy do pliku ala.txt zdanie "Ala ma kota, a kot ma Alę" przy pomocy metody print().

import java.io.FileNotFoundException;
import java.io.PrintWriter;

public class Zapis{
  public static void main(String[] args) throws FileNotFoundException{
	  PrintWriter zapis = new PrintWriter("ala.txt");
	  zapis.println("Ala ma kota, a kot ma Alę");
	  zapis.close();
  }
}

Bardzo ważne jest, aby zamykać wszelkie strumienie wyjścia, robimy to przy pomocy metody close(), gdy już nie będziemy nic zapisywać przy pomocy danego obiektu. Po otworzeniu pliku ala.txt faktycznie widzimy, że zdanie zostało do niego zapisane. Zapis plików binarnych i inne strumienie danych zostawimy na zdecydowanie dalsze lekcje.

Zadania do samodzielnego wykonania:

1.8 Napisz program, w którym wprowadzisz w konsoli swoje imię, następnie zapiszesz je do pliku. Odczytaj je z powrotem z pliku i bez użycia dodatkowej zmiennej wyświetl na ekranie.

Rozwiązanie.

<- Poprzednia LekcjaNastępna Lekcja ->

Komentarze

Cholek

Jak odczytac z pliku *.txt caly tekst z pliku, a nie tylko jedna linie??

Pozdrawiam

Witek

Witam
Problem już rozwiązany, został spowodowany nie prawidłowym umieszczeniem pliku tekstowego. W przypadku osób korzystających z Eclips’a plik tekstowy powinien znajdować się w katalogu projektu np.: D:\CwEclipse\workspace\Lekcja_2 , a nie w katalogu z plikami z rozszerzeniem .class

per-anders

dzieki

Krystian

To nieco mylace, wiec sprostuje:
Plik tekstowy, jesli nie podasz w nazwie calej sciezki jest tworzony w katalogu, w ktorym masz swoj projekt
javowy.

Czyli:
-Jeśli nic nie zmieniałeś to projekty powinienes miec w workspace w katalogu uzytkownika (dotyczy windows i linux) i wtedy w katalogu Twojego projektu.
-Jeśli Twoj projekt jest zapisany w innym miejscu (mogles zmienic miejsce docelowe pracy na poczatku wlaczanie eclipse-a albo dla projektu podac sciezke gdzie ma sie tworzyc) to plik ktory Tworzysz jest w katalogu w ktorym masz projekt.
-Jeśli jako nazwę pliku podasz pełną ścieżkę np "C:/mojKatalog1/mojKatalog2/plik.txt" To plik znajduje sie w tym miejscu.

Kolega Witek akuratnio miał zapisany projekt tutaj: "D:\CwEclipse\workspace\Lekcja_2", ale rownie dobrze moze byc w kazdym innym miejscu zaleznie od ustawienia.

Pozdrawiam Krystian ;)

Filu

Ja nadal nie wiem o co chodzi. Próbuję to zrobić w Eclipse, ale nie rozumiem o które ścieżki chodzi. Włożyłem plik tam gdzie są .class, tam gdzie są .java i nic.

Sławek Ludwiczak

Plik nie ma być ani tam gdzie .class, ani tam, gdzie .java - ma być w głównym folderze projektu :)

Kuba

Dzięki

Damian

"Pamiętaj, aby plik był w tym samym folderze, co plik .class, w innym wypadku podaj ścieżkę do pliku w miejsce jego nazwy."
Myślę, że to może być mylące :).

anonim

Ja np. mam zapisane w C:\Documents and Settings

Witek

Jeszcze jedno, jak uruchomię ten program bezpośrednio z konsoli to wszystko jest ok.,a jak z Eclipse to nie, może ktoś mi wytłumaczyć dlaczego tak się dzieje. Z góry dziękuje za odp.

Witek

Witam
Mam drobny problem, korzystam z Eclipsa. Problem polega na tym, że nie może znaleźć pliku o nazwie ala.txt tak jak to jest w przykładzie, zrobiłem dokładnie tak jak było napisane, plik znajduje się we folderze bin(D:\CwEclipse\workspace\Lekcja_2\bin\ala.txt) razem z innymi plikami .class, a pomimo to dostaje komunikat, że nie może znaleźć pliku.
Co mogłem pominąć ??

dwinar

Napisz pętle czytającą linia po linii.

ht128koo

mógł byś podać jakiś mały przykład bo coś źle robie i nie mogę znaleźć problemu z góry dzieki za pomoc

Witek

Witam
Jeżeli chodzi o odczyt linijka po linijce to kilka postów niżej Sławek podał przykład kodu jak odczytać jak to zrobić.

ht128koo

dzieki bląd był w void main

lukasz

no niestety pod netbeansem nie działa:
No line found
a linia jest, nawet zakoczona enterem

Jędrzej

Działa, działa...
Ma być w katalogu z główną klasą...

Witek

Pewnie masz ten sam problem co ja miałem z Eclipse'm, a działa Ci pod konsolą, jak tak to
spróbuj go rozwiązać podobnie jak ja zrobiłem to w Eclipsie.

Michał

Witam, nie mogę skompilować przykładu (Odczyt) z tej lekcji:
C:\JAVA>javac Odczyt.java
Odczyt.java:8: unreported exception java.io.FileNotFoundException; must be caugh
t or declared to be thrown
Scanner in = new Scanner(file);
^
1 error

Michał

Już rozwiązane.

Paweł

Siemka, ja mam taki problem, przy próbie odpalenia tego pierwszego przykładowego na tej stronce programu w konsoli pojawia mi się to:
Exception in thread "main" java.io.FileNotFoundException: ala.txt (Nie można odnaleźć określonego pliku)

chociaż plik (ala.txt) jest w tym samym folderze co plik .class

Greg

mam to samo, any idea?

castro12321

Plik musi być w folderze wcześniej.

Greg

witam, dokladnie to samo, jakies pomysly?

Slawek

używasz eclipse, czy odpalasz programy z konsoli?

Greg

z konsoli, zgodnie z początkowymi zaleceniami.

Greg

solved - nazwa mojego pliku była ala.txt zamiast ala (z rozszerzeniem .txt). teraz hula i buczy

przemi

odpalanie z cmd jest nieefektywne szkoda czasu polecam zamiast Eclipsa programik netbeans

Arkadiusz

A ja JCreator Pro

Grzesiek

hmm. widze komentarze tylko od #13..
ale widze, że komuś też nie mogło znaleźć pliku ala.txt :)
używam eclipse, stworzyłem plik tam gdzie są pliki .class i wciąż go nie widzi....
w projekcie \bin
w jakimś innym miejscu go zapisać czy to jest odpowiednie miejsce?

Pozdrawiam.

Grzesiek

ehhh... post wyżej do usunięcia, głupi jestem, jednak widze poprzednie komentarze poniżej #13 dotyczącego tego samego problemu.

Slawek

muszę poprawić tą nawigację, bo faktycznie jest kiepsko zauważalna ;)

Arkadiusz

Takie małe eksperymenty

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


public class tablica {

/**
* @param args
*/
public static void main(String[] args) throws FileNotFoundException {
// TODO Auto-generated method stub

File plik = new File ("odczyt.txt"); //nowy obiekt

PrintWriter zapis = new PrintWriter("odczyt.txt"); //metoda zapisu
//TABLICE
int suma=0;
int tab[] = new int[4];
Scanner odczyt = new Scanner(System.in);
System.out.format("Tablica składa się z %d elementów\n", tab.length);
for (int i=0; i<tab.length; i++){
System.out.println("Prosze podać liczbe");
int w = odczyt.nextInt();
tab[i]=w;
}
int i;
for (i=0; i<tab.length; i++){
System.out.print(" "+tab[i]);
}

for(int a=0; a<tab.length; a++){
suma=tab[a]+suma;

}
System.out.println("\nSuma "+suma);
zapis.println(suma);
zapis.close();

//odczyt
Scanner in = new Scanner(plik);
String odczyt_2 = in.nextLine();
System.out.println("Odczytany plik " +odczyt_2);
}

}

Szymon

Przy takim kodzie kompilator wypluwa błąd
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
import java.io.PrintWriter;

public class Zad_18{
public static void main(String[] args) {
Scanner wpisane = new Scanner(System.in);
System.out.println("Podaj swoje imie");
String imie = wpisane.nextLine();

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

File plik = new File("imie.txt");
Scanner odczyt = new Scanner(plik);
String srodek = odczyt.nextLine();
System.out.println("Twoje imie ("+srodek+") zostało zapisane do pliku imie.txt");
}
}

Witek

Witam
Wypluwa błąd bo nie obsłużyłeś wyjątku (FileNotFoundException ma być za main()) oraz masz błędy w ostatniej linijce kodu dotyczące wyświetlania – (("Twoje imie " + srodek + "zostało zapisane do pliku imie.txt"); . Poniżej masz poprawiony kod u mnie działa.


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

public class Zad_18{
public static void main(String[] args)throws FileNotFoundException {

Scanner wpisane = new Scanner(System.in);

System.out.println("Podaj swoje imie");

String imie = wpisane.nextLine();

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

File plik = new File("imie.txt");
Scanner odczyt = new Scanner(plik);
String srodek = odczyt.nextLine();
System.out.println("Twoje imie " + srodek + "zostało zapisane do pliku imie.txt");
}
}
Szymon

Nawet nie wiesz jak mi pomogłeś :D Dziękuję.

Witek

Nie ma za co zrobiłem to z wielką przyjemnością.
Pozdrawiam

Paweł

Co do czepialstwa:
public static void main(String[] args) throws FileNotFoundException{
^
Ta spacja powinna być czy nie? w komentarzach w porgramach jej nie ma, a z nią kompilator pluje błędem

Paweł

Przepraszam, napisałem throw, a nie throws. moje niedopatrzenie :P
Ale w komentarzu napisałem throws, to jest dziwne

Krzysiek

Może głupie i prymitywne pytanie, ale jak wpisać ścieszkę do pliku bo próbowałem wstawić ją w różne miejsca (w cudysłowiu, przed cudzysówem itp) i mi tego nie kompiluje za chiny np.

File a = new File("c:\documents and settings\misiek\desktop\Ala.txt");

bez znaczenia czy nazwy folderów wpiszę z małej czy dużej litery. I tak przy okazji by nie mnożyć postów, jak zapisać pętle czytającą linia po linii o której wspomniano w poscie #2.

Slawek

Ukośniki w drugą stronę. Przykład odczytu linia po linii poniżej:


public static void main(String[] args) throws IOException {
File file = new File("C:/Users/Sławek/Desktop/test.txt");
Scanner sc = new Scanner(file);
while (sc.hasNextLine())
System.out.println(sc.nextLine());
}
ht

hi mam taka prosbe mogl bys podac jakis maly przyklad który bd zapisywal zadania w paru linijkach bo nie moge tego rozgrysc

Grzegorz

Chyba brakuje nawiasów kalmrowych po while()

Vonsuu

Ukośniki w drugą stronę lub podwójnie: c:\\documents and settings\\misiek\\desktop\\Ala.txt

Lukasz

wielkie dzieki za te komentarze, kurs jest genialny, komentarze tez duzo ucza
Pozdrawiam

Jędrzej

Ma ktoś jakiś patent na czytanie z neta?
Any idea?
Don't worry, be Alt+1.

KOch

Hej,
postanowiłem zgłębić javę (programowałem wcześniej w c). Dzięki za kurs - super!

A teraz problem:
poniższy kod powoduje błąd:
linia 16: error: unreported FileNotFoundException; must be caught or declared to be thrown
Lerning.lern (void);


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

public class Program{
public static void main(String[] args){

System.out.println("MENU GLOWNE");
System.out.println("aby zaladowac zestaw slowek wybierz 1");
System.out.println("aby wprowadzic nowe slowka wybierz 2");
Scanner menu = new Scanner(System.in);
int option = menu.nextInt();

switch (option){
case 1:
System.out.println("ta opcja pozwoli przegladac slowka");
Lerning.lern ();
break;

case 2:
System.out.println("ta opcja pozwoli dodac slowka");
break;

default:
System.out.println("nowy wybor");
}
}
}


Na wszelki wypadek także kod Lerning:

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

public class Lerning{
public static void lern () throws FileNotFoundException {


File plik = FileAgent.open ();

Scanner in = new Scanner(plik);
String line;
do{
line = in.nextLine(); //pobieranie kolejnych linii
System.out.println(line);
}while(line!= null );

//while (in.hasNextLine())
// System.out.println(in.nextLine());
}
}


z góry dzięki za wszelką okazaną pomoc
KOch
(student konkurencyjnej P)

HH

Witam
Mam plik w którym umieściłem np. 3 wiersze o różnej długości, oczywiście wyświetla poprawnie jednakże chciałbym zliczyć te wszystkie znaki i dalej bawić się w tablicy np. w jakieś szyfrowanie lub inne pierdoły:) Jest ładnie pięknie jednakże nie zlicza mi pierwszego wiersza i nie wiem jaka jest tego przyczyna :( Będę wdzięczny za ideę bądź pomysły, niekoniecznie pomoc w postaci kodu :)

package odczyt;
import java.io.*;
public class Odczyt
{
public static void main(String[] args) throws IOException
{
BufferedReader odczyt= new BufferedReader (new FileReader ("tekst.txt"));
System.out.println(odczyt.readLine());
}
int znak = odczyt.read();
int i=0;
while(znak != -1)
{
System.out.print((char)znak);
znak = odczyt.read();
i++;
}
System.out.println(i);
odczyt.close();
}
}


Pozdrawiam
HH
newbie in Java

Jędrzej

Czy jest możliwość przeskanowania(?) nazwy katalogów wyżej? Jeżeli tak to jak??? (source code etc.)

Rafał

Witam

ja nadal mam problem z plikiem tzn plik widzi ale pisze:
Exception in thread "main" java.util.NoSuchElementException: No line found
at java.util.Scanner.nextLine(Scanner.java:1516)
at lekcja1.Odczyt.main(Odczyt.java:16)
Java Result: 1

nawet jak zmieniałem źródło pliku to nic nie pomogło ;/
Nie widzi mi linii.

Barteek

Dodaj linijke na początku:

import. java.util.NoSuchElementException;

NRC

Troche dawno zadano to pytanie ale moze ktos bedzie szukal odpowiedzi bo sam z tym problem mialem.

w pierwszym przykladzie "odczyt"
wywala komunikat: Exception in thread „main” java.util.NoSuchElementException: No line found

no i racja bo jest to program do odczytu, jak nie masz nic w pliku to nie ma co odczytac.
wiec w ala.txt napisz jakies zdanie w jednej lini.

kuba

Mam dokładnie ten sam problem.

gandy

Sławek
Taka mała prośba - jeśli znajdziesz chwilę zamieść programu programu, który otwiera istniejący plik tekstowy i nie kasując tego co w nim jest napisane dokłada na końcu jakiś dowolny string.

Borek

Jak zrobić, aby w fucking if(String == String2) i jeżeli te stringi były by takie same, to wyświelałoby instrukcje dla true ?!
Za każdym razem kiedy wpisze w konsoli ( dla if ) String, który jest równi stringowi w warunki wyskakuje mi instrukcja false ( else ) czyli nie te same strinig... Chodzi o to, czy - w instrukcji if warunkiem mogą być Stringi, które sprawdzane są pod względem poprawności danych liter ? Czy trzeba jakąś petle for dawać, aby sprawdzić poprawność dwóch stringów :D ?

Slawek

Oj widać, że z mojego kursiku się nie uczyłeś ;)
http://javastart.pl/podstawy-jezyka/operatory-matematycze-i-logiczne/
Użyj equals zamiast ==. W przypadku Stringów == porównuje referencje, nie wartości.

eloelo

Pierwszy program wywala mi taki błąd:
Exception in thread "main" java.util.NoSuchElementException: No line found
at java.util.Scanner.nextLine(Unknown Source)

bonus

Cześć, nie mogę znaleźć odpowiedzi jak zapisać kilka linujek tekstu do pliku. Mój program pobiera wartość od użytkownika, dodaje do poprzedniej i zapisuje w pliku. Chciałbym aby po dodaniu wartości zapisywał ją jako nową wartość z przypisaną datą, na razie jednak program poprostu podmienia starą wartość na nową. Z góry dziękuję za pomoc ; )

Lexus

Kngelwdoe wants to be free, just like these articles!

poczciwiec

jak zapisać plik tak tylko żeby zmieniło mi 1 literkę, przy odczytywaniu używałem .substring ale w zapisywaniu to nie działa, przydało by mi się to bo gdy chce zrobić grę w której zapisuję się postępy musiał bym każdy postęp zapisywać w nowym pliku a tak cały zapis mógł być w 1 pliku np "tnntttntnt" t oznacza tak czyli zdobyłem dany element w grze a n że nie, w grze jak w grze dużo jest elementów do zapisywania i nie chce tworzyć tylu plików

Marcin Kunert

Możesz czytać całą zawartość Twojego pliku, zamienić zawartość i zapisać.

//czytanie
File file = new File("twoj_plik.txt");
Scanner in = new Scanner(file);
String zdanie = in.nextLine();

//zamiana - tutaj w Twoim wypadku wygodniej będzie działać na tablicy znaków
char[] temp = str.toCharArray();
temp[2] = 't';
String wynik = String.copyValueOf(temp);

//zapis
Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file)));
out.write(wynik);
out.flush();
out.close();

poczciwiec

dzięki :)
w tej linijce gdzie jest "temp[2] = t" to tam gdzie jest 2 to podaje która literę chcę zmienić ?

Marcin Kunert

Dokładnie. W tym wypadku na trzecim miejscu (liczymy od 0) zamiast poprzedniej litery będzie "t".

Krzych

Jak można w javie wyświetlić listę plików w katalogu ?

Adam

Jak mogę odczytać n-tą linię z pliku, przykładowo plik to
aaa
vvv
bbb

i chcę żeby do zmiennej poleciało vvv a nie aaa.

Muszę napisać program znajdujący największą komplementarność dwóch sekwencji, nie chce nic splitować na tablice char, tylko operować na stringach, substring i porównywanie każdego znaku z każdym w każdej sekwencji z każdą do tego punktacja. Na pewno istnieje na to łatwy sposób ale go nie znam i nie znalazłem w sieci... Do tej pory pisałem w C++, teraz mi każą w javie i same problemy...

Grzegorz

Mam następujący problem. Chcę napisać program, w którym pobiorę 3 imiona, i zapisze je wszystkie 3 do jednego pliku. Jak to zrobić? tzn jak zrobić by to wszystko zapisało się w jednym pliku. Bo jak na razie, to zapisuje mi każde z imion ale np plik z pierwszym imieniem zostaje zastąpiony plikiem txt z drugim imieniem. Ma ktoś pomysł jak to zrobić?

Kamil

Witam,
Jaka powinna być ścieżka i gdzie powinien znajdować się plik aby po eksporcie do JAR działało poprawnie?

File plik=new File("tekst.txt");

Czy trzeba użyć czegoś podobnego jak przy obrazkach: getClass().getResource(...) ??

Kamil

File plik=new File("./tekst.txt");
plik obok JAR

Erneriusz

A ja mam takie pytanie. Załóżmy, że mam plik a.txt i chce do niego coś zapisać. Kod podany w kursie
PrintWriter zapis = new PrintWriter("nazwa_pliku.txt");
zamiast używać istniejącego pliku, tworzy nowy. Jest jakiś sposób, żeby używał do zapisania już istniejącego pliku?

Marcin

Witam, mam problem z tworzeniem pliku w wybranym przeze mnie katalogu w Androidzie. Próbowałem wiele metod, ale za każdym, mimo kompilacji plik się nie tworzy... Ma ktoś jakiś pomysł?

maciuha

"Kolejnym ważnym zagadnieniem jest zapis do pliku. Możemy tutaj użyć klasy PrintWriter, i utworzyć jej obiekt , ale uwaga jako parametr konstruktora podajemy tutaj tylko nazwę pliku, a nie obiekt File."

nie prawda :) można również podać obiekt typu file.
pozdr.

szefu

metody do zapisania pliku
public void zapiszPlik(String nazwa) throws FileNotFoundException
{
PrintWriter zapis = new PrintWriter(nazwa);

Scanner skaner = new Scanner(System.in);
System.out.println("Wpisz co chcesz zapisać do pliku (q kończy)");
String znak = "";

while (!znak.equals("q"))
{
znak = skaner.next();
zapis.println(znak);
}
zapis.close();
}

szefu

można dodać
if (znak.equals("q"))
break;
else
zapis.println(znak);

Kuba

Bardzo, bardzo fajny tutorial o podstawach Javy, jednakże wiele Twoich programów jest niedopracowanych. Czyżbyś ich nie testował? Przykładowo Twój powyższy program do odczytu z pliku po dokładnym przekopiowaniu, nie działa.

Sławek Ludwiczak

ależ oczywiście, że działa.

Dev0

Oczywiście, że nie działa.

File plik = new File(ala.txt);

Tworzy Ci nowy plik, jeśli zrobisz ręcznie plik i nawet wprowadzisz dane, to po uruchomieniu nadpisze go on pustym plikiem. Czyli:
Exception in thread "main" java.util.NoSuchElementException: No line found

capoeiramen

witam, zastanawiam sie, jakby wygladal program do przegladania plikow

Marcin Kunert

Wystarczy wybrać odpowiedni folder i przejrzeć jego zawartość.
http://docs.oracle.com/javase/6/docs/api/java/io/File.html#list()

capoeiramen

kurde od paru dni sie mecze, zeby zrobic taki program, chce zrobic explorer plikow, robie liste plikow, potem ja wyswietlam(metoda for), oraz metoda, do powrocenia do poprzedniego katalogu. Przykładowy wynik mialby wygladac np tak:
"
1-Wstecz

2-Katalog1
3-Katalog2
4-Katalog3
5-Katalog4
6-Katalog5
7-Plik1
8-Plik2
9-Plik3
10-Plik4
"

capoeiramen

dobra, znalazlem:P
chodziło mi w sumie tylko o te 3 linijki, dalej sobie juz poradze;)

String dirname = "c:/";
File pliki = new File(dirname);
String[] listaPlikow = pliki.list();

metoda for wyswietle, co chcialem:P

Quetzalcoatl

Witam
stawiam pierwsze kroki w Javie i proszę o pomoc gdzie tkwi błąd w programie:

import java.io.FileNotFoundException;
import java.io.PrintWriter;

public class Zapis{
public static void main(String[] args) throws FileNotFoundException{
PrintWriter zapis = new PrintWriter("plikdozapisu.txt");
zapis.println("Tekst do wpisania do pliku");
zapis.close();
}
}

gunner

Zmień cudzysłowy na "tekst"

Bartek

On ma normalne cudzysłowy! To edytor komentarzy zmienia...

Dev0

import java.io.File;

snt.banzai

W poniższy sposób działa:

import java.io.IOException;
import java.io.PrintWriter;

public class Zapis{
public static void main(String[] args) throws IOException{
PrintWriter zapis = new PrintWriter("plikdozapisu.txt");
String tekst = ("Tekst do wpisania do pliku");
zapis.println(tekst);
zapis.close();
}
}

Quetzalcoatl

Przyznam, że nie bardzo rozumiem. Bardzo proszę o przykład jak ma to wyglądać.

Leinad

Brak polskich znaków. Jak temu zaradzić?

Bartek

Musisz wpisywac znaki polskie jako Unicode.
Dam ci mój sprawdzony sposób ;)
Poszukaj sobie w 'Wszystkie programy -> Akcesoria -> Narzędzia systemowe' programu który się nazwywa Tablica znaków. Jak tam wybierzesz jakiś znak, to na dole pisze jego numer (po lewej stronie na dole). Np. jak wybierzesz A, to wyświetli sie U+0041
Teraz, jezeli chcesz zapsiać jakiś znak w javie w kodzie Unicode, wpisujesz /uXXXX, zamiast XXXX podasz mumer z Tablicy znaków po +. Np. dla A: /u0041
Jak bys chciał znak spacji, to należy wpsać /u0000 (Unicode) lub /000 (szesnastkowy).
Pozdrawiam :)

Leinad

O to właśnie mi chodziło. Dzięki bardzo za pomoc :)

Bartek

Prosty sposób prześwietlania katalogów:

for(int i = 0; i != new File("KATALOG").list().length; i++)
{
System.out.println(new File("KATALOG").list()[i]);
}

Tomek

Witam
Kurs jest super.
Mam pytanie jak dopisywać do pliku. Podana wyżej metoda nadpisuje dane w pliku.
Pozdrawiam

lolo

Użyj klasy FileWriter.
Utworzenie obiektu
FileWriter plik = new FileWriter("testowy.txt",true);
Zapis:
plik.write("Test do dopisania");
Zamknięcie strumienia
plik.close();

Tomek

Jeszcze jedno pytanie.
plik.write(„Test do dopisania”); //dopisuje na końcu pliku, w jednym ciągu

Próbowałem wariacji
Sring jakisTekst="Tekst do dopisania";
plik.write(jakisTekst+"\n"); //dopisuje dodatkowy 'krzaczek' w pliku

Jak powinien wyglądać zapis aby dopisywał za każdym razem w nowej linii?

Z góry dziękuje
Pozdrawiam

lolo

U mnie po wpisaniu "\n" przechodzi do nowej linii. Spróbuj napisać "\r\n".

Tomek

Niestety "\r\n", "\n\r", "\n" nie działa.
Może jakaś inna konstrukcja - składnia?

lolo

Piszesz w notatniku czy używasz jakiegoś IDE?
Spróbuj otworzyć ten plik nie w notatniku(bo zakładam, ze tam otwierasz) a np. w wordzie(jesli posiadasz) albo wordpadzie albo write(jesli masz).

Tomek

Dzięki.
Rzeczywiście otworzenie w innym programie niż notatnik pomogło :)
Rozjechała się czcionka ale to już szczegół.
Pozdrawiam

Pawel

Dzięki Wielkie za poradnik wszystko dobrze zrobiłem tylko zamiast String dałem Double :P niech to!

Anka

Witam!
Może to banalne pytanie, ale nie wyświetlają mi się polskie znaki... (np w zadaniu Odczyt)

"Ala ma kota, bo nie wziŕ-a lekˇw"

Jak temu zaradzić?
Dodam, że w innych ćwiczeniach jest podobnie

lolo

Czego używasz notatnika, jakiegoś IDE? Spróbuj zmienić kodowanie na ASCII.

Anka

Używam zwykłego notatnika.
Przepisałam cały kod ręcznie, bez tzw. kopiuj / wklej i dalej to samo.

lolo

A jakie masz kodowanie ustawione?

Anka

Nie wiem.
W ustawieniach czcionki mam zaznaczony skrypt jako zachodnioeuropejski.
Jak zmieniam na inny np. środkowoeuropejski lub cyrylica, dalej jest to samo.

Marcin

jeżeli używasz konsoli do wyświetlenia to spróbuj wpisać na początku: chcp 1250
Powinno wyskoczyć: "Aktywna strona kodowa: 1250"
działa do zamknięcia cmd.

Anka

Dziękuję. Działa :)

k2marko

Też mnie trapi brak polskich znaków. Generalnie pisząc w Eclipse i odczytując kod w eclipsowej konsoli polskie znaki są. Natomiast odczytując z pliku .txt zaczynają się "krzaki" :(

Pewny

Oto sposób na zapis prosto do pliku i odczyt prosto z pliku:

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

public class OdczytZapis{
public static void main(String[] args) throws FileNotFoundException{

System.out.println("Podaj imie");
Scanner input = new Scanner(System.in);

PrintWriter zapis = new PrintWriter("plik.txt");
zapis.println(input.nextLine());
zapis.close();

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

Krzysiek P

Cześć,
wpadłem na pomysł napisania programu, który będzie liczył mój czas pracy spędzony na programowaniu.
Ma pobrać ode mnie liczbę, zapisać ją, później odczytać pobrać dodatkową, dodać wyświetlić wynik i ponownie zapisać.

Pierwszy problem polega na tym, że nie udaje mi się zapisać tego jako liczby, rozumiem, że jak zostawię to jako " String a = input.nextLine();" to później nie będę mógł wykonać na tym dodawania?

Drugi jak wykorzystać później odczytane dane i dodać nowe?
Pozdrawiam Krzysiek


public class Czaspracy{
public static void main(String[] args) throws FileNotFoundException{
Scanner input = new Scanner(System.in);
System.out.println("Podaj czas pracy: ");//uzyskanie danych od użytkownika
String a = input.nextLine();

PrintWriter zapis = new PrintWriter("czas.txt");// zapisanie danych
zapis.print(a);
zapis.close();

Scanner odczyt = new Scanner(new File("czas.txt"));// odczytanie danych
System.out.println(odczyt.nextLine());
}
}

apilat

Użyj

Integer a = Integer.parseInt(input.nextLine());

lub

Integer a = input.nextInt();

Huehuehue

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

public class Nowa{
public static void main(String[] args) throws FileNotFoundException{

String imie;
Scanner scanner = new Scanner(System.in);
System.out.println("Podaj swoje imie: ");
imie = scanner.nextLine();
PrintWriter zapis = new PrintWriter("imie.txt");
zapis.println("Twoje imie to: " + imie);
zapis.close();

File file = new File("imie.txt");
Scanner in = new Scanner(file);
String zdanie = in.nextLine();
System.out.println(zdanie);

}
}

Paweł

Da radę zaimportować kilka linijek do stringa tak aby użyć tego potem w comboboxie czy trzeba do każdej linijki oddzielnego stringa? A może w ogóle nie trzeba tego wrzucać do stringa? Dodatkowym problemem jest to, że robię to w innej niż główna klasie, w której ten odczyt/utworzony string ma być tylko wynikiem jej działania.

Aleksanderwiel

Odnośnie odczytu i zapisu to mam z tym problem :/. Mógłby mi ktoś powiedzieć w zrozumiały sposób, jak używać programu napisanego w Java? Mam na myśli to, jak go uruchomić poza środowiskiem? Podam tutaj przykład dla uzupełnienia mojego komentarza. Chcę zrobić tak, aby np. kolega, któremu wyślę ten plik, mógł go otworzyć dwukrotnie klikając na niego. Trochę już szukałem na ten temat i opinii było wiele, lecz nie mogę znaleźć tej, której szukam. Wiem też, jak się zapisuje w JAR, lecz nie rozumiem, po co mi jest to potrzebne, skoro chcę zrobić aplikację typu .exe, a nie JAR? Proszę o pomoc. :(

Sławek Ludwiczak

W ogólności każda aplikacja Javy pakowana jest do pliku JAR. Jest to spowodowane tym, że Java nie jest językiem kompilowanym do aplikacji natywnej (exe) tylko właściwie archiwum zip o innym rozszerzeniu. Da się aplikację spakować również jako exe (choćby w eclipse wybierając odpowiednią opcję eksportu) jednak de facto jest to tylko opakowanie dla pliku jar.

aleksanderwiel

Rozumiem, ale jak w takim razie uruchomić taką aplikację? Jest tu gdzieś opisane, jak tworzyć pliki JAR, a konkretniej - jak je budować, bo wiadome jest mi, że w nich znajduje się taki plik, jak MANIFEST.MF i jeszcze nie za bardzo wiem, jak go konfigurować? :/

Piotr

Czy mógłby ktoś powiedzieć mi jak zrobić to by czytać cały plik.
Ciągle wyskakują mi błędy. Nie wiem jak do tego dojść.

Janosch

Możesz użyć pętli while, np:

Scanner odczyt = new Scanner(new File("Test.txt"));
while (odczyt.hasNextLine()) //Pętla wyświetlająca linijki pliku txt dopóki nie dojdzie do końca
{
System.out.println(odczyt.nextLine());
}
odczyt.close();

Janosch

Scanner odczyt = new Scanner(new File("Test.txt"));
while (odczyt.hasNextLine()
{ System.out.println(odczyt.nextLine()); }
odczyt.close();

Janosch

Na samym dole pod tym linkiem masz przykład, który wrzuciłem na forum.
http://forum.javastart.pl/Thread-Zapis-i-odczyt-plik%C3%B3w
Część z pętlą while to jest to co Cię interesuje.

aleksanderwiel

Sławek, mógłbyś mi odpowiedzieć na mojego poprzedniego posta dotyczącego konfiguracji plików MANIFEST.MF i tworzenia opakowań (.exe) dla plików JAR?