java读写二进制文件的解决方法
package com.geoway.pad.common;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
public interface Writerable {
//write
public void write(DataOutput data) throws IOException;
//read
public void read(DataInput di) throws IOException;
}
package com.geoway.pad.common;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInput;
import java.io.DataInputStream;
import java.io.DataOutput;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.UUID;
public class UserWriter implements Writerable{
//getter setter methods
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean isAdministrator() {
return administrator;
}
public void setAdministrator(boolean administrator) {
this.administrator = administrator;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public void setPassword(String password) {
this.password = password;
}
public String getPassword() {
return password;
}
public void setText(String text) {
this.text = text;
}
public String getText() {
return text;
}
public void setImage(byte[] image) {
this.image = image;
}
public byte[] getImage() {
return image;
};
//private fields
private int number;
private String id;
private int age;
private boolean administrator;
private String userName;
private String password;
private String text;
private byte[] image;
@Override
public void write(DataOutput data) throws IOException {
data.writeInt(number);
data.writeUTF(id);
data.writeInt(age);
data.writeBoolean(administrator);
data.writeUTF(userName);
data.writeUTF(password);
data.writeUTF(text);
data.write(image);
}
@Override
public void read(DataInput di) throws IOException {
this.number=di.readInt();
this.id=di.readUTF();
this.age=di.readInt();
this.administrator=di.readBoolean();
this.userName=di.readUTF();
this.password=di.readUTF();
this.text=di.readUTF();
//读取图片
this.image=new byte[2048];
try{
di.readFully(this.image);
}catch(Exception e){
System.out.println(e.toString());
}
}
public static byte[] in2byte(InputStream is) throws IOException{
byte[] bs= new byte[1024];
ByteArrayOutputStream bos = new ByteArrayOutputStream();
int len = -1;
while((len=is.read(bs))!=-1){
bos.write(bs,0,len);
}
bs = bos.toByteArray() ;
return bs ;
}
public static void copy(InputStream in, OutputStream out) throws IOException {
byte[] buf = new byte[1024];
while (true) {
int len = in.read(buf);
if (len < 0) break;
out.write(buf, 0, len);
}
}
public static void main(String[] args) throws FileNotFoundException, IOException{
UserWriter user=new UserWriter();
user.setUserName("likehua");
user.setPassword("password");
user.setId(UUID.randomUUID().toString());
user.setNumber(123);
user.setAdministrator(false);
//加一段文字
user.setText("做一个天气预报,可以保存要显示的城市名称 在增加城市页面,我的rms关键操作如下(其中SetCanvas.cityName是一个Vector,用来保存城市名,在执行此段代码之前,我已经把新增加的城市名添加进了这个Vector ");
//传入一张图片
user.setImage(in2byte(new FileInputStream("c:\\1.jpg")));
user.write(new DataOutputStream(new FileOutputStream("c:\\user.data")));
System.out.println("完毕");
System.out.println("....读取开始...");
UserWriter u=new UserWriter();
u.read(new DataInputStream(new FileInputStream("c:\\user.data")));
System.out.println(u.getUserName());
System.out.println(u.getPassword());
System.out.println(u.isAdministrator());
System.out.println(u.getText());
//拿出图片
copy(new ByteArrayInputStream(u.getImage()), new FileOutputStream("c:\\copy.jpg"));
}
}
本例只是本人测试DataOutput和DataInput接口时写的,并没有在项目中使用,也不知道在项目中这样用会不会有什么问题。