标签: objectoutputstream

对于Android平台上的蓝牙套接字,无法使用InputStream创建ObjectInputStream

我正在为Android手机编写多人游戏.通过蓝牙进行通信.我已设法使用输入/输出流将字节从一个电话发送到另一个电话.因为我需要能够传输我想要的对象流的对象.但是,当我尝试使用我的流创建一个Objectstream时,我的程序挂起了指令.

public class ConnectedThread extends Thread {
private static final String TAG = "Connected Thread";
private final BluetoothSocket mmSocket;
private final InputStream mmInStream;
private final OutputStream mmOutStream;
private Handler mHandler;
private ObjectInputStream ois;
private ObjectOutputStream oos;

public ConnectedThread(BluetoothSocket socket,Handler h) {
    mmSocket = socket;
    mHandler = h;

    InputStream tmpIn = null;
    OutputStream tmpOut = null;

    // Get the input and output streams, using temp objects because
    // member streams are final
    try {
        tmpIn = socket.getInputStream();
        tmpOut = socket.getOutputStream();
    } …
Run Code Online (Sandbox Code Playgroud)

java android bluetooth objectoutputstream objectinputstream

8
推荐指数
1
解决办法
6946
查看次数

将BitSet写入java中的文件

我有一个BitSet并希望将其写入文件 - 我遇到了使用writeObject方法使用ObjectOutputStream的解决方案.

我查看了java API中的ObjectOutputStream,看到你可以编写其他东西(byte,int,short等)

我试着检查一下这个类,所以我尝试使用以下代码将一个字节写入文件,但结果给了我一个7字节而不是1字节的文件

我的问题是文件中的前6个字节是什么?他们为什么在那里?

我的问题与BitSet有关,因为我不想开始将大量数据写入文件,并意识到我在文件中插入了随机字节而不知道它们是什么.

这是代码:

    byte[] bt = new byte[]{'A'};
    File outFile = new File("testOut.txt");
    FileOutputStream fos = new FileOutputStream(outFile);
    ObjectOutputStream oos = new ObjectOutputStream(fos);
    oos.write(bt);
    oos.close();
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助

阿夫纳

java objectoutputstream bitset

7
推荐指数
1
解决办法
5830
查看次数

Android Socket + ObjectOutputStream无法正常工作

大家好.我正在开发一个客户端/服务器程序,其中客户端是一个Android设备.服务器有一个侦听器类,用于从输入流中读取对象.我为另一个通过本地网络发送小对象的COMPUTER创建了一个客户端软件.计算机到计算机工作得很好,我读取对象并打印内容.但是,移植到android 的SAME代码(我重写它以防万一)不起作用.我构造了一个可序列化的对象(ANY对象),并通过ObjectOutputStream发送它.我在计算机上运行的服务器确实连接到设备,但它给了我一个ClassNotFound异常,即使我正在打印对象(具有toString).正如我所说,在另一个COMPUTER(作为.jar文件)上运行的相同代码完全正常.

这是一个非常奇怪的部分,如果我发送一个布尔或字符串(从设备)它的工作....它只是我的"自定义"对象,不.我认为这适用于任何"标准"java对象.

如果你发现错误,请记住代码确实有效,但只能从另一台计算机到我的计算机......而不是Android设备到计算机.如果你仍然发现另一个明显的错误,那真棒:)

ANDROID计划:

package WaitDroid.Main;

import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class main extends Activity {
/** Called when the activity is first created. */
private Button a;
private TextView x;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    this.a = (Button) this.findViewById(R.id.Send_Order);
    this.x = (TextView) this.findViewById(R.id.TextView1);
    this.a.setOnClickListener(new OnClickListener()
    {

        @Override
        public void onClick(View arg0)
        {
            sendMenu();
        }
    });
}

private …
Run Code Online (Sandbox Code Playgroud)

java sockets android objectoutputstream classnotfoundexception

7
推荐指数
1
解决办法
6298
查看次数

writeUTF和writeChars有什么区别?

writeUTF和writeChars有什么区别?(ObjectOutputStream的方法)此外,我还没有在ObjectInputStream中找到相应的readChars.

java io objectoutputstream

7
推荐指数
1
解决办法
5659
查看次数

从随机访问文件中读取对象

我使用 Java 的 FileChannel 类编写了一个文件,该类使用 RandomAccessFiles。我在文件的不同位置写入了对象。这些物体大小不一,但都属于同一类别。我使用以下想法编写了对象:

ByteArrayOutputStream bos= new ByteArrayOutputStream();
        ObjectOutput out = new ObjectOutputStream(bos);
        out.writeObject(r);
        byte[] recordBytes= bos.toByteArray();

    ByteBuffer rbb= ByteBuffer.wrap(recordBytes);

    while(rbb.hasRemaining()) {
        fileChannel.write(rbb);
    }
Run Code Online (Sandbox Code Playgroud)

Run Code Online (Sandbox Code Playgroud)

现在我想读取这样的文件。我不想指定要读取的字节数。我希望能够使用对象输入流直接读取对象。如何实现这一目标?

必须使用随机访问文件,因为我需要写入文件中的不同位置。我还在一个单独的数据结构中记录对象被写入的位置。

java filechannel objectoutputstream

6
推荐指数
1
解决办法
1万
查看次数

如何通过java套接字发送Json对象?

你是如何通过java中的ObjectOutputStream类通过套接字发送Json对象的,这是我到目前为止所得到的

    s = new Socket("192.168.0.100", 7777);
    ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());
    JSONObject object = new JSONObject();
    object.put("type", "CONNECT");
    out.writeObject(object);
Run Code Online (Sandbox Code Playgroud)

但这会给java.io.streamcorruptedexception异常提出任何建议吗?

java sockets json objectoutputstream

6
推荐指数
1
解决办法
3万
查看次数

来自文件的ObjectInputStream导致内存泄漏

我有一个巨大的文件,其中包含ObjectOutputStream一个接一个地写入的对象列表.

for (Object obj : currentList){
    oos.writeUnshared(obj);
}
Run Code Online (Sandbox Code Playgroud)

现在我想使用ObjectInputStream读取此文件.但是,我需要同时读取多个文件,因此我无法将整个文件读入内存.但是,使用ObjectInputStream会导致堆内存不足错误.从我读到的,这是因为ObjectInputStream有内存泄漏并且即使在返回它们之后也维护对read对象的引用.

我如何要求ObjectInputStream不保持其读取的引用?

java memory-leaks objectoutputstream objectinputstream

6
推荐指数
1
解决办法
2199
查看次数

什么时候使用 ObjectInputStream.readUnshared() 和 .readObject() ?

Java ObjectInputStream中有两个类似的方法:

读取未共享()

读取对象()

文档指出:

public Object readUnshared() throws IOException, ClassNotFoundException

从 ObjectInputStream 读取“非共享”对象。此方法与 readObject 相同,只不过它阻止对 readObject 和 readUnshared 的后续调用返回对通过此调用获得的反序列化实例的其他引用。具体来说:

如果调用 readUnshared 来反序列化反向引用(之前已写入流的对象的流表示形式),则会抛出 ObjectStreamException。

如果 readUnshared 成功返回,则任何后续尝试反序列化对 readUnshared 反序列化的流句柄的反向引用都将导致抛出 ObjectStreamException。

通过 readUnshared 反序列化对象会使与返回的对象关联的流句柄无效。请注意,这本身并不总是保证 readUnshared 返回的引用是唯一的;反序列化对象可以定义一个 readResolve 方法,该方法返回对其他方可见的对象,或者 readUnshared 可以返回可在流中的其他位置或通过外部方式获取的 Class 对象或枚举常量。如果反序列化对象定义了 readResolve 方法并且调用该方法返回一个数组,则 readUnshared 返回该数组的浅表克隆;这保证了返回的数组对象是唯一的,并且无法通过对 ObjectInputStream 调用 readObject 或 readUnshared 再次获取,即使底层数据流已被操作。

重写此方法的 ObjectInputStream 子类只能在拥有“enableSubclassImplementation”SerializedPermission 的安全上下文中构造;任何在没有此权限的情况下实例化此类子类的尝试都将导致抛出 SecurityException。

但我想知道是否有人在现实生活中对此有.readUnshared()用途.readObject()

java oracle objectoutputstream objectinputstream java-7

6
推荐指数
1
解决办法
4668
查看次数

java ObjectOutputStream 中的开销?

我对 ObjectOutputStream 的行为感到困惑。写入数据时似乎有 9 个字节的开销。考虑下面的代码:

float[] speeds = new float[96];
float[] flows = new float[96];

//.. do some stuff here to fill the arrays with data

ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos=null;
try {
    oos = new ObjectOutputStream(baos);
    oos.writeInt(speeds.length);
    for(int i=0;i<speeds.length;i++) {
        oos.writeFloat(speeds[i]);
    }
    for(int i=0;i<flows.length;i++) {
        oos.writeFloat(flows[i]);
    }
    oos.flush();
} catch (IOException e) {
    e.printStackTrace();
} finally {
    try {
        if(oos!=null) {
            oos.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

byte[] array = baos.toByteArray();
Run Code Online (Sandbox Code Playgroud)

数组的长度总是 781,而我希望它是 …

java serialization bytearray objectoutputstream

5
推荐指数
1
解决办法
3409
查看次数

每次使用后是否应该关闭流?

我目前正在为游戏开发 UDP 服务器。在此服务器中,使用 aByteArrayInputStreamObjectInputStreamevery tick 将序列化字节转换为对象。为流创建一个变量并在程序关闭时关闭它们一次是否更有效?

像这样:

class Main {
private static ByteArrayInputStream byteIn;
private static ObjectInputStream objectIn;

public static void main(String[] args) {
    while(true){
      receive();
    }
    //when program is done call close();
}

 public static void receive(){
     byteIn = new ByteArrayInputStream();
     objectIn = new ObjectInputStream(new BufferedInputStream(byteIn));
      //do something
  }

 public static void close(){
    objectIn.close();
    byteIn.close();
  }
}
Run Code Online (Sandbox Code Playgroud)

或者每次创建和关闭新流是否更有效?

像这样:

class Main {

public static void main(String[] args) {
    while(true){
      receive();
    }
}

 public static void …
Run Code Online (Sandbox Code Playgroud)

java inputstream outputstream objectoutputstream bytearrayinputstream

5
推荐指数
1
解决办法
217
查看次数