22. JAVA – operacje na plikach i katalogach


Praca z plikami opiera się na strumieniach wejści/wyjścia.
Z pomocą klas InputStream i OutputStream możemy odczytywać plik bajt po bajcie.
Operacje na plikach mogą zwrócić IOException, musimy przechwycić błąd, a zamknięcie pliku okodować finally.
Metody:
– read – odczyt 1 bajtu, zwraca int, koniec pliku to wartość -1
– write – zapisuje do pliku po 1 bajcie

 

Przykład:

import java.io.*;

public class FilesExample{
public static void main(String[] args) throws IOException {
//ZAPIS DO PLIKU BAJTOWO
char[] chars = {'T', 'e', 'k', 's', 't'};
FileOutputStream out = null;
//zabezpieczamy się przed błedem
try {
//uchwyt do pliku
out = new FileOutputStream("src/all/part_10_Files/test.txt");//jeżeli plik nie istnieje to zostanie utworzony
for (char c : chars) {
out.write(c); //zapisujemy do pliku
}
} catch (IOException e) { //możemy też zapisać Exception
e.printStackTrace();
} finally {
if (out != null) out.close();//zamykamy plik
}


//po skompilowaniu kodu w terminalu pojawił się nasz plik.
//każde uruchomienie programu spowoduje nadpisanie zawartości pliku

//ZAPIS DO PLIKU ZNAKÓW UNICODE, CZYLI NP POLSKICH LITER, bajt po bajcie
String tekst = "ąęćńźżłó";
char[] charsfw = tekst.toCharArray();
FileWriter fw = null;
//zabezpieczamy się przed błedem
try {
//uchwyt do pliku
fw = new FileWriter("src/all/part_10_Files/fw.txt");//jeżeli plik nie istnieje to zostanie utworzony
for (char c : charsfw) {
fw.write(c); //zapisujemy do pliku
}
} catch (IOException e) { //możemy też zapisać Exception
e.printStackTrace();
} finally {
if (fw != null) fw.close();//zamykamy plik
}

//ZAPIS DO PLIKU WIELU ZNAKÓW NA RAZ, bez zapisu Unicode czyli polskich znaków
String tekst1 = "To jest tekst do zapisu.";
char[] charsbos = tekst1.toCharArray();
BufferedOutputStream bos = null;
//zabezpieczamy się przed błedem
try {
//uchwyt do pliku
bos = new BufferedOutputStream(new FileOutputStream("src/all/part_10_Files/bis.txt"));
for (char c : charsbos) {
bos.write(c); //zapisujemy do pliku
}
} catch (IOException e) { //możemy też zapisać Exception
e.printStackTrace();
} finally {
if (bos != null) bos.close();//zamykamy plik
}

//ZAPIS DO PLIKU WIELU ZNAKÓW NA RAZ, z zapisem Unicode czyli polskich znaków
String tekst2 = "To jest tekst do zapisu.";
BufferedWriter bw = null;
//zabezpieczamy się przed błedem
try {
//uchwyt do pliku
bw = new BufferedWriter(new FileWriter("src/all/part_10_Files/bw.txt"));
for (int i = 0; i<5; i++) {
bw.write("Linijka " + i + ": " + tekst2 + "\n"); //zapisujemy do pliku
}
} catch (IOException e) { //możemy też zapisać Exception
e.printStackTrace();
} finally {
if (bw != null) bw.close();//zamykamy plik
}

//W celu zapisu danych innych niż tekstowe należy korzystać z wyspecjalizowanych klas
//buforowanie do pliku binarnego
DataOutputStream dos = null;
//zabezpieczamy się przed błedem
try {
//uchwyt do pliku
dos = new DataOutputStream(
new BufferedOutputStream(
new FileOutputStream("src/all/part_10_Files/dos.txt")));
dos.writeUTF("Testowy strumień binarny");
dos.writeShort(30000);
dos.writeLong(12345678963214L);
dos.writeFloat(55.36F);
dos.writeDouble(25878.2548d);
dos.writeByte(11);
dos.writeChar('A');
//zapisujemy
dos.flush();
} catch (IOException e) { //możemy też zapisać Exception
e.printStackTrace();
} finally {
if (dos != null) dos.close();//zamykamy plik
}

//-------------------------------------------------------------------------------
//ODCZYT PLIKU BAJT PO BAJCIE
FileInputStream in = null;
//zabezpieczamy się przed błedem
try {
//uchwyt do pliku
in = new FileInputStream("src/all/part_10_Files/test.txt");
int i = 0;
while ((i = in.read()) != -1) {//-1 to koniec pliku
System.out.print((char) i); //konwertujemy na char, bo inaczej będą tylko bajty
}
} catch (IOException e) { //możemy też zapisać Exception
e.printStackTrace();
} finally {
if (in != null) in.close();//zamykamy plik
}
System.out.println("\n");

//ODCZYT PLIKU Z POLSKIMI ZNAKAMI, bajt po bajcie
FileReader fr = null;
//zabezpieczamy się przed błedem
try {
//uchwyt do pliku
fr = new FileReader("src/all/part_10_Files/fw.txt");
int i = 0;
while ((i = fr.read()) != -1) {//-1 to koniec pliku
System.out.print((char) i); //konwertujemy na char, bo inaczej będą tylko bajty
}
} catch (IOException e) { //możemy też zapisać Exception
e.printStackTrace();
} finally {
if (fr != null) fr.close();//zamykamy plik
}

//ODCZYT PLIKU wiele znaków, bez zapisu Unicode czyli polskich znaków
BufferedInputStream bis = null;
//zabezpieczamy się przed błedem
try {
//uchwyt do pliku
bis = new BufferedInputStream(new FileInputStream("src/all/part_10_Files/bis.txt"));
int i = 0;
while ((i = bis.read()) != -1) {//-1 to koniec pliku
System.out.print((char) i); //konwertujemy na char, bo inaczej będą tylko bajty
}
} catch (IOException e) { //możemy też zapisać Exception
e.printStackTrace();
} finally {
if (bis != null) bis.close();//zamykamy plik
}
System.out.println("\n");

//ODCZYT PLIKU wiele znaków, z Unicode czyli polskimi znakami
BufferedReader br = null;
//zabezpieczamy się przed błedem
try {
//uchwyt do pliku
br = new BufferedReader(new FileReader("src/all/part_10_Files/bw.txt"));
String str = null;
while ((str = br.readLine()) != null) {
System.out.println(str);
}
} catch (IOException e) { //możemy też zapisać Exception
e.printStackTrace();
} finally {
if (br != null) br.close();//zamykamy plik
}

//W celu odczytu danych innych niż tekstowe należy korzystać z wyspecjalizowanych klas
//!!!odczytujemy dane w takiej samej kolejności jak zapisywaliśmy!!!
DataInputStream dis = null;
//zabezpieczamy się przed błedem
try {
//uchwyt do pliku
dis = new DataInputStream(
new BufferedInputStream(
new FileInputStream("src/all/part_10_Files/dos.txt")));

//odczytujemy po kolei tak jak było zapisane
//dos.writeUTF("Testowy strumień binarny");
String str1 = dis.readUTF();
System.out.println(str1);
//dos.writeShort(30000);
short srt = dis.readShort();
System.out.println(srt);
//dos.writeLong(12345678963214L);
/*long lng = dis.readLong();
System.out.println(lng);*/
//jeżeli chcielibyśmy pominąć odczyt któregoś z typów musimy przeskoczyć określoną ilość bajtów
dis.skipBytes(8);
//dos.writeFloat(55.36F);
float flt = dis.readFloat();
System.out.println(flt);
//dos.writeDouble(25878.2548d);
double dbl = dis.readDouble();
System.out.println(dbl);
//dos.writeByte(11);
byte bt = dis.readByte();
System.out.println(bt);
//dos.writeChar('A');
char ch = dis.readChar();
System.out.println(ch);
} catch (IOException e) { //możemy też zapisać Exception
e.printStackTrace();
} finally {
if (dis != null) dis.close();//zamykamy plik
}
//---------------------------------------------------------------------
//KOPIOWANIE PLIKU
FileInputStream incp = null;
FileOutputStream outcp = null;
//zabezpieczamy się przed błedem
try {
//uchwyt do pliku
incp = new FileInputStream("src/all/part_10_Files/test.txt");
outcp = new FileOutputStream("src/all/part_10_Files/testcp.txt");
int i = 0;
while ((i = incp.read()) != -1) {//-1 to koniec pliku
outcp.write(i);
}
} catch (IOException e) { //możemy też zapisać Exception
e.printStackTrace();
} finally {
if (incp != null) incp.close();//zamykamy plik
if (outcp != null) outcp.close();//zamykamy plik
}


}
}

 

Klasa File

za pomocą klasy File możemy operować na plikach i katalogach

import java.io.File;
import java.io.IOException;
import java.util.Date;


public class FileClass {
public static void main(String[] args) throws IOException {
File file = new File("src/all/part_10_Files/klasafile.txt");
//sprawdzamy czy plik istnieje
if (!file.exists()){
//tworzymy plik
if (file.createNewFile()){
System.out.println("Utworzono nowy plik.");
} else {
System.out.println("Wystąpił nieoczekiwany błąd.");
}
}
System.out.println("Czy plik może być odczytany?: " + file.canRead());
System.out.println("Czy plik może być zapisywany?: " + file.canWrite());
System.out.println("Czy to katalog?: " + file.isDirectory());
System.out.println("Czy to plik?: " + file.isFile());
System.out.println("Jak się nazywa plik?: " + file.getName());
System.out.println("Nadrzędny katalog: " + file.getParent());
System.out.println("Ścieżka dostępu: " + file.getPath());
System.out.println("Ścieżka dostępu absolutna: " + file.getAbsolutePath());
System.out.println("Czy plik jest ukryty?: " + file.isHidden());
System.out.println("Kiedy modyfikowany?: " + new Date(file.lastModified()));
System.out.println("Ilość bajtów?: " + file.length());

//listujemy katalog
File fl = new File("src/all/part_10_Files");
if (fl.exists()){
String[] files = fl.list();
for (String f : files) {
System.out.println(f);
}
} else {
System.out.println("taki folder nie istnieje");
}

//tworzymy katalog
File dir = new File("src/all/part_10_Files/test_dir");
if(!dir.exists()) {
dir.mkdir();
System.out.println("Utworzono katalog");
} else{
System.out.println("Katalog już istnieje");
}

}
}

 

Serializacja

Serializacja pozwala na zapisanie/odczytanie obiektów

import java.io.*;

class CarObject implements Serializable{
public String manufacturer;
public String name;
public int productionYear;
public int topSpeed;
public transient int id; //to pole nie będzie serializowane

public CarObject(String manufacturer, String name, int productionYear, int topSpeed, int id) {
this.manufacturer = manufacturer;
this.name = name;
this.productionYear = productionYear;
this.topSpeed = topSpeed;
this.id = id;
}

@Override
public String toString() {
return "CarObject{" +
"manufacturer='" + manufacturer + '\'' +
", name='" + name + '\'' +
", productionYear=" + productionYear +
", topSpeed=" + topSpeed +
", id=" + id +
'}';
}
}

public class SerializeExample {
public static void main(String[] args) throws IOException {
CarObject car1 = new CarObject("Ford", "Mustang", 1970,200,1);
CarObject car2 = new CarObject("Dodge", "Charger", 1975,220,2);

//zapisujemy obiekt do pliku
ObjectOutputStream out = new ObjectOutputStream(
new BufferedOutputStream(
new FileOutputStream("src/all/part_10_Files/serialize.dat")
));
out.writeObject(car1);
out.writeObject(car2);
out.flush(); //opróżniamy bufor
out.close();

//odczytujemy obiekt
ObjectInputStream in = new ObjectInputStream(
new BufferedInputStream(
new FileInputStream("src/all/part_10_Files/serialize.dat")
));
try {
while (true){
CarObject car = (CarObject) in.readObject();
System.out.println(car);
}
} catch (EOFException e){
//koniec pliku
} catch (Exception e){
e.printStackTrace();
} finally {
if (in!=null) in.close();
}
}
}