Can I use try-with-resources with an InputStream that has already been created?











up vote
4
down vote

favorite












Like this:



public void myMethod(InputStream fileIn){
try (InputStream in = fileIn) {
do stuff....
}
}


It seems to work. Is it safe?










share|improve this question




























    up vote
    4
    down vote

    favorite












    Like this:



    public void myMethod(InputStream fileIn){
    try (InputStream in = fileIn) {
    do stuff....
    }
    }


    It seems to work. Is it safe?










    share|improve this question


























      up vote
      4
      down vote

      favorite









      up vote
      4
      down vote

      favorite











      Like this:



      public void myMethod(InputStream fileIn){
      try (InputStream in = fileIn) {
      do stuff....
      }
      }


      It seems to work. Is it safe?










      share|improve this question















      Like this:



      public void myMethod(InputStream fileIn){
      try (InputStream in = fileIn) {
      do stuff....
      }
      }


      It seems to work. Is it safe?







      java inputstream try-with-resources






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 20 at 13:22









      Lii

      6,81144158




      6,81144158










      asked Nov 20 at 12:26









      bot_bot

      1,11121540




      1,11121540
























          1 Answer
          1






          active

          oldest

          votes

















          up vote
          12
          down vote



          accepted











          It seems to work




          It will do if you add InputStream (or some supertype of InputStream) before in: the language spec requires you either to declare a variable for each resource.



          try (InputStream in = fileIn) { ... }


          or just refer directly to fileIn, in Java 9+:



          try (fileIn) { ... }


          And there's no reason why it shouldn't work: with the variable declaration form, you are assigning an expression to the variable (a new class, the result of a method invocation, an array element etc). The resource can't see if it is getting a "new" instance or not: it's just a thing with a value of the correct type.




          is it safe?




          Depends what exactly you mean by "safe".



          It is certainly safe in the sense that it will work without error in this code, and in.close() will be invoked at the end of the block.



          However, it violates the rule of thumb that "if you didn't open a stream, don't close it". As such, it might be unsafe in the sense that it causes unexpected failures in other parts of the program that expect the stream still to be open after invoking the method.






          share|improve this answer























          • Thanks! Yeah, that was a typo on my part, I do have try(InputStream in = fileIn)
            – bot_bot
            Nov 20 at 13:00










          • I've fixed the question
            – bot_bot
            Nov 20 at 13:00










          • Maybe I'll need to rethink my strategy in terms of opening/closing streams then. Thanks again!
            – bot_bot
            Nov 20 at 13:02






          • 1




            It is just a rule-of-thumb; there is nothing to say that you need to follow it. The slightly more general form is "if you don't own a stream, don't close it"; but Java has no notion of ownership of a reference, so you have to manage this yourself. If you intend for myMethod to "take ownership" of the stream, it is fine to close it here.
            – Andy Turner
            Nov 20 at 13:03













          Your Answer






          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "1"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53392971%2fcan-i-use-try-with-resources-with-an-inputstream-that-has-already-been-created%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes








          up vote
          12
          down vote



          accepted











          It seems to work




          It will do if you add InputStream (or some supertype of InputStream) before in: the language spec requires you either to declare a variable for each resource.



          try (InputStream in = fileIn) { ... }


          or just refer directly to fileIn, in Java 9+:



          try (fileIn) { ... }


          And there's no reason why it shouldn't work: with the variable declaration form, you are assigning an expression to the variable (a new class, the result of a method invocation, an array element etc). The resource can't see if it is getting a "new" instance or not: it's just a thing with a value of the correct type.




          is it safe?




          Depends what exactly you mean by "safe".



          It is certainly safe in the sense that it will work without error in this code, and in.close() will be invoked at the end of the block.



          However, it violates the rule of thumb that "if you didn't open a stream, don't close it". As such, it might be unsafe in the sense that it causes unexpected failures in other parts of the program that expect the stream still to be open after invoking the method.






          share|improve this answer























          • Thanks! Yeah, that was a typo on my part, I do have try(InputStream in = fileIn)
            – bot_bot
            Nov 20 at 13:00










          • I've fixed the question
            – bot_bot
            Nov 20 at 13:00










          • Maybe I'll need to rethink my strategy in terms of opening/closing streams then. Thanks again!
            – bot_bot
            Nov 20 at 13:02






          • 1




            It is just a rule-of-thumb; there is nothing to say that you need to follow it. The slightly more general form is "if you don't own a stream, don't close it"; but Java has no notion of ownership of a reference, so you have to manage this yourself. If you intend for myMethod to "take ownership" of the stream, it is fine to close it here.
            – Andy Turner
            Nov 20 at 13:03

















          up vote
          12
          down vote



          accepted











          It seems to work




          It will do if you add InputStream (or some supertype of InputStream) before in: the language spec requires you either to declare a variable for each resource.



          try (InputStream in = fileIn) { ... }


          or just refer directly to fileIn, in Java 9+:



          try (fileIn) { ... }


          And there's no reason why it shouldn't work: with the variable declaration form, you are assigning an expression to the variable (a new class, the result of a method invocation, an array element etc). The resource can't see if it is getting a "new" instance or not: it's just a thing with a value of the correct type.




          is it safe?




          Depends what exactly you mean by "safe".



          It is certainly safe in the sense that it will work without error in this code, and in.close() will be invoked at the end of the block.



          However, it violates the rule of thumb that "if you didn't open a stream, don't close it". As such, it might be unsafe in the sense that it causes unexpected failures in other parts of the program that expect the stream still to be open after invoking the method.






          share|improve this answer























          • Thanks! Yeah, that was a typo on my part, I do have try(InputStream in = fileIn)
            – bot_bot
            Nov 20 at 13:00










          • I've fixed the question
            – bot_bot
            Nov 20 at 13:00










          • Maybe I'll need to rethink my strategy in terms of opening/closing streams then. Thanks again!
            – bot_bot
            Nov 20 at 13:02






          • 1




            It is just a rule-of-thumb; there is nothing to say that you need to follow it. The slightly more general form is "if you don't own a stream, don't close it"; but Java has no notion of ownership of a reference, so you have to manage this yourself. If you intend for myMethod to "take ownership" of the stream, it is fine to close it here.
            – Andy Turner
            Nov 20 at 13:03















          up vote
          12
          down vote



          accepted







          up vote
          12
          down vote



          accepted







          It seems to work




          It will do if you add InputStream (or some supertype of InputStream) before in: the language spec requires you either to declare a variable for each resource.



          try (InputStream in = fileIn) { ... }


          or just refer directly to fileIn, in Java 9+:



          try (fileIn) { ... }


          And there's no reason why it shouldn't work: with the variable declaration form, you are assigning an expression to the variable (a new class, the result of a method invocation, an array element etc). The resource can't see if it is getting a "new" instance or not: it's just a thing with a value of the correct type.




          is it safe?




          Depends what exactly you mean by "safe".



          It is certainly safe in the sense that it will work without error in this code, and in.close() will be invoked at the end of the block.



          However, it violates the rule of thumb that "if you didn't open a stream, don't close it". As such, it might be unsafe in the sense that it causes unexpected failures in other parts of the program that expect the stream still to be open after invoking the method.






          share|improve this answer















          It seems to work




          It will do if you add InputStream (or some supertype of InputStream) before in: the language spec requires you either to declare a variable for each resource.



          try (InputStream in = fileIn) { ... }


          or just refer directly to fileIn, in Java 9+:



          try (fileIn) { ... }


          And there's no reason why it shouldn't work: with the variable declaration form, you are assigning an expression to the variable (a new class, the result of a method invocation, an array element etc). The resource can't see if it is getting a "new" instance or not: it's just a thing with a value of the correct type.




          is it safe?




          Depends what exactly you mean by "safe".



          It is certainly safe in the sense that it will work without error in this code, and in.close() will be invoked at the end of the block.



          However, it violates the rule of thumb that "if you didn't open a stream, don't close it". As such, it might be unsafe in the sense that it causes unexpected failures in other parts of the program that expect the stream still to be open after invoking the method.







          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited Nov 20 at 17:21

























          answered Nov 20 at 12:31









          Andy Turner

          79.4k878132




          79.4k878132












          • Thanks! Yeah, that was a typo on my part, I do have try(InputStream in = fileIn)
            – bot_bot
            Nov 20 at 13:00










          • I've fixed the question
            – bot_bot
            Nov 20 at 13:00










          • Maybe I'll need to rethink my strategy in terms of opening/closing streams then. Thanks again!
            – bot_bot
            Nov 20 at 13:02






          • 1




            It is just a rule-of-thumb; there is nothing to say that you need to follow it. The slightly more general form is "if you don't own a stream, don't close it"; but Java has no notion of ownership of a reference, so you have to manage this yourself. If you intend for myMethod to "take ownership" of the stream, it is fine to close it here.
            – Andy Turner
            Nov 20 at 13:03




















          • Thanks! Yeah, that was a typo on my part, I do have try(InputStream in = fileIn)
            – bot_bot
            Nov 20 at 13:00










          • I've fixed the question
            – bot_bot
            Nov 20 at 13:00










          • Maybe I'll need to rethink my strategy in terms of opening/closing streams then. Thanks again!
            – bot_bot
            Nov 20 at 13:02






          • 1




            It is just a rule-of-thumb; there is nothing to say that you need to follow it. The slightly more general form is "if you don't own a stream, don't close it"; but Java has no notion of ownership of a reference, so you have to manage this yourself. If you intend for myMethod to "take ownership" of the stream, it is fine to close it here.
            – Andy Turner
            Nov 20 at 13:03


















          Thanks! Yeah, that was a typo on my part, I do have try(InputStream in = fileIn)
          – bot_bot
          Nov 20 at 13:00




          Thanks! Yeah, that was a typo on my part, I do have try(InputStream in = fileIn)
          – bot_bot
          Nov 20 at 13:00












          I've fixed the question
          – bot_bot
          Nov 20 at 13:00




          I've fixed the question
          – bot_bot
          Nov 20 at 13:00












          Maybe I'll need to rethink my strategy in terms of opening/closing streams then. Thanks again!
          – bot_bot
          Nov 20 at 13:02




          Maybe I'll need to rethink my strategy in terms of opening/closing streams then. Thanks again!
          – bot_bot
          Nov 20 at 13:02




          1




          1




          It is just a rule-of-thumb; there is nothing to say that you need to follow it. The slightly more general form is "if you don't own a stream, don't close it"; but Java has no notion of ownership of a reference, so you have to manage this yourself. If you intend for myMethod to "take ownership" of the stream, it is fine to close it here.
          – Andy Turner
          Nov 20 at 13:03






          It is just a rule-of-thumb; there is nothing to say that you need to follow it. The slightly more general form is "if you don't own a stream, don't close it"; but Java has no notion of ownership of a reference, so you have to manage this yourself. If you intend for myMethod to "take ownership" of the stream, it is fine to close it here.
          – Andy Turner
          Nov 20 at 13:03




















          draft saved

          draft discarded




















































          Thanks for contributing an answer to Stack Overflow!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.





          Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


          Please pay close attention to the following guidance:


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53392971%2fcan-i-use-try-with-resources-with-an-inputstream-that-has-already-been-created%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          404 Error Contact Form 7 ajax form submitting

          How to know if a Active Directory user can login interactively

          TypeError: fit_transform() missing 1 required positional argument: 'X'