从用Android编写的文本文件中读取数字值

时间:2013-09-26 13:20:56

标签: java android arrays file io

我需要能够从android中的文件中读取字节。

我看到的任何地方,似乎应该使用FileInputStream来从文件中读取字节,但这不是我想要做的。

我希望能够读取一个文本文件,其中包含(编辑)字节宽度数值的文本表示(/ edit)我要保存到数组中。 我想要转换为字节数组的文本文件示例如下:

0x04 0xF2 0x33 0x21 0xAA

最终文件会更长。使用FileInputStream获取我想要保存长度为5的数组的每个字符的值,以获得上面列出的值。 我希望像下面这样处理数组:

ExampleArray[0] = (byte) 0x04;
ExampleArray[1] = (byte) 0xF2;
ExampleArray[2] = (byte) 0x33;
ExampleArray[3] = (byte) 0x21;
ExampleArray[4] = (byte) 0xAA;

在文本文件上使用FileInputStream将返回字符的ASCII值,而不是我需要写入数组的值。

3 个答案:

答案 0 :(得分:0)

最简单的解决方案是使用FileInputStream.read(byte [] a)方法,该方法将字节从文件传输到字节数组。

答案 1 :(得分:0)

编辑:我似乎误解了要求。所以该文件包含字节的文本表示。

Scanner scanner = new Scanner(new FileInputStream(FILENAME));
String input;
while (scanner.hasNext()) {
    input = scanner.next();
    long number = Long.decode(input);
    // do something with the value
}

旧答案(对于这种情况显然是错误的,但我会将其留给子孙后代):

使用FileInputStreamread(byte[])方法。

FileInputStream in = new FileInoutStream(filename);
byte[] buffer = new byte[BUFFER_SIZE];
int bytesRead = in.read(buffer, 0, buffer.length);

答案 2 :(得分:-1)

您只是将字节存储为文本。决不! 因为0x00可以写为文件中的一个字节,或者作为字符串,在这种情况下(十六进制)占用的空间增加4倍。 如果您需要这样做,请讨论这个决定有多糟糕! 如果您能提供明智的理由,我编辑我的答案。

如果出现以下情况,您只能将内容保存为实际文字:

  • 更容易(不是这样)
  • 它增加了价值(如果文件大小增加超过4(空格数)增加值,那么是)
  • 如果用户应该能够编辑文件(那么你会省略“0x”......)

你可以写这样的字节:

public static void writeBytes(byte[] in, File file, boolean append) throws IOException {
    FileOutputStream fos = null;
    try {
        fos = new FileOutputStream(file, append);
        fos.write(in);
    } finally {
        if (fos != null)
            fos.close();
    }
}

并且如下所示:

public static byte[] readBytes(File file) throws IOException {
    return readBytes(file, (int) file.length());
}

public static byte[] readBytes(File file, int length) throws IOException {
    byte[] content = new byte[length];
    FileInputStream fis = null;

    try {
        fis = new FileInputStream(file);

        while (length > 0)
            length -= fis.read(content);
    } finally {
        if (fis != null)
            fis.close();
    }

    return content;
}

因此:

public static void writeString(String in, File file, String charset, boolean append)
        throws IOException {
    writeBytes(in.getBytes(charset), file, append);
}

public static String readString(File file, String charset) throws IOException {
    return new String(readBytes(file), charset);
}

写和读字符串。

请注意,我不使用try-with-resource构造,因为Android的当前Java源代码级别太低。 :(