read(char[] b,int off,int len) 和read(char[] b)的区别

今天在读取文件里的十六进制数据的时候,采用java的read(char[] b)方法进行读取,结果发现打印的数据和文件里的数据结尾不一致。后来一看还有一个read(char[] b,int off,int len) 方法。就去查了一个它们的区别,正好read(char[] b,int off,int len) 可以解决我的问题。下面是网上参考的资料,很容易懂。

这是read(char cbuf[])方法的源码,可以看出,read方法其实是调用了read(char[] b,int off,int len)这个方法,只不过是将len设为数组的长度

public int read(char cbuf[]) throws IOException {
return read(cbuf, 0, cbuf.length);
}

再看看read(char[] b,int off,int len) 这个方法,源码有些复杂,就不看了,大概的意思是说:将字符读入数组的某一部分,len为要读取的最多字符数,当然可以比他小。

现在举个例子,比如一个文件有1024+40个字节,用read(char cbuf[])第一次往数组中读取了1024个字节,第二次也必须读取1024个字节,因为数

组长度就为1024,但是他只有40个字节了。这个时候前40个字节会被覆盖,而后面的字节还是上一次数组中的。

而read(char[] b,int off,int len) 这个方法就不一样了,第一次他读取了1024个字节,第二次他看见不够,就读取40个字节往数组中,剩下的

空间是空的。

所以我们在平时的读写文件时,尽量使用下面的代码(如果是二进制换为byte数组)

char[] buff=new char[1024];
int i=0;
while((i=reader.read(buff,0,1024))!=-1){
System.out.println(i);
pw.write(buff,0,i);
}
时间: 2025-01-02 15:59:29

read(char[] b,int off,int len) 和read(char[] b)的区别的相关文章

IO--int read(char cbuf[],int off,int len)

1.InputStreamReader Reader与Writer是基于字符的IO操作接口,而InputStreamReader的read方法就是以字符为单位的读方法 /** * Reads characters into a portion of an array. * * @param cbuf Destination buffer * @param offset Offset at which to start storing characters * @param length Maxi

C/C++中各种类型int、long、double、char表示范围(最大最小值)(转)

1 #include<iostream> 2 #include<string> 3 #include <limits> 4 using namespace std; 5 6 int main() 7 { 8 cout << "type: \t\t" << "************size**************"<< endl; 9 cout << "bool: \t

write(byte[] b, int off, int len)

write(byte[] b, int off, int len)就是将数组 b 中的 len 个字节按顺序写入输出流. 所以如果 b 为 null,则抛出 NullPointerException. 如果 off 为负,或 len 为负,又或者 off+len 大于数组 b 的长度,则抛出 IndexOutOfBoundsException. 如果 len 为零,则不写入字节. 否则,首先写入字节 b[off],然后写入字节 b[off+1],依此类推:最后一个写入字节是 b[off+len-

int main(int argc, char * argv[]) 里的异常处理

#import <UIKit/UIKit.h> #import "AppDelegate.h" int main(int argc, char * argv[]) { @autoreleasepool { @try { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } @catch (NSException *exception) { NSLog(@&qu

int main(int argc,char* argv[])详解

argc是命令行总的参数个数     argv[]是argc个参数,其中第0个参数是程序的全名,以后的参数     命令行后面跟的用户输入的参数,比如:     int   main(int   argc,   char*   argv[])     {     int   i;     for   (i   =   0;   i<argc;   i++)     cout<<argv[i]<<endl;     cin>>i;     return   0;  

基于java的InputStream.read(byte[] b,int off,int len)算法学习

public int read(byte[] b, int off, int len) throws IOException 将输入流中最多 len 个数据字节读入字节数组.尝试读取多达 len 字节,但可能读取较少数量.以整数形式返回实际读取的字节数. 在输入数据可用.检测到流的末尾或者抛出异常前,此方法一直阻塞. 如果 b 为 null,则抛出 NullPointerException. 如果 off 为负,或 len 为负,或 off+len 大于数组 b 的长度,则抛出 IndexOut

c语言:输出以下关键字的字节大小及输出一个地址:char,short,int,float,double,long

输出以下关键字的字节大小及输出一个地址: 1. #include<stdio.h> int main() { printf("%d\n",sizeof(char));//1 printf("%d\n", sizeof(short));//2 printf("%d\n", sizeof(int));//4 printf("%d\n", sizeof(float));//4 printf("%d\n"

38&gt;&gt;int main( int argc, char **argv)

1.参数 (有时参数是void) argc是程序运行时参数个数 argv是存储参数的数组,可以用char* argv[],也可以用char **argv. 例如编译一个hello.c的程序 1 #include<stdio.h>  2 int main(int argc,char *argv[])  3 {  4     printf("%d\n",argc);  5     printf("%s\n",argv[0]);  6     /*printf

int、double、boolean、char、float、long、Object等七种数据类型转换成String数据类型 用到的方法是String.valueOf();

//int.double.boolean.char.float.long.Object类型数据转换成String //int类型转换成String类型 int h=123456; String l=String.valueOf(h); System.out.println("int类型转换成String类型:"+l); //double类型转String double a=1.1; String A=String.valueOf(a); System.out.println("