From 2437894ccfcbf5484286bd98e7e39155f8c79e4e Mon Sep 17 00:00:00 2001 From: Maklakov Sergey Date: Sat, 29 Sep 2018 20:00:16 +0500 Subject: [PATCH] dz3 --- .../java2/lesson8/FileHistoryStorage.java | 61 +++++++++++++++++++ .../batiaev/java2/lesson8/HistoryStorage.java | 9 +++ .../com/batiaev/java2/lesson8/MyWindow.java | 4 ++ 3 files changed, 74 insertions(+) create mode 100644 src/main/java/com/batiaev/java2/lesson8/FileHistoryStorage.java create mode 100644 src/main/java/com/batiaev/java2/lesson8/HistoryStorage.java diff --git a/src/main/java/com/batiaev/java2/lesson8/FileHistoryStorage.java b/src/main/java/com/batiaev/java2/lesson8/FileHistoryStorage.java new file mode 100644 index 0000000..0c623c4 --- /dev/null +++ b/src/main/java/com/batiaev/java2/lesson8/FileHistoryStorage.java @@ -0,0 +1,61 @@ +package com.batiaev.java2.lesson8; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.RandomAccessFile; +import java.util.ArrayList; +import java.util.List; + +public class FileHistoryStorage implements HistoryStorage { + + RandomAccessFile fileHistory; + private String HISTORY_FILE_PATH = "history.txt"; + private List messagesOffsets = new ArrayList<>(); + + public FileHistoryStorage() { + try { + fileHistory = new RandomAccessFile(new File(HISTORY_FILE_PATH), "rw"); + fileHistory.seek(0); + + while (fileHistory.getFilePointer() < fileHistory.length()) { + messagesOffsets.add(fileHistory.getFilePointer()); + fileHistory.readLine(); + } + + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + public void addMessage(String message) { + try { + fileHistory.seek(fileHistory.getFilePointer()); + messagesOffsets.add(fileHistory.getFilePointer()); + fileHistory.writeUTF(message); + } catch (IOException e) { + e.printStackTrace(); + } + + } + + @Override + public String getMessages(int count, int offset) { + StringBuilder messages = new StringBuilder(); + if (count > 0 && offset >= 0 && offset < messagesOffsets.size()) { + try { + int startOffset = Math.max(0, messagesOffsets.size() - offset - count); + fileHistory.seek(messagesOffsets.get(startOffset)); + for (int i = 0; i < Math.min(count, messagesOffsets.size() - startOffset); i++) { + messages.append(fileHistory.readUTF()); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + return messages.toString(); + } +} diff --git a/src/main/java/com/batiaev/java2/lesson8/HistoryStorage.java b/src/main/java/com/batiaev/java2/lesson8/HistoryStorage.java new file mode 100644 index 0000000..caab39d --- /dev/null +++ b/src/main/java/com/batiaev/java2/lesson8/HistoryStorage.java @@ -0,0 +1,9 @@ +package com.batiaev.java2.lesson8; + +public interface HistoryStorage { + + void addMessage(String message); + + String getMessages(int count, int offset); + +} diff --git a/src/main/java/com/batiaev/java2/lesson8/MyWindow.java b/src/main/java/com/batiaev/java2/lesson8/MyWindow.java index 0d88995..96deadb 100644 --- a/src/main/java/com/batiaev/java2/lesson8/MyWindow.java +++ b/src/main/java/com/batiaev/java2/lesson8/MyWindow.java @@ -31,6 +31,8 @@ public class MyWindow extends JFrame { private DataOutputStream out; private boolean authorized = false; + HistoryStorage historyStorage = new FileHistoryStorage(); + public static void main(String[] args) { new MyWindow().setVisible(true); } @@ -111,6 +113,7 @@ private void connect(String login, String password) { if (msg.startsWith(Command.AUTHOK_COMMAND.getText())) { String nick = msg.substring(Command.AUTHOK_COMMAND.getText().length() + 1); setTitle(nick + "'s client"); + jta.append(historyStorage.getMessages(100, 0)); setAuthorized(true); } else if (msg.startsWith(Command.DISCONNECTED.getText())) { jta.append("Connection closed..=("); @@ -118,6 +121,7 @@ private void connect(String login, String password) { } else if (isAuthorized()) { if (msg.equalsIgnoreCase("end session")) break; jta.append(msg + System.lineSeparator()); + historyStorage.addMessage(msg + System.lineSeparator()); } } setAuthorized(false);