Java IOJava zawiera wiele przydatnych klas I/O, które wspierają operacje różne wejścia i wyjścia (input, output).

Oto lista przykładów wykorzystujące te klasy. Uzbierałem ich aż 16. Mam nadzieje ,że tobie się one przydadzą.

Postanowiłem potraktować te przykłady dosyć poważnie dlatego stworzyłem jedną klasą zawierającą je wszystkie. Kod do pobrania umieściłem na końcu wpisu.

Klasa wyświetla następującą listę poleceń.

String testFile = "c:\\JavaIOTest\\test.txt";
System.out.append("Wpisz polecenie:\n");
System.out.append("0. Stworzenie folder JavaIOTest \n");
System.out.append("1. Tworzenie pliku w C:JavaIOTest:test.txt \n");
System.out.append("2. Sprawdzenie czy plik w C:JavaIOTest:test.txt istnieje \n");
System.out.append("3. Sprawdzenie rozmiaru pliku C:JavaIOTest:test.txt \n");
System.out.append("4. Skasuj plik C:JavaIOTest:test.txt \n");
System.out.append("5. Zmien nazwe pliku C:JavaIOTest:test.txt \n");
System.out.append("=================================================================== \n");
System.out.append("6. Przygotuj nastepne przyklady \n");
System.out.append("7. Skopiuj plik c:\\JavaIOTest\\folder_A\\test_Afile.txt do c:\\JavaIOTest\\folder_B\\test_Bfile.txt \n");
System.out.append("8. Przenies plik do innego folderu - zmien nazwe \n");
System.out.append("9. Przenies plik do innego folder - skopiuj skasuj \n");
System.out.append("=================================================================== \n");
System.out.append("10. Ustaw plik tylko do odczytu \n");
System.out.append("11. Ustal sciezke do pliku tymczasowego\n");
System.out.append("=================================================================== \n");
System.out.append("12. Zapis do pliku BufferedWriter \n");
System.out.append("13. Zapis do pliku FileOutputStream \n");
System.out.append("14. Odczyt z pliku BufferReader \n");
System.out.append("15. Odczyt z pliku FileInput \n");
System.out.append("16. Dodanie tekstu do istniejacego pliku \n");

W pętli while w zależności od twojego wyboru wykona się dany przykład.

while(true)
{
    try {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String s = br.readLine();

        switch(s)
        {

        case "0":
            System.out.append("\nOpcja 0:Utworzenie folderu: c:JavaIOTest: \n");
            FileIOJava.CreateFolder("c:\\JavaIOTest\\");

            break;
        case "1":
            System.out.append("\nOpcja 1:Tworznie pliku:\n");
            FileIOJava.CreateFile(testFile);
            break;
        case "2":
            System.out.append("\nOpcja 2: Sprawdzenie pliku:\n");
            FileIOJava.CheckIfFileExist(testFile);
            break;
        case "3":
            System.out.append("\nOpcja 3: Sprawdzenie rozmiaru :\n");
            FileIOJava.CheckSize(testFile);
        case "4":
            System.out.append("\nOpcja 4: Skasuj plik :\n");
            FileIOJava.DeleteFile(testFile);
            break;
        case "5":
            System.out.append("\nOpcja 5: Zmiana nazwy pliku :\n");
            FileIOJava.RenameFile(testFile,"c:\\JavaIOTest\\testNEW.txt");
            break;
        case "6":
            System.out.append("\nOpcja 6: Przygotowania do opcji 7 :\n");
            FileIOJava.CreateFolder("c:\\JavaIOTest\\folder_A\\");
            FileIOJava.CreateFolder("c:\\JavaIOTest\\folder_B\\");
            FileIOJava.CreateFolder("c:\\JavaIOTest\\folder_C\\");
            FileIOJava.CreateFileForTest("c:\\JavaIOTest\\folder_A\\test_Afile.txt");
            FileIOJava.CreateFileForTest("c:\\JavaIOTest\\folder_B\\test_Bfile.txt");
            break;
        case "7":
            System.out.append("\nOpcja 7: Kopiowanie pliku może go zastapic:\n");
            FileIOJava.CopyFile("c:\\JavaIOTest\\folder_A\\test_Afile.txt",
                    "c:\\JavaIOTest\\folder_B\\test_Bfile.txt");
            break;
        case "8":
            System.out.append("\nOpcja 8: Przeniesienie do innego folderu ZMIEN NAZWE:\n");
            MoveFileToDirectory_RenameMethod("c:\\JavaIOTest\\test.txt","c:\\JavaIOTest\\folder_C");
            //jesli folderu "C" nie ma to plik zniknie break;
        case "9":
            System.out.append("\nOpcja 9: Przeniesienie do innego folderu KOPIUJ/KASUJ:\n");
            FileIOJava.MoveFileToDirectory_CopyDelete("c:\\JavaIOTest\\folder_A\\test_Afile.txt",
                    "c:\\JavaIOTest\\folder_C\\test_Afile.txt");
            break;
        case "10":
            System.out.append("\nOpcja 10: Plik tylko do odczytu:\n");
            MakeFileReadOnly("c:\\JavaIOTest\\test.txt");
            break;
        case "11":
            System.out.append("Opcja 11: Okresl sciezke do pliku ;x; ");
            GetFilePath();
            break;
        case "12":
            System.out.append("Opcja 12: Zapisz do pliku BufferedWriter");
            SaveFile_BufferedWriter("C:\\JavaIOTest\\BufferedWriter_test.txt");
            break;
        case "13":
            System.out.append(" Opcja 13: Zapisz do pliku FileOutputStream");
            SaveFile_FileOutputStreamExample2("C:\\JavaIOTest\\FileOutputStream_test.txt");
            break;
        case "14":
            System.out.append("Opcja 14: Odczyt z pliku BufferReader");
            String test = OpenFile_BufferReaderExample2("C:\\JavaIOTest\\BufferedWriter_test.txt");
            break;
        case "15":
            System.out.append("Opcja 15: Odczyt z pliku FileInput");
            String test2 = OpenFile_FileInputStream2("C:\\JavaIOTest\\FileOutputStream_test.txt");
            break;
        case "16":
            System.out.append("Opcja 16: Dodanie tekstu do istniejacego pliku");
            AppendTextToFile("C:\\JavaIOTest\\FileOutputStream_test.txt");
            AppendTextToFile("C:\\JavaIOTest\\BufferedWriter_test.txt");
            break;

        }

    } catch (IOException e) {
        // TODO Auto-generated catch block e.printStackTrace();
    }
}

Kiedyś ze dwa razy otrzymałem sugestie abym się nie rozpisywał jeżeli chodzi o proste przykłady w kodzie. W tamtych kontekstach nie byłaby to słuszna decyzja.

Jednak w tym wypadku rzeczywiście nie ma o czym tutaj opowiadać i lać wody. Mamy zdanie “x” używamy metody “y” z klasy File i koniec historii.

Jeśli interesują cię metody zapisu i odczytu zawartości pliku przejdź na koniec wpisu.

Przejdźmy więc do przykładów.

0 : Utworzenie folderu w Javie

Używając metody “.mkdirs()” obiektu klasy File może w następujący sposób utworzyć nowy folder.

public static void CreateFolder(String path)
{
    boolean success = (new File(path)).mkdirs();
    if (!success) {
        System.out.append("\n Folder nie utworzony bo już istnieje :\n");
    }
    else {
        System.out.append("\n Folder utworzony\n");
    }
}

Folder “JavaIOTest” jest potrzebny aby inne przykłady mogły działać. Dlatego zaczynając przygodę z tymi przykładami powinieneś zacząć od tego polecenia “0”.

case "0":
    System.out.append("\nOpcja 0:Utworzenie folderu: c:JavaIOTest: \n");
    FileIOJava.CreateFolder("c:\\JavaIOTest\\");

Przejdź więc dalej do utworzenia pliku.

1 : Utworzenie pliku w Javie

Metoda File.createNewFile() jest używana do utworzenia pliku w Javie. Zwracana ona także wartość logiczną więc wiemy czy plik utworzył się pomyślnie (true) czy nie (false).

public static void CreateFile(String path)
{
    try {

        File file = new File(path);

        if (file.createNewFile()){
            System.out.println("Plik zostal stworzony!");
        }else{
            System.out.println("Plik juz istnieje");
        }

    } catch (IOException e) {
        e.printStackTrace();
    }
}

Jakbyś się zastanawiał, dlaczego  teksty w kodzie nie mają polskich znaków to dlatego ,że Eclipse ma skróty klawiszowe dla niektórych polskich liter jak “ł”. Być może ten problem rozwiąże później.


case "1":
    System.out.append("\nOpcja 1:Tworznie pliku:\n");
    FileIOJava.CreateFile("c:\\JavaIOTest\\test.txt");

Użycie metody pomocniczej znajduje się powyżej. Polecenie “1” utworzy plik “test.txt” w folderze “JavaIOTest”, który był utworzony wcześniej.

2 : Czy plik istnieje?

By określić czy plik istnieje, czy nie w danym miejscu w twoim systemie używamy metody “File.exist()”.

public static boolean CheckIfFileExist(String path)
{
    File f = new File(path);

    if(f.exists()){
        System.out.println("Plik istnieje");
        return true;
    }else{
        System.out.println("Plik nie znaleziony!");
        return false;
    }
}
case "2":
    System.out.append("\nOpcja 2: Sprawdzenie pliku:\n");
    FileIOJava.CheckIfFileExist(testFile);
    break;

Przykład ten  potwierdzi czy plik, który utworzyliśmy wcześniej istnieje.

3 : Jak sprawdzić rozmiar pliku w Javie?

W Javie możesz użyć metody File.lenght() do określenia rozmiarów pliku w bajtach.

public static void CheckSize(String Imagepath)
{
    File file = new File(Imagepath);

    if(file.exists()){

        double bytes = file.length();
        double kilobytes = (bytes / 1024);
        double megabytes = (kilobytes / 1024);
        double gigabytes = (megabytes / 1024);
        double terabytes = (gigabytes / 1024);
        double petabytes = (terabytes / 1024);

        System.out.println("bytes : " + bytes);
        System.out.println("kilobytes : " + kilobytes);
        System.out.println("megabytes : " + megabytes);
        System.out.println("gigabytes : " + gigabytes);
        System.out.println("terabytes : " + terabytes);
     
    }else{
        System.out.println("Plik nie istnieje!");
    }
}

Bajty te wystarczy podzielić odpowiednio ,a otrzymamy odpowiednie rozmiary jak kilobajty i megabajty.

case "3":
    System.out.append("\nOpcja 3: Sprawdzenie rozmiaru :\n");
    FileIOJava.CheckSize("c:\\JavaIOTest\\test.txt");

Rozmiar pustego pliku nie będą duże dlatego proponuje użyć tej metody na jakiś większym pliku.

4 : Skasowanie pliku

Metoda “File.delete()” kasuje plik oraz zawraca wartość logiczną określającą czy dana operacja się wykonała.

public static void DeleteFile(String path)
{
    try{

        File file = new File(path);

        if(file.delete()){
            System.out.println(file.getName() + " zostal skasowany!");
        }else{
            System.out.println("Operacja kasowania sie nie powiodla.");
        }

    }catch(Exception e){

        e.printStackTrace();

    }
}
case "4":
    System.out.append("\nOpcja 4: Skasuj plik :\n");
    FileIOJava.DeleteFile("c:\\JavaIOTest\\test.txt");

W tym przykładzie kasujemy plik, który utworzyliśmy wcześniej.

5 : Zmiana nazwy pliku

Java zawiera metodę “renameTo()”, która zmienia nazwę pliku. Jednak ta metoda jest zależna od systemu operacyjnego i nie zawsze działa. Dlatego trzeba na nią uważać.

public static void RenameFile(String oldPath,String newPath)
{
    File oldfile = new File(oldPath);
    File newfile = new File(newPath);

    if(oldfile.renameTo(newfile)){
        System.out.println("Zmiana nazwy - OK");
    }else{
        System.out.println("Zmiana nazwy - NOPE");
    }
}
case "5":
    System.out.append("\nOpcja 5: Zmiana nazwy pliku :\n");
    FileIOJava.RenameFile("c:\\JavaIOTest\\test.txt","c:\\JavaIOTest\\testNEW.txt");

Ten przykład zmieni nazwę pliku utworzonego metodą “1”.

6 : Przygotowanie

Zanim przejdziesz do następnego przykładu wykonaj metodę 6, która stworzy odpowiednie foldery i pliki.

case "6":
    System.out.append("\nOpcja 6: Przygotowania do opcji 7 :\n");
    FileIOJava.CreateFolder("c:\\JavaIOTest\\folder_A\\");
    FileIOJava.CreateFolder("c:\\JavaIOTest\\folder_B\\");
    FileIOJava.CreateFolder("c:\\JavaIOTest\\folder_C\\");
    FileIOJava.CreateFileForTest("c:\\JavaIOTest\\folder_A\\test_Afile.txt");
    FileIOJava.CreateFileForTest("c:\\JavaIOTest\\folder_B\\test_Bfile.txt");
    break;

7 : Kopiowanie pliku

Java nie posiada ,żadnej gotowej funkcji do kopiowania dlatego musiałem ją stworzyć. Aby skopiować plik wystarczy skonwertować jeden plik do strumienia bajtów (“FileInputStream”) i zapisać go do innego pliku używając klasy “FileOutputStream”.

public static void CopyFile(String path1,String path2)
{
    InputStream inStream = null;
    OutputStream outStream = null;

    try{

        File afile = new File(path1);
        File bfile = new File(path2);

        inStream = new FileInputStream(afile);
        outStream = new FileOutputStream(bfile);

        byte[] buffer = new byte[1024];

        int length;
        //copy the file content in bytes while ((length = inStream.read(buffer)) > 0){

            outStream.write(buffer, 0, length);

        }

        inStream.close();
        outStream.close();

        System.out.println("Plik zostal skopiowany!");

    }catch(IOException e){
        e.printStackTrace();
    }
}

Ten przykład skopiuje zawartość pliku“test_Afile.txt” z folderu“A” do pliku“test_bFile.txt” w folderze “B”.

case "7":
    System.out.append("\nOpcja 7: Kopiowanie pliku może go zastapic:\n");
    FileIOJava.CopyFile("c:\\JavaIOTest\\folder_A\\test_Afile.txt",
            "c:\\JavaIOTest\\folder_B\\test_Bfile.txt");
    break;

Jeżeli plik “B” istnieje to jego zawartość zostanie zastąpiona plikiem “A”.

8 : Przemieszczenie pliku metoda zmiany nazwy

Java nie posiada gotowej metody, która by przeniosła jeden plik z jednego miejsca do drugiego.

Problem można rozwiązać na dwa sposoby:

  • Używając metody “File.renameTo()”
  • Kopiując plik do drugiego miejsca. Po tej operacji kasujemy oryginalny plik

Oto rozwiązanie używające metodę zmiany nazwy.

public static void MoveFileToDirectory_RenameMethod(String path, String pathfolder)
{
    try{

        File afile =new File(path);

        if(afile.renameTo(new File(pathfolder + afile.getName()))){
            System.out.println("Plik zostal przeniesiony");
        }else{
            System.out.println("Plik nie zmienil polozenia!");
        }

    }catch(Exception e){
        e.printStackTrace();
    }
}

Zauważyłem także ,że jeśli wywołamy to rozwiązanie na folderze, którego nie ma wtedy plik może być przeniesiony dosłownie w niebyt.


case "8":
    System.out.append("\nOpcja 8: Przeniesienie do innego folderu ZMIEN NAZWE:\n");
    MoveFileToDirectory_RenameMethod("c:\\JavaIOTest\\test.txt","c:\\JavaIOTest\\folder_C");
    //jesli folderu "C" nie ma to plik zniknie

9 : Przemieszczenie pliku

Oto klasyczne przemieszczenie pliku. Kopiujemy plik ,a potem kasujemy jego oryginał.

public static void MoveFileToDirectory_CopyDelete(String pathFile,String pathFile2)
{
    InputStream inStream = null;
    OutputStream outStream = null;

    try{

        File afile =new File(pathFile);
        File bfile =new File(pathFile2);

        inStream = new FileInputStream(afile);
        outStream = new FileOutputStream(bfile);

        byte[] buffer = new byte[1024];

        int length;

        while ((length = inStream.read(buffer)) > 0){

            outStream.write(buffer, 0, length);

        }

        inStream.close();
        outStream.close();

        afile.delete();

        System.out.println("Plik zostal przeniesiony poprawnie!");

    }catch(IOException e){
        e.printStackTrace();
    }
}

Kod kopiowania i kasowania został już objaśniony wcześniej.

case "9":
    System.out.append("\nOpcja 9: Przeniesienie do innego folderu KOPIUJ/KASUJ:\n");
    FileIOJava.MoveFileToDirectory_CopyDelete("c:\\JavaIOTest\\folder_A\\test_Afile.txt",
            "c:\\JavaIOTest\\folder_C\\test_Afile.txt");
    break;

 

10 : Uczynić plik tylko do odczytu

Oto przykład  pokazuje jak ustawić właściwości pliku jak n.p “tylko do odczytu”. Od JDK 1.6 istnieje metoda “setWritable()” , która potrafi przywrócić   możliwość zapisu do pliku.

public static void MakeFileReadOnly(String pathfile)
{
    File file = new File(pathfile);

    //jdk 1.2 - ok file.setReadOnly();

    if(file.canWrite()){
        System.out.println("Ten plik ma możliwosci zapisu");
    }else{
        System.out.println("Ten plik jest tylko do odczytu");
    }

    //jdk 1.6 - ok file.setWritable(true);

    if(file.canWrite()){
        System.out.println("Ten plik ma możliwosci zapisu");
    }else{
        System.out.println("Ten plik jest tylko do odczytu");
    }   
}
case "10":
    System.out.append("\nOpcja 10: Plik tylko do odczytu:\n");
    MakeFileReadOnly("c:\\JavaIOTest\\test.txt");
    break;

11 : Utworzenie pliku tymczasowe i ustalenie jego lokalizacji

Metoda“createTempFile()” tworzy plik tymczasowy .Każdy program potrzebuje plików tymczasowych, które zostaną skasowane w pewnym momencie przez system bądź użytkownika.

public static void GetFilePath()
{
    try {
        File temp = File.createTempFile("temp_file", ".tmp" );

        String absolutePath = temp.getAbsolutePath();
        System.out.println("Sciezka do pliku: " + absolutePath);

        String filePath = absolutePath.
                substring(0,absolutePath.lastIndexOf(File.separator));

        System.out.println("Sciezka do plikus : " + filePath);

    }catch(IOException e){

        e.printStackTrace();

    }
}

Przy okazji używając “getAbsolutePath()” jesteśmy wstanie określić pełną ścieżkę do pliku wraz z jego nazwą.

case "11":
    System.out.append("Opcja 11: Okresl sciezke do pliku ;x; ");
    GetFilePath();
    break;

Przejdźmy do metod, które potrafią zapisać zawartość tekstową do pliku, jak i ją odczytać.

12 : Zapis do pliku BufferedWriter

Plik w Javie można zapisać na dwa sposoby (jak nie trzy). Skoro istnieją dwie metody znaczy to ,że istnieje pewna różnica pomiędzy nimi.

BufferedWriter ma:

  • możliwość wielokrotnego zapisu pomiędzy operacjami “flush” (czyszczenie bufora i umieszczenie zmian do pliku) i zamknięcia
  • obiekty klasy są dosyć małe w stosunku do rozmiaru bufora
  • Buffer writer jest najbardziej efektywny przy mały operacjach zapisu (write)
    • Te małe zapisy są przechowywane w bufforze, zanim zostaną utwardzone.

Natomiast druga opcja operująca na klasie FileOutputStream została raczej stworzona do zapisu masywny danych bitowych (jak n.p obrazki).

Java API Specification
FileOutputStream is meant for writing streams of raw bytes such as image data. For writing streams of characters, consider using FileWriter.

Czyli jeśli piszemy tekst to używamy BufferWriter-a jeśli piszemy masywne dane to używamy “FileOutputStream-a.”

Teraz gdy znamy różnicę pomiędzy FileOutPutStream i BufferWriter zobaczmy przykłady.

public static void SaveFile_BufferedWriter(String path)
{
    try {

        String content = "Przykladowy tekst: Motomyszy z Marsa";

        File file = new File(path);

        // jeżeli plik nie istnieje to tworzymy go if (!file.exists()) {
            file.createNewFile();
        }

        FileWriter fw = new FileWriter(file.getAbsoluteFile());
        BufferedWriter bw = new BufferedWriter(fw);
        bw.write(content);
        bw.close();

        System.out.println("Ok");

    } catch (IOException e) {
        e.printStackTrace();
    }
}

Użycie metody:

13 : Zapis do pliku FileOutputStream

FileOutputStream zapisuje bajty bezpośrednio do pliku .Widać od razu ,że ta klasa nadaje się do jednego gigantycznego wstrzyknięcia danych do pliku, jak i zapisu serializowanego obiektu.

public static void SaveFile_FileOutputStreamExample(String path)
{
    FileOutputStream fop = null;
    File file;
    String content = "Przykladowy tekst: Motomyszy z Marsa";

    try {

        file = new File(path);
        fop = new FileOutputStream(file);

        // jeżeli plik nie istnieje to tworzymy go if (!file.exists()) {
            file.createNewFile();
        }

        // zapisujemy zawartosc w bitach byte[] contentInBytes = content.getBytes();

        fop.write(contentInBytes);
        fop.flush();
        fop.close();

        System.out.println("Ok");

    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (fop != null) {
                fop.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Od JDK 7 powyższy kod można zapisać krócej, gdyż kod z bloku finally automatycznie jest dodawany przez kompilator przy zamknięciu pliku w bloku try.

Więcej informacji tutaj http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

public static void SaveFile_FileOutputStreamExample2(String path)
{
    File file = new File(path);
    String content = "Przykladowy tekst: Motomyszy z Marsa";

    try (FileOutputStream fop = new FileOutputStream(file)) {

        // jeżeli plik nie istnieje to tworzymy go if (!file.exists()) {
            file.createNewFile();
        }

        // zapisujemy zawartosc w bitach byte[] contentInBytes = content.getBytes();

        fop.write(contentInBytes);
        fop.flush();
        fop.close();

        System.out.println("Ok");

    } catch (IOException e) {
        e.printStackTrace();
    }
}

Użycie metody:


case "13":
    System.out.append(" Opcja 13: Zapisz do pliku FileOutputStream");
    SaveFile_FileOutputStreamExample2("C:\\JavaIOTest\\FileOutputStream_test.txt");
    break;

14 : Otworzenie pliku BuferReader

Zapis do pliku mamy już za sobą teraz jak te pliki odczytać?

Podobnie jak wcześniej mamy aż dwa sposoby na odczytanie pliku (istnieje nawet trzeci ,ale tylko o nim wspomnę).

FileInputStream: Odczytuje zawartość pliku jako strumień bajtów

BufferedReader: Działa z danymi zawierające napisy i znaki. Pochłania więcej pamięć, gdyż każdy znak jest strumieniem.

DataInputStream: Przykład nieużyty. Pochłania mniej pamięci ,ale ma limitowaną przestrzeń. Służy do odczytywania strumieni bajtów z plików.

Oto przykład użycia klasy BufferReader.

public static String OpenFile_BufferReaderExample(String path)
{
    BufferedReader br = null;
    StringBuilder sb = new StringBuilder();

    try {

        String sCurrentLine;

        br = new BufferedReader(new FileReader(path));

        while ((sCurrentLine = br.readLine()) != null) {
            System.out.println(sCurrentLine);
            sb.append(sCurrentLine);
        }

    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (br != null)br.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    return sb.toString();
}

Od JDK 7 można powyższy kod zapisać krócej.

public static String OpenFile_BufferReaderExample2(String path)
{
    StringBuilder sb = new StringBuilder();
    try (BufferedReader br = new BufferedReader(new FileReader(path)))
    {
        String sCurrentLine;

        while ((sCurrentLine = br.readLine()) != null) {
            System.out.println(sCurrentLine);
            sb.append(sCurrentLine);
        }

    } catch (IOException e) {
        e.printStackTrace();
    } 
    return sb.toString();
}

Oto użycie tej metody.

case "14":
    System.out.append("Opcja 14: Odczyt z pliku BufferReader");
    String test = OpenFile_BufferReaderExample2("C:\\JavaIOTest\\BufferedWriter_test.txt");
    break;

15 : Otworzenie pliku FileInputStream

Definitywnie tak klasa nie nadaje się do odczytywania tekstu, gdyż każdy bajty musi być przekonwertowany na znak.

public static String OpenFile_FileInputStream()
{
    StringBuilder sb = new StringBuilder();
    File file = new File("C:/robots.txt");
    FileInputStream fis = null;

    try {
        fis = new FileInputStream(file);

        int content;
        while ((content = fis.read()) != -1) {
            // convert to char and display it System.out.print((char) content);
            sb.append((char) content);
        }

    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (fis != null)
                fis.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
    return sb.toString();
}

Od JDK 7 powyższą metodę można zapisać krócej.

public static String OpenFile_FileInputStream2(String path)
{        
    StringBuilder sb = new StringBuilder();
    File file = new File(path);

    try (FileInputStream fis = new FileInputStream(file)) {

        int content;
        while ((content = fis.read()) != -1) {
            // convert to char and display it System.out.print((char) content);
            sb.append((char) content);
        }

    } catch (IOException e) {
        e.printStackTrace();
    }
    return sb.toString();
}

Użycie tej metody.

case "15":
    System.out.append("Opcja 15: Odczyt z pliku FileInput");
    String test2 = OpenFile_FileInputStream2("C:\\JavaIOTest\\FileOutputStream_test.txt");
    break;

16 : Dodanie tekstu na koniec pliku

Poprzednia metody zapisu zawsze zastąpią istniejącą zawartość. Oto więc przykład jak dodać tekst na koniec zawartości pliku.

Skoro wiemy ,że BufferWriter nadaje się najbardziej do zapisu plików tekstowych to dlaczego go nie użyć w tym przykładzie.

public static void AppendTextToFile(String path)
{
    try{
        String data = " Ten tekst doda sie na koncu pliku";

        File file = new File(path);

        // jeżeli plik nie istnieje to tworzymy go if(!file.exists()){
            file.createNewFile();
        }

        FileWriter fileWritter = new FileWriter(file,true);
        BufferedWriter bufferWritter = new BufferedWriter(fileWritter);
        bufferWritter.write(data);
        bufferWritter.close();

        System.out.println("Zrobione \n");

    }catch(IOException e){
        e.printStackTrace();
    }
}

Istnieje tylko jednak różnica. Klasa “FileWriter” została skonstruowana z dodatkowym parametrem, który określa jak zawartości do pliku mają być dodawane.

case "16":
    System.out.append("Opcja 16: Dodanie tekstu do istniejacego pliku");
    AppendTextToFile("C:\\JavaIOTest\\FileOutputStream_test.txt");
    AppendTextToFile("C:\\JavaIOTest\\BufferedWriter_test.txt");
    break;

Uffff… Oto 16 przydatnych przykładów.  W tym wpisie definitywnie jest więcej kodu niż mojego objaśniania. Co mnie bardzo cieszy.

Tak jak obiecałem kod znajduje się poniżej.

Pobierz Kod