Java 网络中的对象写入
我有一个简单的java服务器和客户端。在服务器中,一个文件被分成几个字节数组块,现在这个字节数组必须通过对象输出流发送。但是如果每次我使用一个新的数组来加载文件数据,这是完美的,但是如果我使用相同的数组(这是必需的,我必须提高内存效率)来加载文件数据,那么客户端每次都会收到相同的(第一个)字节数组 networkUtil读写Java 网络中的对象写入,java,networking,objectinputstream,objectoutputstream,Java,Networking,Objectinputstream,Objectoutputstream,我有一个简单的java服务器和客户端。在服务器中,一个文件被分成几个字节数组块,现在这个字节数组必须通过对象输出流发送。但是如果每次我使用一个新的数组来加载文件数据,这是完美的,但是如果我使用相同的数组(这是必需的,我必须提高内存效率)来加载文件数据,那么客户端每次都会收到相同的(第一个)字节数组 networkUtil读写 public Object read() { Object o = null; try { o=ois.readObject();
public Object read() {
Object o = null;
try {
o=ois.readObject();
} catch (Exception e) {
//System.out.println("Reading Error in network : " + e.toString());
}
return o;
}
public void write(Object o) {
try {
oos.writeObject(o);
} catch (IOException e) {
System.out.println("Writing Error in network : " + e.toString());
}
}
服务器写入部分
public void run() {
try {
//Scanner input=new Scanner(System.in);
byte []b =new byte[1000];
int num=5;
long i=0;
//ObjectOutputStream oosp = null;
for(int j=0;j<num;j++) {
File f=new File("G:\\photography\\DSC01020.JPG");
RandomAccessFile file1=new RandomAccessFile(f,"r");
long l=file1.length();
num=(int)Math.ceil((double)l/(double)1000);
//System.out.println("it is num "+num);
//file1.close();
// RandomAccessFile file=new RandomAccessFile(f,"r");
// byte [] b =new byte[1000];
System.out.println("seeking from "+i+"left "+(l-(j*1000)));
file1.seek(i);
file1.read(b);
file1.close();
System.out.println("it is first "+b[0]+" it is second "+b[1]);
nc.write(b);//network util
//oosp.write(b);
file1.close();
i+=1000;
}
try {
FileOutputStream fos=new FileOutputStream("C:\\Temp\\test.jpg");
byte []a;
for(int j=0;j<225;j++) {
Object o=nc.read();//netwotk util
if(o!= null) {
if(o instanceof Data) {
Data obj=(Data)o;
//System.out.println(obj.getElement());
}
if(o instanceof byte[])
{
//System.out.println("it is byte array");
a=(byte[])o;
System.out.println("it is first "+a[0]+" it is second "+a[1]);
if(j==224)// it is hard coded for this file i have to change this for all file
{
fos.write(a,0,203);
}
else {
fos.write(a);
}
}
}
}
public void run(){
试一试{
//扫描仪输入=新扫描仪(System.in);
字节[]b=新字节[1000];
int num=5;
长i=0;
//ObjectOutputStream oosp=null;
对于(int j=0;j您有内存问题吗?在Java中,未使用的对象和数组是垃圾收集的。请参阅。我不认为每次重新分配都会遇到任何问题
编辑:
因为重新分配是个问题,也许一个ByteBuffer可以解决这个问题
您可以尝试将java.nio与FileChannel和ByteBuffer一起使用。例如,请参阅和。是否存在内存问题?在java中,未使用的对象和数组是垃圾收集的。请参阅。我不认为每次重新分配都会遇到任何问题
编辑:
因为重新分配是个问题,也许一个ByteBuffer可以解决这个问题
您可以尝试将java.nio与FileChannel和ByteBuffer一起使用。例如,请参阅和。@JFPicard如果我想发送像1GB这样的大文件,则不可能每次都重新分配,如果我想分配如此大的内存,JVM将抛出一个错误。@JFPicard您能详细说明一下吗?我应该使用ByteBuffer来加载d吗从文件中获取ata或加载字节数组中的数据,然后用它制作一个Bytebuffer并通过网络发送该Bytebuffer对象。@JFPicard如果我想发送一个像1GB这样的大文件,不可能每次都重新分配,如果我想分配这么大的内存,JVM将抛出一个错误。@JFPicard你能详细说明一下吗?我应该使用Byt吗ebuffer从文件中加载数据或加载字节数组中的数据,然后用它制作一个Bytebuffer并通过网络发送该Bytebuffer对象。