

png画像をDBにBLOB型で格納してあるものを、pngに再度成型してダウンロードを行う処理を書いていました。

[code]

        response.setContentType(filetype);
                response.setHeader("Content-Disposition"
                        , "attachment; filename=\"" + encodedFileName + "\"");
    
                OutputStream out = response.getOutputStream();
    
                byte[] downloadData = tomuch.getFile();
                out.write(downloadData);
                out.write(downloadData,0,downloadData.length);
    
                out.close();
    
[/code]

以上のようなコードを書いていたのですが、`out.write(downloadData)`の形ですとpngとしてダウンロードはできるものの読み込めない状態になってしまいました。  
そこで下のように `out.write(downloadData,0,downloadData.length);`
という形にしたところ正常にダウンロードでき、画像も元の通りに復元されていました。

２つの違いは引数として開始位置と終了位置を指定しているだけだと思うのですが、なぜ結果に差異が出るのかが調べてみてもよくわかりませんでした、なぜそのような結果になったのかご教授お願いいたします。


CC BY-SA 4.0
2023-05-10T03:10:51.620
94800
2023-05-12T07:35:30.293
2023-05-10T07:34:53.167
3060
58239
question
java 画像
Java の OutputStream の引数について。（(byte[])の際と(byte[],int,int)の際の違いについて）


[Java API
仕様書の記述](https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/io/OutputStream.html#write\(byte%5B%5D\))

> `write(b)`の汎用規約では、`write(b, 0, b.length)`を呼び出したときと同じ動作を行います。

にある通り、その2つの挙動は同じです。  
例えば Tomcat の `ServletOutputStream` 実装である
[`CoyoteOutputStream`](https://github.com/apache/tomcat/blob/e20760b5a15066c006da2144b30ab61cc80581d3/java/org/apache/catalina/connector/CoyoteOutputStream.java#L88-L91)
では次のようになっています。

[code]

        @Override
        public void write(byte[] b) throws IOException {
            write(b, 0, b.length);
        }
    
[/code]

したがって、

> なぜ結果に差異が出るのかが調べてみてもよくわかりませんでした、なぜそのような結果になったのかご教授お願いいたします。

もし仮に結果に差異が発生しているのであれば、質問文中にあるような書き換えが原因であるというのは勘違いで、他に要因があると考えられます。  
(それが何なのかは現時点の質問文からはわからないので、特定するためには再現できるコードが必要です)


CC BY-SA 4.0
2023-05-12T07:29:07.313
94828
2023-05-12T07:35:30.293
2023-05-12T07:35:30.293
2808
2808
94800
answer