Wejście i wyjście

Obsługa operacji wejścia i wyjścia za pomocą API Stream oraz NIO


dr inż. Aleksander Smywiński-Pohl

apohllo@o2.pl

http://apohllo.pl/dydaktyka/programowanie-obiektowe

Input - Output

Klasa File

In [227]:
import java.io.*;
File homedir = new File(System.getProperty("user.home"));

File file = new File(homedir, "plik.txt");

if(file.exists() && file.isFile() && file.canRead()){
    File directory = new File(homedir, "katalog");
    directory.mkdir();
    file.renameTo(new File(directory, "plik1.txt"));
    System.out.println("Plik został zmieniony");
} else {
    System.out.println("Plik nie istnieje");
}
Plik został zmieniony
Out[227]:
null

Metody klasy File

In [228]:
import java.io.*;
File homedir = new File(System.getProperty("user.home"), "katalog");

System.out.println(homedir.canExecute());
System.out.println(homedir.canRead());
System.out.println(homedir.canWrite());
true
true
false
Out[228]:
null
In [229]:
import java.io.*;
File homedir = new File(System.getProperty("user.home"), "katalog");

System.out.println(homedir.setReadOnly());
System.out.println(homedir.setExecutable(true));
System.out.println(homedir.setReadable(true));
true
true
true
Out[229]:
null
In [230]:
import java.io.*;
File homedir = new File(System.getProperty("user.home"), "katalog");

System.out.println(homedir.getAbsolutePath());
System.out.println(homedir.getCanonicalPath());
System.out.println(homedir.getName());
System.out.println(homedir.getParent());
/home/apohllo/katalog
/home/apohllo/katalog
katalog
/home/apohllo
Out[230]:
null
In [231]:
import java.io.*;
File homedir = new File(System.getProperty("user.home"), "katalog");
File file = new File(homedir, "plik1.txt");

System.out.println(homedir.exists());
System.out.println(file.exists());
System.out.println(homedir.isAbsolute());
System.out.println(homedir.isDirectory());
System.out.println(homedir.isFile());
true
true
true
true
false
Out[231]:
null
In [232]:
import java.io.*;
File file = new File(System.getProperty("user.home") + File.separator + "katalog", "plik1.txt");

File destination = new File(System.getProperty("user.home") + File.separator + "katalog", "plik2.txt");
System.out.println(file.renameTo(destination));
System.out.println(file.delete());
false
false
Out[232]:
null
In [233]:
import java.io.*;
File file = new File(System.getProperty("user.home") + File.separator + "katalog", "plik1.txt");

System.out.println(file.getFreeSpace());
System.out.println(file.getTotalSpace());
System.out.println(file.getUsableSpace());
80200617984
179570700288
71007543296
Out[233]:
null
In [234]:
import java.io.*;
import java.util.*;

File[] roots = File.listRoots();
Arrays.stream(roots).forEach(System.out::println);
/
Out[234]:
null

Plik tymczasowy

In [ ]:
import java.io.*;

File temporary = File.createTempFile("prefix", ".txt");
temporary.deleteOnExit();

Strumienie

In [235]:
System.out.println("Przykład strumienia I/O");
Przykład strumienia I/O
Out[235]:
null

Dane binarne

In [236]:
import java.io.*;

try(InputStream stream = new FileInputStream("/home/apohllo/Downloads/download.png")) {
    byte[] buffer = new byte[4096];
    int length, count = 0;
    while ((length = stream.read(buffer)) > 0) {
        for(int i=0; i < length; i++) {
            if (buffer[i] == 97) count++;
        }
    }
    System.out.println("Liczba występień litery <a>: " + count);
} catch (IOException ex) {
    System.out.println("Problem IO: " + ex);
}
Liczba występień litery <a>: 420
Out[236]:
null

Dane tekstowe

In [237]:
import java.io.*;

try (BufferedReader reader = new BufferedReader(
        new FileReader("/home/apohllo/Downloads/po.txt"))){
        
    String line;
    while((line = reader.readLine()) != null) {
        System.out.println(line);
    }
} catch (IOException ex) {
    System.out.println("Problem IO: " + ex);
}
Smywiński-Pohl Aleksander  
Wtorek 11:15

1. Bernal Szymon
2. Borkowski Szymon
3. Czarny Szymon
4. Geisler Wojciech
5. Jopek Artur
6. Kardaś Piotr
7. Lewicki Wojciech
8. Mandowski Miłosz
9. Mazur Aleksandra
10. Pęczek Paweł
11. Reczek Wiktor
12. Rejowski Tomasz
13. Łażewski Stanisław

Smywiński-Pohl Aleksander  
Piątek 14:40

1. Buta Mateusz
2. Czajęcki Tomasz
3. Czapiga Jakub
4. Dej Filip
5. Gwóźdź Jakub
6. Koza Wojciech
7. Kędziora Piotr
8. Maleńczuk Marcin
9. Pacia Maciej
10. Rzońca Konrad
11. Sobczyk Patryk
12. Szczerba Adam
13. Zadora Michał

Smywiński-Pohl Aleksander  
Piątek 16:15

1. Cegielski Rafał
2. Cupiał Eric
3. Dłuś Mikołaj
4. Frejek Grzegorz
5. Janeczko Łukasz
6. Janikowski Szymon
7. Kmiecik Krzysztof
8. Micek Maciej
9. Osadnik Michał
10. Socha Łukasz
11. Wodecki Mateusz
12. Wojtyś Piotr
13. Zając Łukasz

Smywiński-Pohl Aleksander  
Piątek 17:50

1. Buś Wojciech
2. Janecki Szymon
3. Klemens Wojciech
4. Kołoczek Jakub
5. Mendroch Paweł
6. Placha Arkadiusz
7. Pniak Mikołaj
8. Radoń Konrad
9. Szpyrka Mateusz
10. Tonia Bartłomiej
11. Łakomy Łukasz
12. Śledź Michał
13. Świerad Kamil

Kaleta Zbigniew  
Poniedziałek 17:50

1. Bieniek Jarosław
2. Drabina Radosław
3. Dyrlaga Paweł
4. Kulma Dawid
5. Rudnik Michał
6. Różak Grzegorz
7. Stanik Łukasz
8. Stopa Kacper
9. Szaflarski Andrzej
10. Szarek Mateusz
11. Witek Dawid
12. Ćwiklicki Piotr
13. Łątka Bogdan

Kaleta Zbigniew  
Wtorek 16:15

1. Boszczyk Piotr
2. Czerski Jakub
3. Droński Michał
4. Gruszka Wojciech
5. Karkocha Tomasz
6. Klimowski Maciej
7. Lippa Gustaw
8. Michalski Tomasz
9. Nowak Gabriel
10. Sośniak Marcin
11. Sroka Jakub
12. Stachura Bartłomiej
13. Wańczyk Wojciech

Kaleta Zbigniew  
Wtorek 17:50

1. Chumak Tymofii
2. Cudak Magdalena
3. Dutkiewicz Julia
4. Jarosz Kamil
5. Konieczny Jakub
6. Kuzicki Radosław
7. Liberacki Jan
8. Monasterski Mateusz
9. Musiał Wojciech
10. Sofiński Bartosz
11. Yakimovich Mikita
12. Zawalska Justyna
13. Życiński Krystian

Kaleta Zbigniew  
Czwartek 16:15

1. Bartkowicz Patrycja
2. Chyży Joanna
3. Kowalczyk Paulina
4. Maczuga Paweł
5. Moskal Maciej
6. Muroń Artur
7. Pięta Antoni
8. Pych Rafał
9. Soczek Witold
10. Stępień Bartłomiej
11. Szot Arkadiusz
12. Wójtowicz Patryk
13. Zdybel Tomasz

Kaleta Zbigniew  
Czwartek 17:50

1. Bodera Jakub
2. Bukalski Paweł
3. Błachut Katarzyna
4. Ciechański Ludwik
5. Drewnik Aleksandra
6. Janowski Jakub
7. Janowski Miłosz
8. Kurdziel Szymon
9. Lubczyński Piotr
10. Posłuszny Jakub
11. Sołtysik Andrzej
12. Szczerbiński Piotr

Polak Stanisław  
Poniedziałek 11:15

1. Drozd Dawid
2. Janczyk Piotr
3. Janda Kacper
4. Lepiarczyk Błażej
5. Lichoń Szymon
6. Lisiewski Filip
7. Mykhaylovskyy Dmytro
8. Savchenko Maryna
9. Sroka Grzegorz
10. Starz Jacek
11. Swędrak Piotr
12. Zembol Mateusz
13. Łanecki Jakub

Polak Stanisław  
Poniedziałek 12:50

1. Basiura Wojciech
2. Bąk Karol
3. Fudaliński Marek
4. Janda Kamil
5. Jasek Józef
6. Kasprzycki Tomasz
7. Kozioł Radosław
8. Kądzielawa Kasper
9. Okas Aleksander
10. Pietrzyk Bartosz
11. Plewa Julia
12. Sokół Mateusz

Polak Stanisław  
Wtorek 8:0

1. Kalfas Jakub
2. Krakowski Krystian
3. Kulig Łukasz
4. Luśtyk Jakub
5. Marondel Klaudia
6. Olbrychtowicz Michał
7. Sobczyk Tomasz
8. Stachura Rafał
9. Zalewski Piotr
10. Zhyhallo Mykola
11. Łęczycki Dawid

Polak Stanisław  
Wtorek 14:40

1. Aman Marcin
2. Duczymiński Filip
3. Gędłek Paweł
4. Matula Mikołaj
5. Mikucki Aleksander
6. Pajor Jakub
7. Pham Marcin
8. Rodzoń Jan
9. Stanisz Michał
10. Sus Wiktor
11. Wojsławski Witold
12. Śliz Paweł

Polak Stanisław  
Czwartek 11:15

1. Cieloch Jakub
2. Doległo Kamil
3. Dyduch Dominik
4. Gonera Aleksandra
5. Grela Konrad
6. Mucha Rafał
7. Piekarz Karolina
8. Pulnar Agnieszka
9. Sharabai Serhii
10. Starzyk Jakub
11. Tuduj Paulina
12. Wieczorek Szymon
13. Żur Julia

Polak Stanisław  
Czwartek 14:40

1. Gargas Marek
2. Gołda Jan
3. Kapała Jan
4. Knapik Mateusz
5. Makieła Krzysztof
6. Masliukivskyi Oleksandr
7. Mucha Maciej
8. Wróblewski Mikołaj
9. Węgrzyn Patryk
10. Zeller Paweł
11. Zemła Rafał
12. Ziarko Jakub

Out[237]:
null

Czytanie z konsoli

In [ ]:
import java.io.*;

try (BufferedReader reader = new BufferedReader(
        new InputStreamReader(System.in))) {

    String line;
    while((line = reader.readLine()) != null) {
        System.out.println(line);
    }
} catch (IOException ex) {
    System.out.println("Problem IO: " + ex);
}

Zapis do pliku

In [238]:
import java.io.*;

File file = new File(System.getProperty("user.home") + File.separator +
    "Downloads" + File.separator + "output.txt");
try (PrintWriter output = new PrintWriter(
        new BufferedWriter(new FileWriter(file)))) {

    output.println("W Szczebrzeszynie chrząszcz brzmi w trzcinie");
} catch (IOException ex) {
    System.out.println("Problem IO: " + ex);
}
Out[238]:
null

Dekoratory

In [239]:
import java.io.*;
import java.util.zip.*;

File file = new File("/home/apohllo/Downloads/output.txt.gz");

BufferedWriter writer = 
    new BufferedWriter(
        new OutputStreamWriter(
            new GZIPOutputStream(
                new FileOutputStream(file))));
writer.write("W Szczebrzeszynie chrząszcz brzmi w trzcinie\n");
writer.close();
Out[239]:
null
In [240]:
import java.io.*;
import java.util.zip.*;

File file = new File("/home/apohllo/Downloads/output.txt.gz");
LineNumberReader reader = 
    new LineNumberReader(
        new BufferedReader(
            new InputStreamReader(
                new GZIPInputStream(
                    new FileInputStream(file)))));
System.out.println(reader.readLine());
System.out.println(reader.getLineNumber());
W Szczebrzeszynie chrząszcz brzmi w trzcinie
1
Out[240]:
null

Kopiowanie - try z zasobami

In [ ]:
import java.io.*;
import java.util.zip.*;

try (BufferedReader reader = new BufferedReader(
        new FileReader("/home/apohllo/Downloads/output.txt"));
     PrintWriter writer = new PrintWriter(
        new BufferedWriter(
            new FileWriter("/home/apohllo/Downloads/output.cpy")))) {
            
    String line;
    
    while((line = reader.readLine()) != null) {
        writer.println(line);
    }
} catch (IOException ex) {
    System.out.println("Problem IO: " + ex);
}

Wady klasycznego podejścia

  • brak metod do wykonywania popularnych operacji
  • brak jednolitej obsługi nazw plików na różnych platformach
  • brak jednolitego modelu atrybutów plików
  • brak funkcji specyficznych dla określonej platformy
  • brak obsługi nieblokujących operacji IO

Nowy system IO - NIO.2

In [ ]:
import java.nio.file.*;

Files.copy(Paths.get("/home/apohllo/Downloads/output.txt"), 
    Paths.get("/home/apohllo/Downloads/output1.cpy"));
In [ ]:
import java.nio.file.*;

Files.copy(Paths.get("/home/apohllo/Downloads/output.txt"), 
    Paths.get("/home/apohllo/Downloads/output1.cpy"),
    StandardCopyOption.REPLACE_EXISTING);
In [ ]:
import java.nio.file.*;

Path source = Paths.get("/", "home", "apohllo", "Downloads", "test.txt");

Files.createFile(source);
Files.deleteIfExists(source);
In [ ]:
import java.nio.file.*;

Path source = Paths.get("/", "home", "apohllo", "Downloads", "test.txt");
Path target1 = Paths.get("/", "home", "apohllo", "Downloads", "test1.cpy");
Path target2 = Paths.get("/", "home", "apohllo", "Downloads", "test2.cpy");

Files.createFile(source);
Files.copy(source, target1);
Files.move(source, target2);
Files.deleteIfExists(source);
Files.deleteIfExists(target1);
Files.deleteIfExists(target2);
In [ ]:
import java.nio.file.*;

Path target = Paths.get("/", "home", "apohllo", "Downloads", "output.txt.gz");
long size = Files.size(target);

System.out.println(Files.isDirectory(target));
System.out.println(Files.isSymbolicLink(target));
In [ ]:
import java.nio.file.*;
import java.nio.charset.*;
import java.util.*;

Charset charset = StandardCharsets.UTF_8;
Path target = Paths.get("/", "home", "apohllo", "Downloads", "output.txt");
List<String> lines = Files.readAllLines(target, charset);
byte[] bytes = Files.readAllBytes(target);
for(int i = 0; i < 29; i++) {
    if(i > 16)
        System.out.println((char)bytes[i] + " " + bytes[i]);
}
In [ ]:
import java.nio.file.*;
import java.nio.charset.*;
import java.util.*;
import java.io.*;

Charset charset = StandardCharsets.UTF_8;
Path source = Paths.get("/", "home", "apohllo", "Downloads", "output.txt");
BufferedReader reader = Files.newBufferedReader(source, charset);
BufferedWriter writer = Files.newBufferedWriter(source, charset);
In [ ]:
import java.nio.file.*;
import java.nio.charset.*;
import java.util.*;
import java.io.*;

Path source = Paths.get("/", "home", "apohllo", "Downloads", "output.txt");

InputStream input = Files.newInputStream(source);
OutputStream output = Files.newOutputStream(source);

Path

In [ ]:
import java.nio.charset.*;
import java.nio.file.*;
import java.util.*;
import java.io.*;
import java.net.*;

URI zipFile = URI.create("jar:file:/home/apohllo/Downloads/chlopiec.zip");
Map<String, String> env = new HashMap<>();
try (FileSystem subSystem =
        FileSystems.newFileSystem(zipFile, env)) {

    Path pathForFile = subSystem.getPath("/hello.txt");
    List<String> list = new ArrayList<>();
    list.add("Ala ma kota w Szczebrzeszynie");
    
    Files.write(pathForFile, list, Charset.defaultCharset(),
        StandardOpenOption.WRITE, StandardOpenOption.CREATE);
} catch (IOException ex) {
    System.out.println("Problem IO: " + ex);
}

Asynchroniczne wejście i wyjście

In [ ]:
import java.nio.*;
import java.nio.channels.*;
import java.nio.charset.*;
import java.nio.file.*;
import java.util.*;
import java.io.*;
import java.util.concurrent.*;

try (AsynchronousFileChannel channel = 
        AsynchronousFileChannel.open(
            Paths.get("/home/apohllo/Downloads/output.txt.gz"))) {
            
    ByteBuffer buffer = ByteBuffer.allocateDirect(1024 * 1024 * 100); // 100 MB
    Future<Integer> result = channel.read(buffer, 0);
    
    // można wykonać jakieś działania w trakcie wczytywania pliku
    
    System.out.println("Liczba wczytanych bajtów " + result.get());
} catch (IOException ex) {
    System.out.println("Problem IO: " + ex);
}

Pytania?