]> gitweb.fperrin.net Git - DictionaryPC.git/blob - src/com/hughes/android/dictionary/engine/WriteBuffer.java
1ddd42f15062a895740045ad147c25d5a3a56f87
[DictionaryPC.git] / src / com / hughes / android / dictionary / engine / WriteBuffer.java
1 // Copyright 2017 Reimar Döffinger
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //     http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 package com.hughes.android.dictionary.engine;
16
17 import java.io.IOException;
18 import java.io.OutputStream;
19 import java.io.PipedInputStream;
20 import java.io.PipedOutputStream;
21
22 public class WriteBuffer extends PipedOutputStream {
23     static int BLOCK_SIZE = 1024 * 1024;
24     public WriteBuffer(OutputStream out, int size) {
25         assert size >= 2 * BLOCK_SIZE;
26         this.out = out;
27         try {
28             pipe = new PipedInputStream(this, size);
29             buffer = new byte[BLOCK_SIZE];
30             writeThread = new Thread(() -> {
31                 int read;
32                 try {
33                     while ((read = pipe.read(buffer)) > 0)
34                     {
35                         out.write(buffer, 0, read);
36                         out.flush();
37                     }
38                 } catch (IOException e) {
39                     System.out.println("Error writing to file " + e);
40                 }
41                 try {
42                     out.close();
43                 } catch (IOException e) {}
44             });
45             writeThread.start();
46         } catch (IOException e) {}
47     }
48
49     public void close() throws IOException
50     {
51         super.close();
52         try {
53             writeThread.join();
54         } catch (InterruptedException e) {
55             System.out.println("Failed waiting for WriteBuffer thread " + e);
56         }
57     }
58
59     Thread writeThread;
60     OutputStream out;
61     PipedInputStream pipe;
62     byte[] buffer;
63 }