/* *********************************************************************** * Copyright (C) 2005-2007, International Business Machines Corporation and * * others. All Rights Reserved. * *********************************************************************** * */ package com.ibm.icu.dev.tool.charsetdet.sbcs; import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.charset.CharacterCodingException; import java.nio.charset.Charset; import java.nio.charset.CharsetDecoder; import java.nio.charset.CharsetEncoder; import java.nio.charset.CodingErrorAction; /** * @author emader * * TODO To change the template for this generated type comment go to * Window - Preferences - Java - Code Style - Code Templates */ public class InputFile implements NGramList.NGramKeyMapper { private File file; private FileInputStream fileStream; private InputStreamReader inputStream; private Charset charset; private CharsetDecoder decoder; private CharsetEncoder encoder; private boolean visualOrder; private static void exceptionError(Exception e) { System.err.println("ioError: " + e.toString()); } /** * */ public InputFile(String filename, String encoding, boolean visual) { file = new File(filename); setEncoding(encoding); visualOrder = visual; } public boolean open() { try { fileStream = new FileInputStream(file); inputStream = new InputStreamReader(fileStream, "UTF8"); } catch (Exception e) { exceptionError(e); return false; } return true; } public void close() { try { inputStream.close(); fileStream.close(); } catch (Exception e) { // don't really care if this fails... } } public String getFilename() { return file.getName(); } public String getParent() { return file.getParent(); } public String getPath() { return file.getPath(); } public int read(char[] buffer) { int charsRead = -1; try { charsRead = inputStream.read(buffer, 0, buffer.length); } catch (Exception e) { exceptionError(e); } return charsRead; } public void setEncoding(String encoding) { charset = Charset.forName(encoding); decoder = charset.newDecoder(); encoder = charset.newEncoder(); encoder.onUnmappableCharacter(CodingErrorAction.REPLACE); encoder.onMalformedInput(CodingErrorAction.REPLACE); decoder.onUnmappableCharacter(CodingErrorAction.REPLACE); decoder.onMalformedInput(CodingErrorAction.REPLACE); } public String getEncoding() { return charset.displayName(); } public boolean getVisualOrder() { return visualOrder; } public Object mapKey(String key) { byte[] bytes = encode(key.toCharArray()); int length = key.length(); int value = 0; for(int b = 0; b < length; b += 1) { value <<= 8; value += (bytes[b] & 0xFF); } return new Integer(value); } public byte[] encode(char[] chars) { CharBuffer cb = CharBuffer.wrap(chars); ByteBuffer bb; try { bb = encoder.encode(cb); } catch (CharacterCodingException e) { // don't expect to get any exceptions in normal usage... return null; } return bb.array(); } public char[] decode(byte[] bytes) { ByteBuffer bb = ByteBuffer.wrap(bytes); CharBuffer cb; try { cb = decoder.decode(bb); } catch (CharacterCodingException e) { // don't expect to get any exceptions in normal usage... return null; } return cb.array(); } }