java中什么是二进制文件,什么是字节码文件
大家好,如果您还对java中什么是二进制文件不太了解,没有关系,今天就由本站为大家分享java中什么是二进制文件的知识,包括什么是字节码文件的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!
怎样用Java读写二进制文件
import java.util.*;
import java.io.*;
class SmallFile{
static final int HEADLEN= 24;//头总长度
byte[] fileName= new byte[16];//列表文件名1:长度128想把它读到char[]里它的编码方式不是Unicode。在不确定编码方式的时候,最好直接用byte[]来存放
int offset;//列表文件地址1:长度32想把它读到int里
int length=-1;//列表文件长度1:长度32想把它读到int里
byte[] content;
public SmallFile(){
}
public SmallFile(byte[] fn, byte[] content){
Arrays.fill(fileName,(byte) 0);
if(fn!= null){
if(fn.length<= 16){
System.arraycopy(fn, 0, fileName, 0, fn.length);
}
else{
System.arraycopy(fn, 0, fileName, 0, 16);
}
}
this.content= content;
if(content!= null){
this.length= content.length;
}
else{
this.length=-1;
}
}
}
public class ReadBinary{
static final int HEADLEN= 8;//头总长度
private String filename;
private byte[] filehead= new byte[4];//文件头:长度32想把它读到char[]里它的编码方式不是Unicode
private int filecount=-1;//列表长度:长度32想把它读到int里假设他是3就会有3个列表文件名
private List<SmallFile> files= null;
public void setFilehead(byte[] fh){
if(fh== null)
return;
Arrays.fill(filehead,(byte) 0);
if(fh.length<= 4){
System.arraycopy(fh, 0, filehead, 0, fh.length);
}
else{
System.arraycopy(fh, 0, filehead, 0, 4);
}
}
public ReadBinary(String filename){
try{
readFromFile(filename);
}
catch(Exception ex){
System.out.println(ex.getMessage());
System.out.println("在载入数据文件时失败,因此视同为新建一个数据文件!");
this.filename= filename;
Arrays.fill(filehead,(byte) 0);
filecount= 0;
files= new ArrayList<SmallFile>();
}
}
public void readFromFile(String filename) throws Exception{
BufferedInputStream bin= new BufferedInputStream(new FileInputStream(
filename));
this.filename= filename;
DataInputStream in= new DataInputStream(bin);
in.read(filehead);//文件头:长度32想把它读到char[]里它的编码方式不是Unicode
filecount= in.readInt();//列表长度:长度32想把它读到int里假设他是3就会有3个列表文件名
if(files== null){
files= new ArrayList<SmallFile>();
}
else{
files.clear();
}
for(int i= 0; i< filecount; i++){
SmallFile file= new SmallFile();
in.read(file.fileName);
file.offset= in.readInt();//列表文件地址1:长度32想把它读到int里
file.length= in.readInt();//列表文件长度1:长度32想把它读到int里
files.add(file);
}
}
public void writeToFile() throws Exception{
String temp= filename+".tmp";//临时文件
boolean exists= false;
RandomAccessFile raf= null;
try{
raf= new RandomAccessFile(filename,"r");//文件存在则从文件读入
exists= true;
}
catch(Exception ex){
System.out.println("文件不存在,因此启用内存写入模式");
}
if(filecount!= files.size()){
throw new Exception("怪事,居然不相同??");
}
DataOutputStream out= new DataOutputStream(new BufferedOutputStream(new
FileOutputStream(temp)));
//1、写总文件头
out.write(filehead);
out.writeInt(filecount);
//2、写列表头
int sumlength= 0;
for(int i= 0; i< files.size(); i++){
SmallFile file= files.get(i);
out.write(file.fileName);
if(file.length< 0){
throw new Exception("怪事,文件长度怎么可能小于0?");
}
else{
out.writeInt(ReadBinary.HEADLEN+ SmallFile.HEADLEN* filecount+
sumlength);
sumlength+= file.length;
out.writeInt(file.length);
}
}
//3、写文件内容
for(int i= 0; i< files.size(); i++){
SmallFile file= files.get(i);
if(file.content!= null&&(file.length== file.content.length)){
out.write(file.content);
}
else if(exists){
raf.seek(file.offset);
byte[] b= new byte[file.length];
raf.read(b);
System.out.println("b:"+ new String(b));
out.write(b);
}
else{
throw new Exception("怪事,又不能从内存读,又不能从文件读。这活没法干了!");
}
}
out.close();
if(raf!= null){
raf.close();
raf= null;
}
System.gc();
//把原先的文件删除
File f= new File(filename);
f.delete();
//再把临时文件改名到正式文件
File f2= new File(temp);
f2.renameTo(f);
}
public void addFile(SmallFile file){
if(files!= null){
filecount++;
files.add(file);
}
}
public static void test1(){
ReadBinary rb= new ReadBinary("f:\\temp\\rb.dat");
rb.setFilehead("HEAD1234567890122222222222222222".getBytes());
SmallFile f= new SmallFile("第1个文件".getBytes(),"第1个文件的内容".getBytes());
rb.addFile(f);
try{
rb.writeToFile();
}
catch(Exception ex){
ex.printStackTrace();
}
}
public static void test2(){
ReadBinary rb= new ReadBinary("f:\\temp\\rb.dat");
rb.setFilehead("HEA".getBytes());
SmallFile f= new SmallFile("第2个文件".getBytes(),"第2个文件的内容".getBytes());
rb.addFile(f);
try{
rb.writeToFile();
}
catch(Exception ex){
ex.printStackTrace();
}
}
public static void main(String[] args){
//test1();
test2();
}
}
二进制文件与文本文件的区别
在定义和存取方式上二进制文件与文本文件存在区别。
1、定义上的区别
文本文件:文本文件是一种计算机文件,它是一种典型的顺序文件,其文件的逻辑结构又属于流式文件。简单的说,文本文件是基于字符编码的文件,常见的编码有ASCII编码,UNICODE编码等等。
二进制文件:是基于值编码的文件,你可以根据具体应用,指定某个值是什么意思(这样一个过程,可以看作是自定义编码)。用户一般不能直接读懂它们,只有通过相应的软件才能将其显示出来。二进制文件一般是可执行程序、图形、图像、声音等等。
从上面可以看出文本文件与二进制文件的区别并不是物理上的,而是逻辑上的。这两者只是在编码层次上有差异,文本文件基本上是定长编码的(也有非定长的编码如UTF-8)。而二进制文件则可看成是变长编码,因为是值编码,多少个比特代表一个值,完全由你决定。
2、存储方式上的区别
文本工具打开一个文件,首先读取文件物理上所对应的二进制比特流,然后按照所选择的解码方式来解释这个流,然后将解释结果显示出来。
一般来说,你选取的解码方式会是ASCII码形式(ASCII码的一个字符是8个比特),接下来,它8个比特8个比特地来解释这个文件流。
记事本无论打开什么文件都按既定的字符编码工作(如ASCII码),所以当他打开二进制文件时,出现乱码也是很必然的一件事情了,解码和译码不对应。
文本文件的存储与其读取基本上是个逆过程。而二进制文件的存取与文本文件的存取差不多,只是编/解码方式不同而已。
二进制文件就是把内存中的数据按其在内存中存储的形式原样输出到磁盘中存放,即存放的是数据的原形式。文本文件是把数据的终端形式的二进制数据输出到磁盘上存放,即存放的是数据的终端形式
扩展资料
文本文件和二进制文件的优缺点:
一般认为,文本文件编码基于字符定长,译码容易些;二进制文件编码是变长的,所以它灵活,存储利用率要高些,译码难一些(不同的二进制文件格式,有不同的译码方式)。
关于空间利用率,想想看,二进制文件甚至可以用一个比特来代表一个意思(位操作),而文本文件任何一个意思至少是一个字符.
在windows下,文本文件不一定是以ASCII来存贮的,因为ASCII码只能表示128的标识,你打开一个txt文档,然后另存为,有个选项是编码,可以选择存贮格式,一般来说UTF-8编码格式兼容性要好一些.而二进制用的计算机原始语言,不存在兼容性。
存储方式的区别:
如果存储的是字符数据,无论采用文本文件还是二进制文件都是没有任何区别的。
如果存储的是非字符数据,又要看我们使用的情况来决定:
1、如果是需要频繁的保存和访问数据,那么应该采取二进制文件进行存放,这样可以节省存储空间和转换时间。
2、如果需要频繁的向终端显示数据或从终端读入数据,那么应该采用文本文件进行存放,这样可以节省转换时间。
参考资料来源:百度百科-文本文件
参考资料来源:百度百科-二进制文件
什么是字节码文件
字节码文件是经过编译器预处理过的一种文件,是JAVA的执行文件存在形式,
Java源程序(.java)要先编译成与平台无关的字节码文件(.class),然后字节码文件再解释成机器码运行。解释是通过Java虚拟机来执行的。
它本身是二进制文件,但是不可以被系统直接执行,而是需要虚拟机解释执行,由于被预处理过,所以比一般的解释代码要快,但是仍然会比系统直接执行的慢。
扩展资料:
在计算机中,数据只用0和1两种表现形式,(这里只表示一个数据点,不是数字),一个0或者1占一个“位”,而系统中规定8个位为一个字节,用来表示常用的256个字母、符号、控制标记,其中用一个位来进行数据校验,其他七个位用来记录数据。
按计算机中的规定,一个英文的字符占用一个字节,(如,."':;avcAVC都占用一个字节),而一个汉字以及汉字的标点符号、字符都占用两个字节,(如,。“”:;AVCavc他们就得占用两个字节)。
另外,他们是没有办法比较的,只能将一个字符占用一个字节,N个字符占用N个字节。
K是千 M是兆 G是吉咖 T是太拉 8bit(位)=1Byte(字节) 1024Byte(字节)=1KB 1024KB=1MB 1024MB=1GB 1024GB=1TB 1024TB=PB 1024PB=1EB 1024EB=1ZB 1024ZB=1YB 1024YB=1BB。
目前最大的计量单位是1BB(Brontobyte)= 1024 YB=10^27。
参考资料来源:百度百科-字节码
END,本文到此结束,如果可以帮助到大家,还望关注本站哦!