Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 61 additions & 0 deletions src/main/java/com/batiaev/java2/lesson8/FileHistoryStorage.java
Original file line number Diff line number Diff line change
@@ -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<Long> 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()) {
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

не совсем ясно как удобно выделять сдвиг так как длина сообщений может быть различна

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Добрый день!
При старте я зачитываю файл с историе и запоминаю все сдвиги для каждого сообщения. Потом при новых собщениях пополняю лист со сдвигами. Соответственно всегда могу зачитывать историю с нужного сообщения

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();
}
}
9 changes: 9 additions & 0 deletions src/main/java/com/batiaev/java2/lesson8/HistoryStorage.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.batiaev.java2.lesson8;

public interface HistoryStorage {

void addMessage(String message);

String getMessages(int count, int offset);

}
4 changes: 4 additions & 0 deletions src/main/java/com/batiaev/java2/lesson8/MyWindow.java
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down Expand Up @@ -111,13 +113,15 @@ 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..=(");
setAuthorized(false);
} else if (isAuthorized()) {
if (msg.equalsIgnoreCase("end session")) break;
jta.append(msg + System.lineSeparator());
historyStorage.addMessage(msg + System.lineSeparator());
}
}
setAuthorized(false);
Expand Down