FileInputStream
使用Integer.toHexString的说明.
2222222222222
222222222222222
1111111
1111111111
111111111
11111111111
读取文件内容的方式,如图所示
转:byte 类型 8 位,int 类型 32 位,为了避免数据转换错误,通过 & 0xff 将高 24 位清零
FileInputStream.read() 单字节适合读取 小 文件
FileInputStream.read(byte[] bytes,int star,int size) 字节数组适合读取 大 文件
读取文件最常用的是批量读取int bytes = FileInputStream.read(buf, 0 , buf.length);
FileInputStream文件输入
单字节输入即不用数组。
从in中批量读取字节,放入到buf这个字节数组中, 从第0个位置开始放,最多放buf.length个 返回的是读到字节的个数,fileName为方法的参数
文件输入流FileInputStream
字节流之文件输入流FileInputStream-2
输出16进制时进行与运算0xff的原因:
OxFF的16进行为 :000000FF。任意数与OxFF进行与运算都是取16进制的后两位
运算示例如下:
-127(负数127)的16进制为: FFFFFF81
0xFF的16进制为: 000000FF
则&(与)运算是结果为: 00000081
所以:Integer.toHexStriing(-127 & 0xFF) 的结果为:81。
一次性读不完怎么办
111111
读文件的典型方法
public static void printHexByByteArray(String fileName)throws IOException{ FileInputStream in=new FileInputStream(fileName); byte[] buf=new byte[20*1024]; /**从in中批量读取字节,放入到buf这个字节数组中, 从第0个位置开始放,最多放buf.length个 返回的是读到字节的个数 */ /**int bytes=in.read(buf,o,buf.length);//一次性读完,说明字节数组足够大 int j=1; for(int i=0;i<bytes;i++){ if(buf[i]<=0xf){ System.out.print("0");} System.out.print(Integer.toHexString(buf[i])+" "); if(j++%10==0){ System.out.println();*/ int bytes=0; int j=1; while((bytes=in.read(buf,0,buf.length))!=-1){ for(int i=0;i<bytes;i++){ System.out.print(Integer.toHexString(buf[i] & 0xff)+" ");}}}}}
关于read返回值的问题:
一开始read返回的是读取的字节数;当把内容都读完后,返回的数为-1
举个例子:
例如要读取的文件字节数是100,buf.length为60。
第一次read返回给bytes的是读取的字节数:大小为数组的长度60;
第二次read返回给bytes的还是读取的字节数,但大小为剩下的100-60=40了;
第三次由于到文件末尾,100个字节内容都读完了,read就返回-1给bytes
综上,文件没读完时,read返回的是读取的字节数;文件读完后,read返回的是-1,用于判断文件是否读取完成。
1、byte 类型 8 位,int 类型 32 位,为了避免数据转换错误,通过 & 0xff 将高 24 位清零
2、is.read() 单字节适合读取 小 文件
is.read(byte[] bytes,int star,int size) 字节数组适合读取 大 文件
读取文件最常用的是批量读取int bytes = fis.read(buf, 0 , buf.length);
FileInputStream文件输入
单字节输入即不用数组。
FileInputStream批量读取 long start = System.currentTimeMillis();获得系统时间
// 批量读取,对大文件而言效率高,也是我们最常用的读取方式
public static void printHexByByteArray(String fileName) throws IOException {
FileInputStream in = new FileInputStream(fileName);
byte[] buf = new byte[20 * 1024];
// 从in中批量读取字节,放入到buf这个字节数组中,
// 从0个位置开始放,最多放buf.length个
// 返回的是读到的字节的个数
int bytes = in.read(buf, 0, buf.length);
// 一次性读完,说明字节数组足够大
int j = 1;
for (int i = 0; i < bytes; i++) {
if (buf[i] <= 0xf) {
System.out.println("0");
}
// 将整型b转换成16进制表示的字符串
System.out.print(Integer.toHexString(buf[i]) + " ");
if (j++ % 10 == 0) {
System.out.println();
}
}
int bytes2 = 0, k = 1;
while ((bytes2 = in.read(buf, 0, buf.length)) != -1) {
for (int i = 0; i < bytes2; i++) {
// byte类型为8位,int类型32位,为了避免数据转换错误,通过&0Xff将高24位清零
System.out.print(Integer.toHexString(buf[i] & 0xff) + " ");
if (k++ % 10 == 0) {
System.out.println();
}
}
}
in.close();
}
关于read返回值的问题:
一开始read返回的是读取的字节数;当把内容都读完后,返回的数为-1
举个例子:
例如要读取的文件字节数是100,buf.length为60。
第一次read返回给bytes的是读取的字节数:大小为数组的长度60;
第二次read返回给bytes的还是读取的字节数,但大小为剩下的100-60=40了;
第三次由于到文件末尾,100个字节内容都读完了,read就返回-1给bytes
综上,文件没读完时,read返回的是读取的字节数;文件读完后,read返回的是-1,用于判断文件是否读取完成。
字节流---FileInputStream(文件输入流)---read(byte[] b, int off, int len)
public static void printHexByByteArray(String fileName) throws IOException{ FileInputStream in = new FileInputStream(fileName); byte[] buf = new byte[20*1024]; /*从in中批量读取字节,放入到buf这个字节数组中, * 从第0个位置开始放,最多放buf.length个 * 返回的是读到的字节的个数 */ /*int bytes = in.read(buf,0,buf.length);//一次性读完,说明字节数组足够大 int j = 1; for(int i=0;i<bytes;i++){ if(buf[i]<=0xf){ System.out.print("0"); } System.out.print(Integer.toHexString(buf[i])+" "); if(j++%10==0){ System.out.println(); } }*/ int bytes = 0; int j = 1; while((bytes = in.read(buf,0,buf.length))!=-1){ for(int i = 0;i<bytes;i++){ if(buf[i]<=0xf){ System.out.print("0"); } System.out.print(Integer.toHexString(buf[i]&0xff)+" "); if(j++%10==0){ System.out.println(); } } } }
FileInputStream类 的read(byte[]) 或read(byte[],0, buffer.length)
返回的是读到的字节个数
read(buf, 0, buf.length)
4
3