2016-11-28 4 views
0

У меня есть приложение, в котором я должен прочитать .txt-файл, чтобы сохранить некоторые значения и сохранить их. Это работает очень хорошо, за исключением того факта, что я хочу сделать эти значения нечитаемыми или «непонятными» для внешних пользователей.Байт-шифрование для текстового файла

Моей идеей было преобразовать содержимое файла в шестнадцатеричный или двоичный, и в процессе чтения измените его на Char. Дело в том, что у меня нет доступа к таким методам, как String.Format, из-за моего компилятора.

Вот как я в настоящее время чтения и сохранения значения:

   byte[] buffer = new byte[1024]; 
       int len = myFile.read(buffer); 
       String data = null; 
       int i=0; 
       data = new String(buffer,0,len); 

класса, чтобы открыть и управлять файлом:

public class File { 
    private boolean debug = false; 
    private FileConnection fc = null; 
    private OutputStream os = null; 
    private InputStream is = null; 
    private String fileName = "example.txt"; 
    private String pathName = "logs/"; 
    final String rootName = "file:///a:/"; 

    public File(String fileName, String pathName) { 
     super(); 
     this.fileName = fileName; 
     this.pathName = pathName; 
     if (!pathName.endsWith("/")) { 
      this.pathName += "/"; // add a slash 
     } 
    } 


    public boolean isDebug() { 
     return debug; 
    } 

    public void setDebug(boolean debug) { 
     this.debug = debug; 
    } 


    public void write(String text) throws IOException { 
     write(text.getBytes()); 
    } 


    public void write(byte[] bytes) throws IOException { 
     if (debug) 
      System.out.println(new String(bytes)); 
     os.write(bytes); 
    } 


    private FileConnection getFileConnection() throws IOException { 
     // check if subfolder exists 
     fc = (FileConnection) Connector.open(rootName + pathName); 
     if (!fc.exists() || !fc.isDirectory()) { 
      fc.mkdir(); 
      if (debug) 
       System.out.println("Dir created"); 
     } 
     // open file 
     fc = (FileConnection) Connector.open(rootName + pathName + fileName); 
     if (!fc.exists()) 
      fc.create(); 
     return fc; 
    } 

    /** 
    * release resources 
    */ 
    public void close() { 
     if (is != null) 
      try { 
       is.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     is = null; 
     if (os != null) 
      try { 
       os.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     os = null; 
     if (fc != null) 
      try { 
       fc.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     fc = null; 

    } 

    public void open(boolean writeAppend) throws IOException { 
     fc = getFileConnection(); 
     if (!writeAppend) 
      fc.truncate(0); 
     is = fc.openInputStream(); 
     os = fc.openOutputStream(fc.fileSize()); 

    } 

    public int read(byte[] buffer) throws IOException { 

     return is.read(buffer); 
    } 

    public void delete() throws IOException { 
     close(); 
     fc = (FileConnection) Connector.open(rootName + pathName + fileName); 
     if (fc.exists()) 
       fc.delete(); 


    } 

} 

Я хотел бы знать, простой способ, как читать это содержание. Двоичный или шестнадцатеричный, оба будут работать на меня.

+0

Какой компилятор вы используете, который не поддерживает метод форматирования String? Это было с тех пор, как Java 1.5 ... Порекомендовал бы обновить ваш компилятор, если это вариант. – Ironcache

+0

Это не так, поскольку я разрабатываю для устройства, которое работает только с 1.3, к сожалению. – Lkun

+0

У меня, конечно же, нет непосредственных знаний о том, как это сделать, но это [этот вопрос] (http://stackoverflow.com/questions/9655181/how-to-convert-a-byte-array-to-a -hex-string-in-java) полезен вообще? – Ironcache

ответ

1

Так, с некоторым пониманием вопроса, я считаю, что вы действительно ищете формы запутывания? Как упоминалось в комментариях, самый простой способ сделать это, вероятно, является формой шифрования.

Рассмотрим пример реализации сдвигового шифра:

Common

int shift = 11; 

Дать

// Get the data to be wrote to file. 
String data = ... 

// cipher the data. 
char[] chars = data.toCharArray(); 
for (int i = 0; i < chars.length; ++i) { 
    chars[i] = (char)(chars[i] + shift); 
} 
String cipher = new String(chars); 

// Write the data to the cipher file. 
... 

Чтение

// Read the cipher file. 
String data = ... 

// Decipher the data. 
char[] chars = data.toCharArray(); 
for (int i = 0; i < chars.length; ++i) { 
    chars[i] = (char)(chars[i] - shift); 
} 
String decipher = new String(chars); 

// Use data as required. 
... 

Вот example implementation on Ideone. Выход:

Data : I can read this IP 192.168.0.1 
Cipher : T+nly+}plo+st~+T[+<D=9<AC9;9< 
Decipher: I can read this IP 192.168.0.1 

Я попытался сохранить это как можно более низким, чтобы удовлетворить требованиям Java 3.

Отметьте, что это NOT защищен любым способом. Шифры сдвига (как и большинство шифров в пузырьке) тривиальны для взлома злонамеренных объектов. Пожалуйста, не используйте это, если безопасность является актуальной проблемой.

+0

Работал как шарм! Спасибо @Ironache :) – Lkun

0

Ваше решение слишком сложное. С Java 8, вы можете попробовать:

String fileName = "configFile.txt"; 

    try (Stream<String> stream = Files.lines(Paths.get(fileName))) { 
     //TO-DO .Ex 
     stream.forEach(System.out::println); 

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

Пользователь указал, что их компилятор не поддерживает метод форматирования String ... он, конечно же, не поддерживает потоки. – Ironcache

+0

@tuyendev, как упоминалось в Ironcache, я ограничен 1.3ide. Заранее спасибо. – Lkun

Смежные вопросы