如何检查InputStream是否获得空和/或空字符串?

时间:2018-05-02 09:22:03

标签: java null stream

如果我通过ObjectOutputStream将列表对象发送到服务器,该列表对象为空,那么我得到了一个异常。 所以,我想检查服务器端的ObjectInputStream是否为空。 但我不知道该怎么做。

ois.available()和ois.readObject!= null都不起作用。

这是一个示例代码: 客户端:

String str= null;//"Hello \n";


        //Nachricht mit AES verschlüsseln und an Server senden

        cipherAES.init(Cipher.ENCRYPT_MODE, encryptionKey, iv);
         byte[] input = str.getBytes();
         byte[] ctLength = cipherAES.doFinal(input);

         List<Byte> messageToServer = new ArrayList<>();
         for(int i = 0; i < ctLength.length; i++){

             messageToServer.add(ctLength[i]);

         }
 //3. OUTPUTSTREAM#############################################################################  
         oos.writeObject(messageToServer);
        os.flush();

服务器

//3.INPUTSTREAM#####################################################################         
       //ois.availale();At this place, it doesnt work. if List<Byte> isn't null result = 0;

       //Empfange Clients verschlüsselte Nachricht          
      List<Byte> encryptedMessageFromClient = (List<Byte>) ois.readObject();
     // At this place ois.available retruns the value of the Object, if the object isnt null;

   //#####################################################################

2 个答案:

答案 0 :(得分:0)

如果在writeObject()的帮助下序列化包含空值的List并尝试在服务器端反序列化它,则会再次为null。

我们没有objectOutputStream.available()方法,但是我们有objectInputStream.available(),它返回可以不阻塞地读取的字节数。

请注意

Java中的ObjectOutputStream可用于将对象转换为OutputStream。将对象转换为流的过程在java中称为序列化。

Java ObjectInputStream类(java.io.ObjectInputStream)使您能够从InputStream中读取Java对象,而不仅仅是原始字节。您将InputStream包装在ObjectInputStream中,然后您可以从中读取对象。当然,读取的字节必须代表有效的序列化Java对象。否则读取对象将失败。

答案 1 :(得分:-1)

解决。没有专利补救措施。 所以,如果你有几个ObjectInputStreams,那么使用“instanceof”或“!instanceof”。

请注意:instanceof不接受通用对象。

编辑:代码示例:客户端:

    if (str != null){
        //Nachricht mit AES verschlüsseln und an Server senden

    cipherAES.init(Cipher.ENCRYPT_MODE, encryptionKey, iv);
     byte[] input = str.getBytes();
     byte[] ctLength = cipherAES.doFinal(input);

     List<Byte> messageToServer = new ArrayList<>();
     for(int i = 0; i < ctLength.length; i++){

         messageToServer.add(ctLength[i]);

     }
      //3. 

    OUTPUTSTREAM##############################################
     oos.writeObject(messageToServer);
    os.flush();
       }

代码示例服务器:

             //3.INPUTSTREAM######################################

  Object readed = ois.readObject();

//##################################################
      if(!(readed instanceof requiredObject)){
           objectYouNeed = (cast_it)Object;
        }else
          {
            --> Go on with another Object which is in the stream
         }