一个由C/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放
4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。
数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。指针可以随时指向任意类型的内存块。
char *p1 = "abc";
char *p2 = "abc";//这里p1和p2指向文字常量区的同一段字符串常量,所以p1==p2为true
cout<<(p1==p2)<<endl;//true
char a[]="abc";
char b[]="abc";//数组a和数组b是在栈区分配的,他们只是内容一样而已,其自身的地址是不一样的,所以a==b为false
cout<<(a==b)<<endl;//false
DataInputStream能以一种与机器无关(当前操作系统等)的方式,直接从地从字节输入流读取JAVA基本类型和String类型的数据,常用于网络传输等(网络传输数据要求与平台无关)常用方法包括
DataOutputStream则能够直接将JAVA基本类型和String类型数据写入到其他的字节输入流。
write(byte[] b, int off, int len)
将指定 byte 数组中从偏移量 off
开始的 len
个字节写入基础输出流。
write(int b)
将指定字节(参数 b
的八个低位)写入基础输出流。
在 java中,所有的值都按照 高位在前的模式写出, 不管使用何种处理器, 这使得java 数据文件独立于平台;
3.1)读入二进制数据: DataInputStream 类实现了DataInput接口, 为了从文件中读取二进制数据, 可以将 DataInputStream与某个字节源进行组合, 如 FileInputStream:
DataInputStream dis = new DataInputStream(new FileInputStream(“employee.dat”));
3.2)写出二进制数据: DataOutputStream dos = new DataOutputStream(new FileOutputStream(“employee.dat”));
- int readInt()
- throws IOException
读取四个输入字节,并返回一个int类型的值。假如a到d是读取第一到第四个字节,则返回的值是:
(((a & 0xff) << 24) | ((b & 0xff) << 16) |
((c & 0xff) << 8) | (d & 0xff))
这个方法适用于读取DataOutput接口的writeInt方法所写的字节数据.
public final void writeInt(int v)
参数
- void readFully(byte[] b)
- throws IOException
从输入流中读取一些字节,并将它们存储到缓冲区数组b。读取的字节数等于b的长度。
此方法阻塞,直到下列条件之一发生:
- b.length字节的输入数据是可用的,在这种情况下,可以保证正常的返回数据。
- 文件结束是被检测的,在这种情况下,EOFException会被抛出。
- I/O错误发生,在这种情况下,IOException会被抛出。
如果b数组为空,会抛出NullPointerException异常。如果b.length是零,那么没有字节被读。否则,第一个字节读取存储到元素b[ 0 ],下一个存储到b[ 1 ],等等。如果从这个方法中抛出一个异常,那么它可能是一些,但不是所有的b数组从输入流读的字节数据都被更新
java.io.DataOuputStream.writeInt(int v) 方法写入一个int值的基础流为四个字节。写入计数器是由4对这种方法的成功调用递增
一个int值写入到输出流
void writeInt(int v);//将一个int值以4-byte值形式写入到输出流中先写高字节.