Java пишет "[" и "]" в текстовый файл вместо "[" и "]" - PullRequest
0 голосов
/ 12 мая 2018

Я беру входную строку в качестве исходного кода Java, немного ее редактирую и генерирую файл .java на Java.

Вот мой код.

BufferedWriter writer = new BufferedWriter(new FileWriter("javacode.java"));
//msg = msg.substring(4); //ignore this
String newcontent = "import java.io.BufferedWriter;import java.io.ByteArrayOutputStream;import java.io.FileWriter;import java.io.PrintStream;";
char[] content = msg.toCharArray();
int j = msg.indexOf("String[] args") + 14;
boolean inMain = false;
for (int x=0;x<content.length;x++) {
    if (x == j) {
        inMain = true;
        if (content[j] != '{') {
            j += 1;
            newcontent += String.valueOf(content[x]);
            continue;
        }
        newcontent += String.valueOf(content[x]);
        String prefix = "ByteArrayOutputStream consoleStorage = new ByteArrayOutputStream();PrintStream newConsole = System.out;System.setOut(new PrintStream(consoleStorage));";
        newcontent += prefix;
    }
    else if (content[x] == '}' && inMain) {
        String post = "String str = consoleStorage.toString();try {BufferedWriter writer = new BufferedWriter(new FileWriter(\"javaoutput.txt\"));writer.write(str);writer.close();} catch (Exception e) {}";
        newcontent += post;
        newcontent += String.valueOf(content[x]);
        inMain = false;
    }
    else {
        newcontent += String.valueOf(content[x]);
    }
}
writer.write(newcontent);
writer.close();

Это может показаться немного сложным, но, вообще говоря, я добавляю эти три куска кода в основной метод ввода исходного кода.

//At the beginning of the program, insert the following code
import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.FileWriter;
import java.io.PrintStream;
...
...
...
//At the beginning of the main method, insert the following code
ByteArrayOutputStream consoleStorage = new ByteArrayOutputStream();
PrintStream newConsole = System.out;
System.setOut(new PrintStream(consoleStorage));
...
...
...
//At the end of the main method, insert the following code
String str = consoleStorage.toString();
try {
    BufferedWriter writer = new BufferedWriter(new FileWriter("javaoutput.txt"));
    writer.write(str);
    writer.close();
} catch (Exception e) {}

Однако, когда я проверяю это, спростой пример Hello World, я получил этот файл .java.

Вот мой исходный код (переменная "msg", это простая строка)

public class myClass {
    public static void main(String[] args) {
        System.out.println("Hello");
    }
}

Вот что я получил,(Я переформатировал этот файл для лучшего вида)

import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.FileWriter;
import java.io.PrintStream;

public class myClass {

    ByteArrayOutputStream consoleStorage = new ByteArrayOutputStream();
    PrintStream newConsole = System.out;
    System.setOut(new PrintStream(consoleStorage));

    public static void main(String&#91;&#93; args) {
        System.out.println("Hello");
        String str = consoleStorage.toString();
        try {
            BufferedWriter writer = new BufferedWriter(new FileWriter("javaoutput.txt"));
            writer.write(str);
            writer.close();
        } catch (Exception e) {}
    }
}

Как вы можете видеть, Java не может поместить "[" и "]" в файл и вместо этого написать "[]", и, таким образом,(вероятно) "int j = msg.indexOf (" String [] args ") + 14;"не удается найти основной метод.

Я пытался исправить это многими способами, включая замену «[» на «\\ [» и т. д., но ни один из них не работает.Честно говоря, я даже не уверен, что «[]» создает проблему.


Обновление:

Я протестировал все содержимое переменных "msg" и "content" /массив в разные фазы, вставив в мою программу следующие тестовые отпечатки.

Примечание:

  1. CQ.sendPrivateMsg (msgReceiver, message) используется для отправки сообщенияполучатель, это работает должным образом.

  2. переменная "msg" передается из программного обеспечения для чата, которое я могу использовать только для его API для отправки / получения сообщений, пока у меня нетего исходный код ...

Эта программа является частью плагина программного обеспечения для чата.

...
...
...
BufferedWriter writer = new BufferedWriter(new FileWriter("javacode.java"));
msg = msg.substring(4);

//test print 1
CQ.sendPrivateMsg(fromQQ, CC.at(fromQQ) + "\n" + msg);

String newcontent = "import java.io.BufferedWriter;import java.io.ByteArrayOutputStream;import java.io.FileWriter;import java.io.PrintStream;";
char[] content = msg.toCharArray();

//test print 2
CQ.sendPrivateMsg(fromQQ, CC.at(fromQQ) + "\n" + content[55] + content[56] + content[57] + content[58]);

//test print 3
String tempstr = new String();
for (int i=0;i<content.length;i++) {
    tempstr += String.valueOf(content[i]);
}
CQ.sendPrivateMsg(fromQQ, CC.at(fromQQ) + "\n" + tempstr);

int j = msg.indexOf("String[] args") + 14;
...
...
...

Фактический результат показан ниже

//test print 1: msg
public class myClass {
    public static void main(String[] args) {
        System.out.println("Hello");
    }
}

//test print 2: char array, accessed each digit one by one
&#91

//test print 3: char array, concatenate in a loop and print out as a whole
public class myClass {
    public static void main(String[] args) {
        System.out.println("Hello");
    }
}

Кажется, что проблема вызвана случаем, когда я пытался получить доступ к одному значению в массиве символов, но это нормально, когда я использую цикл for, чтобы напечатать все это.


Обновление:

Я решил это, заменив [и другой странный код в массиве символов bу [или].

Советы, данные в комментарии, очень полезны.Цените!

...