我正在为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) 我有一个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)
谢谢你的帮助
阿夫纳
大家好.我正在开发一个客户端/服务器程序,其中客户端是一个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
writeUTF和writeChars有什么区别?(ObjectOutputStream的方法)此外,我还没有在ObjectInputStream中找到相应的readChars.
我使用 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中的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异常提出任何建议吗?
我有一个巨大的文件,其中包含ObjectOutputStream一个接一个地写入的对象列表.
for (Object obj : currentList){
oos.writeUnshared(obj);
}
Run Code Online (Sandbox Code Playgroud)
现在我想使用ObjectInputStream读取此文件.但是,我需要同时读取多个文件,因此我无法将整个文件读入内存.但是,使用ObjectInputStream会导致堆内存不足错误.从我读到的,这是因为ObjectInputStream有内存泄漏并且即使在返回它们之后也维护对read对象的引用.
我如何要求ObjectInputStream不保持其读取的引用?
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()
我对 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,而我希望它是 …
我目前正在为游戏开发 UDP 服务器。在此服务器中,使用 aByteArrayInputStream和ObjectInputStreamevery 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
java ×10
android ×2
sockets ×2
bitset ×1
bluetooth ×1
bytearray ×1
filechannel ×1
inputstream ×1
io ×1
java-7 ×1
json ×1
memory-leaks ×1
oracle ×1
outputstream ×1