将字节数组转换为字符串,返回字节数组,返回字符串

时间:2016-05-17 10:40:50

标签: java arrays string

我创建了随机字节数组,然后使用String decoded = new String(myByteArray,"ISO-8859-1");将它们转换为字符串,然后将它们写入某个文本文件。

结果是在文件中我有以下形式的行:

[-9, -18, 50, -124, -102]
[39, 112, -117, 5, 109]
[73, 111, 114, 107, -78]

现在我想从文件中读取一行,然后将其转换回字节数组。我用代码

做了这个
byte[] newByteArray = fileLine.getBytes("ISO-8859-1");

然后我将newByteArray打印为带有代码

的字符串
String decoded = new String(myByteArray,"ISO-8859-1");
System.out.println(decoded);

但它打印出来:

[-9,
[39,
[73,

而不是我们想要的,与文件中的行相同。

为什么会发生这种情况,我该如何解决?

写入文件

通过名为MMULogger的类完成:

public class MMULogger 
{
    private static MMULogger instance = null;
    public final static String DEFAULT_FILE_NAME = "log.txt";
    private FileHandler handler;

    private MMULogger() 
    {
        try {
            handler = new FileHandler(DEFAULT_FILE_NAME);
            handler.setFormatter(new OnlyMessageFormatter());
            handler.setLevel(Level.ALL);
        } catch (SecurityException | IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public synchronized void write(String command,Level level)
    {
        LogRecord logRecord = new LogRecord(level,command);
        handler.publish(logRecord);
    }

    public static MMULogger getInstance()
    {
        if(instance == null)
        {
            instance = new MMULogger();
        }
        return instance;
    }

    public class OnlyMessageFormatter extends Formatter
    {
        public OnlyMessageFormatter()
        {
            super();
        }

        @Override
        public String format(final LogRecord record) 
        {
            return record.getMessage()+System.lineSeparator();
        }   
    }
}

方法"写"的实际位置获取字符串"命令" from是另一个叫做process的类,以下几行是相关的

for(i = 0; i < currentCycle.getPages().size();i++)
    {
        String decoded = new String(currentCycle.getData().get(i),"ISO-8859-1");
        MMULogger.getInstance().write("GP:P" + id + " " + currentCycle.getPages().get(i)+" " + decoded, Level.INFO);
    }

其中currentCycle.getData().get(i)是一些byteArray

从文件中读取 阅读是从名为MMUModel的类中完成的,其中包含以下相关行:

public void readData()
    {
        String commandAsString;
        try 
        {
            commandAsString = fr.readLine();
            while(commandAsString != null)
            {


                    byte[] pageContent = commandAsString.getBytes("ISO-8859-1");

                    listOfCommands.add(new GPCommand(pageContent));
                }
                commandAsString = fr.readLine();
            }
        } 

然后我将类GPCommand中的pagecontent作为字符串返回并打印出来。这是您在上面看到的我们想要纠正的部分括号的结果。

3 个答案:

答案 0 :(得分:0)

您可以使用Base64转换将字节转换为字符串,反之亦然

import org.apache.commons.codec.binary.Base64;

你可以做到

byte[] bytedata = Base64.decodeBase64(stringdata);

String stringdata = Base64.encodeBase64String(bytedata);

编辑:使用java.utils.Base64库

将byte []编码为String

Base64.Encoder encoder = java.util.Base64.getEncoder();
String stringdata = encoder.encodeToString(bytedata);

将String解码为byte []

Base64.Decoder decoder = java.util.Base64.getDecoder();
byte[] bytedata = decoder.decode(stringdata);

答案 1 :(得分:0)

您的代码很好,唯一的改进是StandardCharsets.ISO_6659_1而不是"ISO-8859-1"

确定的标志是缺少最终]

所以印刷一定出错了。这可以是格式化其日志记录的记录器。 关于谁守卫守护者的问题。

删除

handler.setFormatter(new OnlyMessageFormatter());

可能您的日志记录错误, record.getMessage()发错了。

应该是这样的:

Logger.getLogger(getClass().getName()).log(Level.INFO, "{0}",
      Arrays.toString(newByteArray));

我猜你没有使用Arrays.toString,你的字节数组被当作参数数组,因此只有消息中填充的第一个字节。虽然为什么[##,

答案 2 :(得分:0)

管理解决它。

Arrays.toString没有问题,也不需要特殊的编码。

问题在于我的括号内有空格,当我分裂时我没注意到它(&#34;&#34;)。无论如何它现在正常工作。谢谢。

相关问题