19 package org.sleuthkit.autopsy.keywordsearch;
21 import java.io.IOException;
22 import java.io.InputStream;
23 import java.nio.charset.Charset;
24 import java.util.List;
38 class AbstractFileStringIntStream
extends InputStream {
40 private static final Logger logger = Logger.getLogger(AbstractFileStringIntStream.class.getName());
41 private static final int FILE_BUF_SIZE = 1024 * 1024;
42 private AbstractFile content;
43 private final byte[] oneCharBuf =
new byte[1];
44 private final StringExtract stringExtractor;
45 private final byte[] fileReadBuff =
new byte[FILE_BUF_SIZE];
46 private long fileReadOffset = 0L;
47 private byte[] convertBuff;
48 private int convertBuffOffset = 0;
49 private int bytesInConvertBuff = 0;
50 private boolean fileEOF =
false;
51 private boolean extractUTF8;
52 private boolean extractUTF16;
53 private Charset outCharset;
55 private StringExtractResult lastExtractResult;
70 public AbstractFileStringIntStream(AbstractFile content, List<SCRIPT> scripts,
boolean extractUTF8,
71 boolean extractUTF16, Charset outCharset) {
72 this.content = content;
73 this.stringExtractor =
new StringExtract();
74 this.stringExtractor.setEnabledScripts(scripts);
75 this.extractUTF8 = extractUTF8;
76 this.extractUTF16 = extractUTF16;
77 this.outCharset = outCharset;
78 this.stringExtractor.setEnableUTF8(extractUTF8);
79 this.stringExtractor.setEnableUTF16(extractUTF16);
83 public int read() throws IOException {
84 if (extractUTF8 ==
false && extractUTF16 ==
false) {
87 final int read = read(oneCharBuf, 0, 1);
97 public int read(byte[] b,
int off,
int len)
throws IOException {
99 throw new NullPointerException();
100 }
else if (off < 0 || len < 0 || len > b.length - off) {
101 throw new IndexOutOfBoundsException();
102 }
else if (len == 0) {
106 if (extractUTF8 ==
false && extractUTF16 ==
false) {
110 long fileSize = content.getSize();
118 int offsetUser = off;
119 while (bytesToUser < len && offsetUser < len) {
121 int convertBuffRemain = bytesInConvertBuff - convertBuffOffset;
123 if ((convertBuff == null || convertBuffRemain == 0) && !fileEOF && fileReadOffset < fileSize) {
143 toRead = Math.min(FILE_BUF_SIZE, fileSize - fileReadOffset);
145 int read = content.read(fileReadBuff, fileReadOffset, toRead);
146 if (read == -1 || read == 0) {
149 fileReadOffset += read;
150 if (fileReadOffset >= fileSize) {
156 convertBuffRemain = bytesInConvertBuff - convertBuffOffset;
158 }
catch (TskCoreException ex) {
165 if (convertBuff == null || convertBuffRemain == 0) {
167 return bytesToUser > 0 ? bytesToUser : -1;
175 final int toCopy = Math.min(convertBuffRemain, len - offsetUser);
176 System.arraycopy(convertBuff, convertBuffOffset, b, offsetUser, toCopy);
184 convertBuffOffset += toCopy;
185 offsetUser += toCopy;
187 bytesToUser += toCopy;
201 private void convert(
int numBytes) {
202 lastExtractResult = stringExtractor.extract(fileReadBuff, numBytes, 0);
203 convertBuff = lastExtractResult.getText().getBytes(outCharset);
206 if (lastExtractResult.getNumBytes() == 0) {
207 bytesInConvertBuff = 0;
209 bytesInConvertBuff = convertBuff.length;
211 convertBuffOffset = 0;