我创建了随机字节数组,然后使用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作为字符串返回并打印出来。这是您在上面看到的我们想要纠正的部分括号的结果。
答案 0 :(得分:0)
您可以使用Base64转换将字节转换为字符串,反之亦然
用
import org.apache.commons.codec.binary.Base64;
你可以做到
byte[] bytedata = Base64.decodeBase64(stringdata);
和
String stringdata = Base64.encodeBase64String(bytedata);
将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;)。无论如何它现在正常工作。谢谢。