Wczytywanie i odczytywanie z pliku .txt

0

Witam, mam pytanie odnośnie poprawności kodu zapisu do / odczytu z pliku, oraz "pozyskiwania" kodu ASCII z char'a i na odwrót. Z góry dziękuję :)

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

public class Main {

	public static void main(String[] args) {

		System.out.println("Podaj lancuch znakow : ");
		String a; // Do zmiennej 'a' przypisywany jest lancuch znakow
		File file = new File("tekst.txt");
		Scanner scan = new Scanner(System.in);
		a = scan.nextLine();
		scan.close();
		int[] array = new int[a.length()]; // Tablica na kod ASCII
		int i = 0;
		while (i < a.length()) // zamieniam znaki na kod ASCII dla kazdego znaku
		{
			array[i] = (int) a.charAt(i);
			i++;
		}

		System.out.println("Kod ASCII : ");
		toAscii(array);

		System.out.println("\nCzytam kod ASCII : ");
		toCharsFromAscii(array);

		System.out.println("\nZapisuje kod ASCII do pliku " + file.getName());
		writeAsciiToFile(file, array);

		System.out.println("\nCzytam kod ASCII z pliku " + file.getName());
		readAsciiFromFile(file);

	}

	private static void readAsciiFromFile(File file) {
		try {
			Scanner out = new Scanner(file);
			while (out.hasNext()) {
				System.out.print(Character.toChars(out.nextInt()));
			}
			out.close();
		} catch (Exception e) {
			System.out.println("Nie udalo sie odczytac zawartosci pliku " + file.getName());
		}
	}

	private static void writeAsciiToFile(File file, int[] array) {
		try {
			PrintWriter printWriter = new PrintWriter(file.getName());
			for (int x : array) {
				printWriter.print(x + " ");
			}
			printWriter.close();
		} catch (Exception e) {
			System.out.println("Nie udalo sie zapisac kodu ASCII do pliku");
		}
	}

	private static void toCharsFromAscii(int[] array) {
		for (int x : array) {
			System.out.print(Character.toChars(x));

		}
	}

	private static void toAscii(int[] array) {
		for (int x : array) {
			System.out.print(x + " ");
		}
	}
}


1
  1. https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#getBytes--
  2. Kod generalnie jest "ok", szczególnie jeśli żyjesz gdzieś w roku 2005 i piszesz do nas za pomocą wehikułu czasu. W rzeczywistości:
  • użyłbyś operacji na plikach z Files.
  • napisałbyś funkcje konwertujące które coś zwracają i osobno funkcje które zapisują/czytają z pliku, bo teraz to tylko utrudniasz sobie napisanie testów
  • używałbyś istniejących metod a nie wynajdywał koło na nowo
  • nie łapałbyś Exception tylko konkretne wyjątki których oczekujesz. Teraz łykniesz też choćby NPE, jeśli zrobiłeś błąd w kodzie, ale zalogujesz to jako Nie udalo sie odczytac zawartosci pliku co jest raczej dość mylące.
0

Nie za często pisze w Javie 8, ale takie coś udało mi się zrobić (abstrahując już od obsługi wyjątków)

public class Main {

    private static final String FILE_NAME = "tekst.txt";
    private static final String DELIMITER = " ";

    public static void main(String[] args) {
        System.out.println("Podaj lancuch znakow : ");
        String a; // Do zmiennej 'a' przypisywany jest lancuch znakow
        try (Scanner scan = new Scanner(System.in)) {
            a = scan.nextLine();
            scan.close();
        }

        System.out.println("Kod ASCII : ");
        final int[] asciiArray = a.codePoints().toArray();

        final String asciiString = Arrays.stream(asciiArray)
                .mapToObj(String::valueOf)
                .collect(Collectors.joining(DELIMITER));


        System.out.println("\nCzytam kod ASCII : ");
        System.out.println(asciiString);

        final Path path = Paths.get(FILE_NAME);
        System.out.println("\nZapisuje kod ASCII do pliku " + FILE_NAME);
        try {
            Files.write(path, asciiString.getBytes());
        } catch (Exception e) {
            System.out.println("Nie udalo sie zapisac kodu ASCII do pliku");
        }

        System.out.println("\nCzytam kod ASCII z pliku " + FILE_NAME);
        try {
            final String asciiStringFromFile = Files.lines(path)
                    .map(s -> Arrays.stream(s.split(DELIMITER)))
                    .flatMap(strings -> strings)
                    .map(Integer::valueOf)
                    .map(Character::toChars)
                    .map(String::valueOf)
                    .collect(Collectors.joining());
            System.out.println(asciiStringFromFile);
        } catch (Exception e) {
            System.out.println("Nie udalo sie odczytac zawartosci pliku " + FILE_NAME);
        }
    }
}

W Javie 7 doszło try-with-resources, możesz skrócić zamykanie strumieni - https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

1 użytkowników online, w tym zalogowanych: 0, gości: 1