正确地将String数组转换为String并返回java

时间:2017-04-02 08:00:34

标签: java arrays string

我有以下代码:

String[] stringArray = new String[] { "One,", "Two", "Three" };
System.out.println(Arrays.toString(stringArray));

生成以下字符串:

[One,, Two, Three]

现在由于连续两个逗号String[]

,因此无法将此字符串转换回具有3个元素的同一,,

如何正确进行此转换?

已更新

Arrays.toString(stringArray)

只是一个特例,我不仅限于使用这种方法。我需要实现一种方法,其中从String []到String的转换以及从String到String []的转换将是幂等操作。

3 个答案:

答案 0 :(得分:4)

您声明" Arrays.toString绝对不是必需的。" 1

我建议你serialize Array to Base64:

public String serializeArray(final String[] data) {
    try (final ByteArrayOutputStream boas = new ByteArrayOutputStream();
         final ObjectOutputStream oos = new ObjectOutputStream(boas)) {
        oos.writeObject(data);
        return Base64.getEncoder().encodeToString(boas.toByteArray());
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

然后将Base64反序列化为数组:

public String[] deserializeArray(final String data) {
    try (final ByteArrayInputStream bias = new ByteArrayInputStream(Base64.getDecoder().decode(data));
         final ObjectInputStream ois = new ObjectInputStream(bias)) {
        return (String[]) ois.readObject();
    } catch (IOException | ClassNotFoundException e) {
        throw new RuntimeException(e);
    }
}

这需要Java 8。

示例:

public static void main(String args[]) throws Exception {
    String[] stringArray = new String[]{"One,", "Two", "Three"};
    String serialized = serializeArray(stringArray);
    String[] deserialized = deserializeArray(serialized);
    System.out.println(Arrays.toString(stringArray));
    System.out.println(serialized);
    System.out.println(Arrays.toString(deserialized));
}

输出

[One,, Two, Three]
rO0ABXVyABNbTGphdmEubGFuZy5TdHJpbmc7rdJW5+kde0cCAAB4cAAAAAN0AARPbmUsdAADVHdvdAAFVGhyZWU=
[One,, Two, Three]

请注意,这适用于Object的所有implements Serializable,而不仅仅是String[]

作为一种简单的替代方法,您可以在加入数组之前将,替换为\,,然后在拆分后将\,替换为,。这依赖于标准的"转义定界符" CSV使用的模式。但如果用户在输入中的某处输入\,,它将失败,因此不太健壮:YMMV。

public String serializeArray(final String[] data) {
    return Arrays.stream(data)
            .map(s -> s.replace(",", "\\,"))
            .collect(joining(","));
}

public String[] deserializeArray(final String data) {
    return Pattern.compile("(?<!\\\\),").splitAsStream(data)
            .map(s -> s.replace("\\,", ","))
            .toArray(String[]::new);
}

答案 1 :(得分:2)

将其转换为用于此目的的格式,如JSON。使用杰克逊就是这样的:

 ObjectMapper objectMapper = new ObjectMapper();

 String out = objectMapper.writeValueAsString(Arrays.asList(array));

然后回来:

 List<String> strings = (List<String>) objectMapper.readValue(out, List.class);

 String[] array2 = strings.toArray();

答案 2 :(得分:0)

我真的不知道你想做什么,但数组分隔符,在你的字符串中,所以避免这种情况的最简单方法是避免使用默认的数组分隔符构建字符串!像这样:

String[] stringArray = new String[] { "One,", "Two", "Three" };
    StringBuilder string = new StringBuilder();
    string.append("[");
    for (int i = 0; i < stringArray.length; i++) {
        string.append(stringArray[i] + (i == (stringArray.length - 1) ? "" : "; "));
    }
    string.append("]");
    System.out.println(string);
    System.out.println(string.toString().substring(1, string.length() - 1).split("; "));

当然你可以做更多的东西确实使用默认数组分隔符,但这取决于你想做什么,我只选择最简单的方法。