Java 逐字节读取二进制文件
我一直在研究一个java问题,但没有成功。我在StackOverflow上读过一大堆类似的问题,但解决方案似乎并不像预期的那样有效 我正试图逐字节读取二进制文件 我用过: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 {
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;
}