diff --git a/.gitignore b/.gitignore
index a1c2a23..bd754eb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,23 +1,2 @@
-# Compiled class file
-*.class
-
-# Log file
-*.log
-
-# BlueJ files
-*.ctxt
-
-# Mobile Tools for Java (J2ME)
-.mtj.tmp/
-
-# Package Files #
-*.jar
-*.war
-*.nar
-*.ear
-*.zip
-*.tar.gz
-*.rar
-
-# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
-hs_err_pid*
+/out/
+.idea
\ No newline at end of file
diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..4c55865
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+/.gitignore
+/misc.xml
+/modules.xml
+/vcs.xml
+/out/
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..b1001d2
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..d65723f
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Cryptor.iml b/Cryptor.iml
new file mode 100644
index 0000000..d872f73
--- /dev/null
+++ b/Cryptor.iml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Projects b/Projects
new file mode 160000
index 0000000..95dc913
--- /dev/null
+++ b/Projects
@@ -0,0 +1 @@
+Subproject commit 95dc913ea86bf54c8318100020e6508ab8814ab3
diff --git a/src/Crypt.java b/src/Crypt.java
new file mode 100644
index 0000000..8c7e0b5
--- /dev/null
+++ b/src/Crypt.java
@@ -0,0 +1,4 @@
+public interface Crypt {
+ public String crypt(String strToCrypt);
+ public String decrypt(String strToDecrypt);
+}
diff --git a/src/Cryptor.java b/src/Cryptor.java
new file mode 100644
index 0000000..966978a
--- /dev/null
+++ b/src/Cryptor.java
@@ -0,0 +1,40 @@
+import java.io.IOException;
+
+public class Cryptor implements Crypt {
+
+ CryptorViaString cryptorViaString;
+ CryptorViaStringBuilder cryptorViaStringBuilder;
+
+ public Cryptor(CryptorViaString cryptorViaString, CryptorViaStringBuilder cryptorViaStringBuilder) {
+ this.cryptorViaString = cryptorViaString;
+ this.cryptorViaStringBuilder = cryptorViaStringBuilder;
+
+ }
+
+ public String crypt(String strToCrypt) {
+ long m = System.currentTimeMillis();
+// String cryptedStringViaString = cryptorViaString.crypt(strToCrypt);
+ String cryptedStringViaStringBuilder = cryptorViaStringBuilder.crypt(strToCrypt);
+ double timeResult = (double) (System.currentTimeMillis() - m);
+ System.out.println("Время выполнения шифрования с ипсользованием StringBuilder: " + timeResult);
+
+ return cryptedStringViaStringBuilder;
+ }
+
+ public String decrypt(String strToDecrypt) {
+ long t = System.currentTimeMillis();
+// String cryptedStringViaString = cryptorViaString.decrypt(strToDecrypt);
+ String cryptedStringViaStringBuilder = cryptorViaStringBuilder.decrypt(strToDecrypt);
+ double timeResult = (double) (System.currentTimeMillis() - t);
+ System.out.println("Время выполнения шифрования с ипсользованием StringBuilder: " + timeResult);
+
+ return cryptedStringViaStringBuilder;
+
+ }
+
+
+}
+
+
+
+
diff --git a/src/CryptorTest.java b/src/CryptorTest.java
new file mode 100644
index 0000000..f9e3ada
--- /dev/null
+++ b/src/CryptorTest.java
@@ -0,0 +1,155 @@
+import org.junit.Assert;
+import org.junit.Test;
+
+
+public class CryptorTest {
+ CryptorViaString cryptorViaString = new CryptorViaString();
+ CryptorViaStringBuilder cryptorViaStringBuilder = new CryptorViaStringBuilder();
+ StringBuilder testStringBuilder = new StringBuilder();
+
+
+ @Test
+ public void cryptBasicTest() {
+ String testString = "A2a3b3z3tcz3";
+ String resultString = cryptorViaString.crypt("AAaaabbbzzztczzz");
+ Assert.assertEquals(testString, resultString);
+ }
+
+ @Test
+ public void decryptBasicTest() {
+ String testString = "AAaaabbbzzztczzz";
+ String resultString = cryptorViaString.decrypt("A2a3b3z3tcz3");
+ Assert.assertEquals(testString, resultString);
+ }
+
+ @Test
+ public void cryptOneCharTest() {
+ String testString = "a";
+ String resultString = cryptorViaString.crypt("a");
+ Assert.assertEquals(testString, resultString);
+ }
+
+ @Test
+ public void decryptOneCharTest() {
+ String testString = "a";
+ String resultString = cryptorViaString.decrypt("a");
+ Assert.assertEquals(testString, resultString);
+ }
+
+ @Test
+ public void cryptEmptyStrTest() {
+ String testString = "";
+ String resultString = cryptorViaString.crypt("");
+ Assert.assertEquals(testString, resultString);
+ }
+
+ @Test
+ public void decryptEmptyStrTest() {
+ String testString = "";
+ String resultString = cryptorViaString.decrypt("");
+ Assert.assertEquals(testString, resultString);
+ }
+
+ @Test
+ public void cryptOneRepeatTest() {
+ String testString = "a3";
+ String resultString = cryptorViaString.crypt("aaa");
+ Assert.assertEquals(testString, resultString);
+ }
+
+ @Test
+ public void decryptOneRepeatTest() {
+ String testString = "aaa";
+ String resultString = cryptorViaString.decrypt("a3");
+ Assert.assertEquals(testString, resultString);
+ }
+
+ @Test
+ public void cryptNoRepeatTest() {
+ String testString = "abcdef";
+ String resultString = cryptorViaString.crypt("abcdef");
+ Assert.assertEquals(testString, resultString);
+ }
+
+ @Test
+ public void decryptNoRepeatTest() {
+ String testString = "abcdef";
+ String resultString = cryptorViaString.decrypt("abcdef");
+ Assert.assertEquals(testString, resultString);
+
+ }
+
+ // CryptorViaStringBuilder
+
+ @Test
+ public void cryptBasicV2Test() {
+ String testStringBuilder = "A2a3b3z3tcz3";
+ String resultSringBuilder = cryptorViaStringBuilder.crypt("AAaaabbbzzztczzz");
+ Assert.assertEquals(testStringBuilder, resultSringBuilder);
+ }
+
+ @Test
+ public void decryptBasicV2Test() {
+ String testStringBuilder = "AAaaabbbzzztczzz";
+ String resultSringBuilder = cryptorViaStringBuilder.decrypt("A2a3b3z3tcz3");
+ Assert.assertEquals(testStringBuilder, resultSringBuilder);
+ }
+
+ @Test
+ public void cryptV2OneCharTest() {
+ String testStringBuilder = "a";
+ String resultSringBuilder = cryptorViaStringBuilder.crypt("a");
+ Assert.assertEquals(testStringBuilder, resultSringBuilder);
+ }
+
+ @Test
+ public void decryptV2OneCharTest() {
+ String testStringBuilder = "a";
+ String resultSringBuilder = cryptorViaStringBuilder.decrypt("a");
+ Assert.assertEquals(testStringBuilder, resultSringBuilder);
+ }
+
+ @Test
+ public void cryptV2EmptyStrTest() {
+ String testStringBuilder = "";
+ String resultSringBuilder = cryptorViaStringBuilder.crypt("");
+ Assert.assertEquals(testStringBuilder, resultSringBuilder);
+ }
+
+ @Test
+ public void decryptV2EmptyStrTest() {
+ String testStringBuilder = "";
+ String resultSringBuilder = cryptorViaStringBuilder.decrypt("");
+ Assert.assertEquals(testStringBuilder, resultSringBuilder);
+ }
+
+ @Test
+ public void cryptV2OneRepeatTest() {
+ String testStringBuilder = "a3";
+ String resultSringBuilder = cryptorViaStringBuilder.crypt("aaa");
+ Assert.assertEquals(testStringBuilder, resultSringBuilder);
+ }
+
+ @Test
+ public void decryptV2OneRepeatTest() {
+ String testStringBuilder = "aaa";
+ String resultSringBuilder = cryptorViaStringBuilder.decrypt("a3");
+ Assert.assertEquals(testStringBuilder, resultSringBuilder);
+ }
+
+ @Test
+ public void cryptV2NoRepeatTest() {
+ String testStringBuilder = "abcdef";
+ String resultSringBuilder = cryptorViaStringBuilder.crypt("abcdef");
+ Assert.assertEquals(testStringBuilder, resultSringBuilder);
+ }
+
+ @Test
+ public void decryptV2NoRepeatTest() {
+ String testStringBuilder = "abcdef";
+ String resultSringBuilder = cryptorViaStringBuilder.decrypt("abcdef");
+ Assert.assertEquals(testStringBuilder, resultSringBuilder);
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/CryptorViaString.java b/src/CryptorViaString.java
new file mode 100644
index 0000000..3e92812
--- /dev/null
+++ b/src/CryptorViaString.java
@@ -0,0 +1,66 @@
+
+public class CryptorViaString implements Crypt {
+
+ @Override
+ public String crypt(String strToCrypt) {
+
+ String result = "";
+
+ if (strToCrypt != null && !strToCrypt.equals("")) {
+ int count = 0;
+ char currentChar = 0;
+
+ for (int i = 0; i < strToCrypt.length(); i++) {
+ if (currentChar == strToCrypt.charAt(i)) {
+ count++;
+ } else {
+ if (currentChar != 0)
+ result += currentChar;
+
+ if (count > 1) {
+ result += count;
+ }
+ currentChar = strToCrypt.charAt(i);
+ count = 1;
+ }
+ }
+ if (count > 1) {
+ result += strToCrypt.charAt(strToCrypt.length() - 1);
+ result += count;
+ } else
+ result += strToCrypt.charAt(strToCrypt.length() - 1);
+ }
+ return result;
+ }
+
+ @Override
+ public String decrypt(String strToDecrypt) {
+
+ String result = "";
+ char currentChar = 0;
+ int count;
+
+ if (strToDecrypt != null && !strToDecrypt.equals("")) {
+
+ for (int i = 0; i < strToDecrypt.length(); i++) {
+ if (Character.isDigit(strToDecrypt.charAt(i))) {
+ count = Character.getNumericValue(strToDecrypt.charAt(i));
+ for (int j = 1; j < count; j++) {
+ result += currentChar;
+ }
+ } else {
+ currentChar = strToDecrypt.charAt(i);
+ if (currentChar != 0)
+ result += currentChar;
+ }
+ }
+
+ if (!Character.isDigit(strToDecrypt.charAt(strToDecrypt.length() - 1)) &&
+ !(currentChar == (strToDecrypt.charAt(strToDecrypt.length() - 1))))
+ result += currentChar;
+ }
+ return result;
+ }
+}
+
+
diff --git a/src/CryptorViaStringBuilder.java b/src/CryptorViaStringBuilder.java
new file mode 100644
index 0000000..c62c682
--- /dev/null
+++ b/src/CryptorViaStringBuilder.java
@@ -0,0 +1,64 @@
+public class CryptorViaStringBuilder implements Crypt {
+
+
+ StringBuilder result = new StringBuilder();
+
+ @Override
+ public String crypt(String strToCrypt) {
+
+ if (strToCrypt != null && !strToCrypt.equals("")) {
+ int count = 0;
+ char currentChar = 0;
+
+ for (int i = 0; i < strToCrypt.length(); i++) {
+ if (currentChar == strToCrypt.charAt(i)) {
+ count++;
+ } else {
+ if (currentChar != 0)
+ result.append(currentChar);
+
+ if (count > 1) {
+ result.append(count);
+ }
+ currentChar = strToCrypt.charAt(i);
+ count = 1;
+ }
+ }
+ if (count > 1) {
+ result.append(strToCrypt.charAt(strToCrypt.length() - 1));
+ result.append(count);
+ } else
+ result.append(strToCrypt.charAt(strToCrypt.length() - 1));
+ }
+ return result.toString();
+ }
+
+ @Override
+ public String decrypt(String strToDecrypt) {
+
+
+ char currentChar = 0;
+ int count;
+
+ if (strToDecrypt != null && !strToDecrypt.equals("")) {
+
+ for (int i = 0; i < strToDecrypt.length(); i++) {
+ if (Character.isDigit(strToDecrypt.charAt(i))) {
+ count = Character.getNumericValue(strToDecrypt.charAt(i));
+ for (int j = 1; j < count; j++) {
+ result.append(currentChar);
+ }
+ } else {
+ currentChar = strToDecrypt.charAt(i);
+ if (currentChar != 0)
+ result.append(currentChar);
+ }
+ }
+
+ if (!Character.isDigit(strToDecrypt.charAt(strToDecrypt.length() - 1)) &&
+ !(currentChar == (strToDecrypt.charAt(strToDecrypt.length() - 1))))
+ result.append(currentChar);
+ }
+ return result.toString();
+ }
+}
diff --git a/src/FileHandler.java b/src/FileHandler.java
new file mode 100644
index 0000000..7a2aaaa
--- /dev/null
+++ b/src/FileHandler.java
@@ -0,0 +1,37 @@
+import java.io.*;
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+public class FileHandler {
+ Cryptor cryptor;
+
+ public FileHandler(Cryptor cryptor) {
+ this.cryptor = cryptor;
+
+ }
+
+ public void writeToFile (String strIn, String fileOut) {
+ try (FileWriter writer = new FileWriter(fileOut)) {
+ if (Files.exists(Path.of(fileOut))) {
+ writer.write(strIn);
+ writer.flush();
+ } else {
+ Files.createFile(Path.of(fileOut));
+ writer.write(strIn);
+ writer.flush();
+ writer.close();
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public String readFromFile (String fileIn) throws IOException {
+ BufferedReader reader;
+ String str;
+ reader = new BufferedReader(new FileReader(fileIn));
+ str = reader.readLine();
+ return str;
+ }
+ }
+
diff --git a/src/main.java b/src/main.java
new file mode 100644
index 0000000..ab52b9c
--- /dev/null
+++ b/src/main.java
@@ -0,0 +1,29 @@
+import java.io.IOException;
+
+public class main {
+
+
+ public static void main(String[] args) throws IOException {
+
+ String filePathToCrypt = "C:\\Users\\Usr1\\IdeaProjects\\Cryptor\\src\\tasks\\filetoCrypt.txt";
+
+ String filePathCryptResult = "C:\\Users\\Usr1\\IdeaProjects\\Cryptor\\src\\tasks\\filecryptResult.txt";
+ String filePathDeCryptResult = "C:\\Users\\Usr1\\IdeaProjects\\Cryptor\\src\\tasks\\filedecryptResult.txt";
+
+
+ CryptorViaString cryptorViaString = new CryptorViaString();
+ CryptorViaStringBuilder cryptorViaStringBuilder = new CryptorViaStringBuilder();
+ Cryptor cryptor = new Cryptor(cryptorViaString, cryptorViaStringBuilder);
+ FileHandler fileHandlerCrypt = new FileHandler(cryptor);
+
+ String cryptResult = fileHandlerCrypt.readFromFile(filePathToCrypt);
+ cryptResult = fileHandlerCrypt.cryptor.crypt(cryptResult);
+ fileHandlerCrypt.writeToFile(cryptResult, filePathCryptResult);
+
+ String decryptResult = fileHandlerCrypt.readFromFile(filePathToCrypt);
+ decryptResult = fileHandlerCrypt.cryptor.decrypt(decryptResult);
+ fileHandlerCrypt.writeToFile(decryptResult, filePathDeCryptResult);
+
+
+ }
+}