Android Studio: пользовательский класс Writer расширяет BufferedWriter, использует super и this.write (PemWriter) - PullRequest
0 голосов
/ 19 ноября 2018

Ниже приведен пример класса, который я должен использовать.Я пытаюсь понять, как его использовать.Итак, я не могу изменить эту часть, только то, что в моей деятельности:

    package com.example.android.datafrominternet.utilities;

    import android.util.Log;
    import java.io.BufferedWriter;
    import java.io.IOException;
    import java.io.Writer;

public class MyWriter extends BufferedWriter {

public MyWriter(Writer out)
{
    super(out);
}

public void writeTest(String repeatthis) throws IOException {
    this.write(repeatthis);
    this.newLine();
    this.write("along with this other stuff.");

    Log.d("LOOK HERE", "writeTest was accessed successfully"+repeatthis);
}
}

Это то, что в моей деятельности:

    String iwantThisString = "";
    StringWriter writer = new StringWriter();
    MyWriter myObjectWrites = new MyWriter(writer);
    String myNewString = "I want to see this repeated back to me.";

    try {
        myObjectWrites.writeTest(myNewString);
        iwantThisString = writer.toString();  //Does not work.
    } catch (IOException e) {
        e.printStackTrace();
    }
    try {
        writer.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

Как мне получить iwantThisString, чтобы забратькакой writeTest ложится?

Если вы хотите увидеть реальный класс, который я пытаюсь использовать, это pemWriter из Spongy Castle.

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Вот полное объяснение того, как это работает, насколько мне известно (теперь, когда я понял это):

public class MyWriter extends BufferedWriter {

При создании класса MyWriter, расширяющего BufferedWriter, MyWriter становится идентичным классу с BufferedWriter, пока вы что-то не измените.

    public MyWriter(Writer out)
{
    super(out);
}

Это конструктор. Он выглядит как метод / функция, но вызывается только при создании «нового MyWriter» и используется для определения этого нового объекта в соответствии с этими инструкциями. В этом случае для создания нового экземпляра MyWriter требуется входной параметр «(Writer out)», который является StringWriter с именем «writer» в действии. То есть он требует другого Writer в качестве входных данных и вызывает его 'out'. «Супер» отправляет «до» BufferedWriter. При этом вы «обернули» StringWriter в BufferedWriter. Другими словами, вы поместили StringWriter в BufferedWriter. Результат объединяет функциональность обоих типов Writer; "Buffered-String-Writer", если хотите.

    public MyWriter writeTest(String repeatthis) throws IOException {
    this.write(repeatthis);
    this.newLine();
    this.write("along with this other stuff.");

Здесь важно отметить, что «this» относится к BufferedWriter. По сути, он добавляет каждую строку к неназванной строке, которая существует внутри BufferedWriter.

Самым важным является то, что вы должны использовать flush (), чтобы выгрузить все из BufferedWriter, чтобы получить его там, куда он должен идти. В этом случае flush () наконец отправляет строку в StringWriter, где она будет оставаться, пока вы не вытянете ее оттуда. Ниже приведен правильный рабочий код:

    StringWriter writer = new StringWriter();
    MyWriter myObjectWrites = new MyWriter(writer);
    String myNewString = "I want to see this repeated back to me.";

    try {
        myObjectWrites.writeTest(myNewString);
    } catch (IOException e) {
        e.printStackTrace();
    }
    try {
        myObjectWrites.flush();
        myObjectWrites.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return writer.toString();

Обратите внимание, что вы закрываете () объект BufferedWriter 'myObjectWrites', а не объект StringWriter 'Writer'. Кроме того, согласно документации, close () также сбрасывает BufferedWriter, но я все еще использую flush () для безопасности.

0 голосов
/ 20 ноября 2018

Кроме того, я обнаружил, что следующий код работает с библиотекой губчатого замка, взятой из: Экспорт открытого ключа RSA в строку PEM с использованием java

    PublicKey publicKey = keyPair.getPublic();
    StringWriter writer = new StringWriter();
    PemWriter pemWriter = new PemWriter(writer);
    pemWriter.writeObject(new PemObject("PUBLIC KEY", publicKey.getEncoded()));
    pemWriter.flush();
    pemWriter.close();
    return writer.toString();
...