Java 逐字节读取二进制文件

Java 逐字节读取二进制文件,java,io,binaryfiles,Java,Io,Binaryfiles,我一直在研究一个java问题,但没有成功。我在StackOverflow上读过一大堆类似的问题,但解决方案似乎并不像预期的那样有效 我正试图逐字节读取二进制文件 我用过: while ((data = inputStream.read()) != -1) 循环 for (int i = 0; i < bFile.length; i++) { 这里的字节值表示它正在读取的字节的整数 哪里出了什么问题?这是一个简单的例子: public class CopyBytes {

我一直在研究一个java问题,但没有成功。我在StackOverflow上读过一大堆类似的问题,但解决方案似乎并不像预期的那样有效

我正试图逐字节读取二进制文件

我用过:

while ((data = inputStream.read()) != -1) 
循环

for (int i = 0; i < bFile.length; i++) {
这里的字节值表示它正在读取的字节的整数

哪里出了什么问题?

这是一个简单的例子:

   public class CopyBytes {
    public static void main(String[] args) throws IOException {

        FileInputStream in = null;
        FileOutputStream out = null;

        try {
            in = new FileInputStream("xanadu.txt");
            out = new FileOutputStream("outagain.txt");
            int c;

            while ((c = in.read()) != -1) {
                out.write(c);
            }
        } finally {
            if (in != null) {
                in.close();
            }
            if (out != null) {
                out.close();
            }
        }
    }
}

如果要读取文本(字符)-使用读卡器,如果要读取字节-使用流

为什么不使用Apache Commons:

byte[] bytes = IOUtils.toByteArray(inputStream);
然后可以将其转换为字符:

String str = new String(bytes); 
Char[] chars = str.toCharArray();
或者像你那样:

char[] charArray = Character.toChars(bytes);
要反序列化对象,请执行以下操作:

List<Object> results = new ArrayList<Object>();
FileInputStream fis = new FileInputStream("your_file.dat");
ObjectInputStream ois = new ObjectInputStream(fis);

try {
    while (true) {
        results.add(ois.readObject());
    }
} catch (OptionalDataException e) {
    if (!e.eof) throw e;
} finally {
    ois.close();
}
List results=new ArrayList();
FileInputStream fis=新的FileInputStream(“your_file.dat”);
ObjectInputStream ois=新ObjectInputStream(fis);
试一试{
while(true){
add(ois.readObject());
}
}捕获(可选数据异常e){
如果(!e.eof)抛出e;
}最后{
ois.close();
}

由于java 7不需要逐字节读取,因此在中有两个实用程序函数:

您遇到的问题可能与java中笨拙的固定大小数组有关,
char[]
仍然不是
字符串

对于二进制使用,由于您似乎正在读取序列化数据,您可能希望转储文件:

int i = 0;
int data;
while ((data = inputStream.read()) != -1) {
    char ch = 32 <= data && data < 127 ? (char) data : ' ';
    System.out.println("[%06d] %02x %c%n", i, data, ch);
    ++i;
}
inti=0;
int数据;
而((data=inputStream.read())!=-1){
字符ch=32编辑:
对数组大小使用file.length(),并生成一个字节数组。然后是inputstream.read(b)。

再次编辑:如果需要字符,请使用inputstreamreader(fileinputstream(file),charset),它甚至还带有字符集。

请提供预期结果和实际结果。预期结果是57个空格…预期结果是整数值。我认为符号显示有问题,在不转换为字符的情况下写入字节。我使用了这个示例,并在我的帖子中提到了while循环。仍然得到空白输出。你明白吗d Outreach.txt是输出吗?是的,我修改了代码,只打印输出,不写入文件。请尝试读取另一个文件。可能您的文件一开始包含服务符号,也可能您看不到这些符号。请尝试计算执行了多少次循环迭代谢谢,但输出为空。@alwynmalan您确定要执行吗e提供文件的正确路径,并且文件不是空的?是的,如果找不到文件,我会抛出异常。它是一个.dat文件,这可能是问题吗?内容与我的原始帖子一样。包含序列化对象是否要反序列化对象?如果我要逐字节读取文件,是否应该反序列化?您是指数据位置,十六进制值和字符值,对吗?是%d=数字,%x=十六进制数字,%c字符。
Path path = Paths.get("C:/temp/test.txt");

// Load as binary:
byte[] bytes = Files.readAllBytes(path);
String asText = new String(bytes, StandardCharset.ISO_8859_1);

// Load as text, with some Charset:
List<String> lines = Files.readAllLines(path, StandardCharsets.ISO_8859_1);
int fileLength = (int) path.size();
char[] chars = new char[fileLength];
int i = 0;
int data;
while ((data = inputStream.read()) != -1) {
    chars[i] = (char) data; // data actually being a byte
    ++i;
}
inputStream.close();

String text = new String(chars);

System.out.println(Arrays.toString(chars));
int i = 0;
int data;
while ((data = inputStream.read()) != -1) {
    char ch = 32 <= data && data < 127 ? (char) data : ' ';
    System.out.println("[%06d] %02x %c%n", i, data, ch);
    ++i;
}