用Java扫描文件中的Char

时间:2012-03-14 11:37:15

标签: java c file-io java.util.scanner

我正在处理的java项目要求我编写这个C代码的java等价物:

void read_hex_char(char *filename, unsigned char *image)
{
    int     i;
    FILE   *ff;
    short  tmp_short;
    ff = fopen(filename, "r");
    for (i = 0; i < 100; i++)
    {
        fscanf(ff, "%hx", &tmp_short);
        image[i] = tmp_short;
    }
    fclose(ff);
}

我已经编写了这个Java代码。

void read_hex_char(String filename, char[] image) throws IOException
{
    Scanner s=new Scanner(new BufferedReader(new FileReader(filename)));
    for(int i=0;i<100;i++)
    {
        image[i]=s.nextShort();
    }
    s.close();
 }

这段代码是否正确?如果不是,应该做什么更正

3 个答案:

答案 0 :(得分:1)

我会使用FileInputStream并读取字节到字节(short只是两个字节,char比“http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html更复杂”。我项目中的简单字节提取代码:

public static byte[] readFile(File file) throws IOException {
    FileInputStream in = new FileInputStream(file);
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    int ch = -1;
    while ((ch = in.read()) != -1)
        bos.write(ch);
    return bos.toByteArray();
}

对于您的示例,最简单的方法是找到一些示例:在其上运行C函数,然后运行java函数并比较结果。它应该给你信息。

答案 1 :(得分:0)

请记住,java char类型非常智能(比字节更智能)并表示unicode字符(并且读取器类根据实际的语言环境和字符集设置执行处理输入字节流为unicode字符,可能解码或修改字节) 。从你的来源我想它只是你想要的实际字节数 内存缓冲区。这里有很好的解释:

Convert InputStream to byte array in Java

答案 2 :(得分:0)

对于解析十六进制值,您可以将Short.parseShort(String s,int radix)与基数16一起使用。在Java中,charshort略有不同,因此如果您打算执行位图操作,{{ 1}}可能是更好的类型。但是,请注意Java没有无符号类型,这可能会使某些操作可能在图像处理(如按位操作)中使用。