将文件和数据转换为 outputStream 并将 inputStream 转换为文件和数据
Posted
技术标签:
【中文标题】将文件和数据转换为 outputStream 并将 inputStream 转换为文件和数据【英文标题】:Turn a file and data into an outputStream and convert from an inputStream to a file and data 【发布时间】:2022-01-02 03:15:13 【问题描述】:我需要将文件和数据传输到可穿戴设备并使用ChannelClient。我正在发送各种数据(一个文件和各种变量),因此 getInputStream 和 getOutputStream 似乎是正确的方法(而不是发送文件)。
如何将变量集合与文件打包并将它们发送到 outputStream 中,以及如何从 inputStream 中解压缩它们?
使用以下代码时出现此错误:java.lang.ClassNotFoundException: d.b.a.m.a
:
电话
String node = settingsRepository.getNode();
String path = "/channel/mobile";
ChannelClient channelClient = Wearable.getChannelClient(getContext());
channelClient.openChannel(node,path).addOnSuccessListener(new OnSuccessListener<ChannelClient.Channel>()
@Override
public void onSuccess(ChannelClient.Channel channel)
Log.d(TAG, "onSuccess: ");
channelClient.getOutputStream(channel).addOnSuccessListener(new OnSuccessListener<OutputStream>()
@Override
public void onSuccess(OutputStream outputStream)
Log.d(TAG, "channelClient.getOutputStream.onSuccess: ");
File file = new File("/data/user/0/com.xxx.yyy/files/icon-8.png");
TestObject testObject = new TestObject("test",file);
Log.d(TAG, "channelClient.getOutputStream.onSuccess: name=" + testObject.getName());
ObjectOutputStream out = new ObjectOutputStream(outputStream);
out.writeObject(testObject);
out.flush();
out.close();
)
)
我如何在可穿戴设备上拆包?
可穿戴
Task<InputStream> inputStreamTask = Wearable.getChannelClient(getApplicationContext()).getInputStream(channel);
inputStreamTask.addOnSuccessListener(new OnSuccessListener<InputStream>()
@Override
public void onSuccess(InputStream inputStream)
Log.d(TAG, "addOnSuccessListener.onSuccess: ");
try
ObjectInputStream in = new ObjectInputStream(inputStream);
TestObject testObject = (TestObject) in.readObject();
Log.d(TAG, "addOnSuccessListener.onSuccess: name=" + testObject.getName());
catch (Exception e)
Log.d(TAG, "addOnSuccessListener.onSuccess: error=" + e.getMessage());
e.printStackTrace();
);
TestObject 类
public class TestObject implements Serializable
String name;
File file;
public TestObject(String name, File file)
this.name = name;
this.file = file;
public String getName()
return name;
public void setName(String name)
this.name = name;
public File getFile()
return file;
public void setFile(File file)
this.file = file;
【问题讨论】:
您写入输出流的内容就是您从输入流中读取的内容。因此,只需尝试一些字符串和线条开头。 我改了句。希望能帮助到你。我使用其他方法来发送字符串或文件,但我需要在同一个通道/连接中发送两者。如何将它们捆绑在一起并在另一侧拆包?the getInputStream and getOutputStream seem to be the right approach
如果您的意思是:发送方将数据写入输出流,接收方从输入流中读取数据,那么是的,这是正常的方法。
How do I bundle them together and unpack them on the other side?
这完全取决于您。正如你所写的那样,你也知道如何阅读并且必须解释读取的数据。
您是否曾经使用 inputStream/outputStream 打包带有变量的文件?如果是这样,你是怎么做到的?你有一个例子吗?是否有我应该扩展的特定对象来执行此操作?
【参考方案1】:
您可以使用 DataOutputStream 和 DataInputStream。
https://docs.oracle.com/javase/7/docs/api/java/io/DataOutputStream.html
它将类型编码为带有前缀https://docs.oracle.com/javase/7/docs/api/java/io/DataInput.html#readUTF()的字符串
读取已使用修改后的 UTF-8 格式编码的字符串。 readUTF 的一般约定是它读取以修改后的 UTF-8 格式编码的 Unicode 字符串的表示;然后这个字符串作为字符串返回。 首先,读取两个字节并使用 readUnsignedShort 方法的方式构造一个无符号的 16 位整数。这个整数值称为 UTF 长度,指定要读取的附加字节数
readFully 将读入一个字节数组。
【讨论】:
我更新了帖子。我正在尝试使用 ObjectOutputStream 和 ObjectInputStream 希望这可以完成您推荐的相同方法,只是使用 Object vs Data。以上是关于将文件和数据转换为 outputStream 并将 inputStream 转换为文件和数据的主要内容,如果未能解决你的问题,请参考以下文章