将文件和数据转换为 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 转换为文件和数据的主要内容,如果未能解决你的问题,请参考以下文章

将文件输出流转换为字符串

Jackson 对象和JSON的相互转换

如何将 outputStream 转换为字节数组?

上传图像/文件并将其转换为 mysql 数据库

将数据库转换为 CSV 并将文件保存到服务器上的文件夹

Byte[] 到 InputStream 或 OutputStream