我正在使用write()方法来写入外部存储器的文件。此方法仅接受byte []作为输入。我尝试传递一个String,然后收到一条错误消息(“FileOutputStream类型中的方法write(int)不适用于参数String”)。如果我传递一个int,我不会得到错误,但在文件中没有写任何内容。我从调用getNumSentPackets()得到的值是一个int,我需要将它转换为byte []。我一直在看这里已经回答的其他问题,我已经尝试了ByteBuffer选项,但是我在文件中得到的结果不是我想要的,这意味着,我没有得到发送数据包的数量。请问有人帮帮我吗?
这是我的代码:
public void createFile(String name) {
try {
String filename = name;
File myFile = new File(Environment.getExternalStorageDirectory(), filename);
if (!myFile.exists())
myFile.createNewFile();
String title = "FLOODING RESULTS FILE\n\n";
String sent = "Number of sent packets\n";
FileOutputStream fos;
byte[] data = title.getBytes();
byte[] intSent = sent.getBytes();
int numSent = mSender.getNumSentPackets();
byte[] numSentBytes = ByteBuffer.allocate(10).putInt(numSent).array();
try{
fos = new FileOutputStream(myFile);
fos.write(data);
fos.write(intSent);
fos.write(numSentBytes);
fos.flush();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static int getNumSentPackets() {
return nSentPackets;
}
预期的输出文件如下:
洪水结果文件
发送的数据包数量200
200只是一个例子,这意味着我希望看到一个数字与发送的数据包总数相对应。
提前谢谢。
答案 0 :(得分:1)
由于我是一个懒惰的开发人员,我喜欢使用我选择的语言中的现有设施,例如,对于java,PrintWriter。
public void createFile(String filename) {
try {
File myFile = new File(Environment.getExternalStorageDirectory(), filename);
PrintWriter out = new PrintWriter(myFile); // this will create the file if necessary
out.println("FLOODING RESULTS FILE");
out.println();
out.print("Number of sent packets ");
out.println(mSender.getNumSentPackets());
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
这比您当前的方法更容易阅读和维护,看起来更加惯用。
答案 1 :(得分:0)
ByteBuffer.allocate(capacity).putInt(yourInt).array();
答案 2 :(得分:0)
“200”的文本表示要求您编写3个字符。所有文件最后只是一堆字节,因此需要从字符到某个字节值的映射。假设ASCII(*)要写入文件的数据为
// '2','0','0'
byte[] textVersion = { 50, 48, 48 }
另一方面, int
是一个32位数值,即有4个字节,200等于
byte[] intVersion = { 0, 0, 0, 200 }
使用ByteBuffer
时,你会得到这个。如果您将其写入文件,并且文本查看器试图显示如果您幸运,它将显示◻◻◻Č
之类的内容。 0
实际上是一个不可打印的控制字符,因此在打印时经常会被跳过,或者用像盒子这样奇怪的字符替换。 200在Windows-CP1250中等同于Č
。当解释为UTF8时,它没有任何意义 - 它是2字节序列的开始,因此需要下一个2字节来确定要显示的字符。
您可以使用
String.valueOf(200).getBytes( /* you should specify which encoding to use here */ );
首先创建"200"
字符串,然后返回这3个字符所需的字节。
然而,您应该使用基于Java的基于字符的IO工具:众多(和令人困惑的)Reader
& Writer
实施。它们全部(* ^ 2)在最后包装InputStream
或OutputStream
,并为您进行文本到字节转换。
PrintWriter
可能是最方便使用但不是没有缺陷:https://stackoverflow.com/a/15803472/995891
应避免使用FileWriter
,因为您无法指定编码
更长的替代路线是
BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream(file), encoding));
writer.write("Hello ");
writer.write(String.valueOf(200));
writer.newLine();
(*)大多数编码与前127个字符的ASCII兼容,基本上涵盖了普通的英文文本。
(* ^ 2)没有强制Writer
将字符输出到流中,例如StringWriter
。但它们主要以这种方式使用。