www.pudn.com > MobiCraft_src.rar > OptionsReader.java
// style: tabs, tabsize=4, style=ANSI
//+----------------------------------------------------------------------+
// Copyright (c) 2006 Company Name
// Made by Andrew and Zahar
//+----------------------------------------------------------------------+
// Filename: OptionsReader.java
//+----------------------------------------------------------------------+
// Comment: Позволяет считывать строки из настроечных файлов
//+----------------------------------------------------------------------+
package app;
import java.io.*;
import java.lang.*;
public class OptionsReader
{
protected InputStream mInputStream;
public int MAX_STRING_LEN = 300; // Для безопасности
public OptionsReader()
{
}
public boolean Open(String filename)
{
mInputStream = getClass().getResourceAsStream(filename);
if ( mInputStream == null)
return false;
return true;
}
public boolean Close()
{
if ( mInputStream != null)
try
{
mInputStream.close();
}
catch(IOException e)
{
return false;
}
return true;
}
public boolean Opened()
{
if ( mInputStream == null)
return false;
return true;
}
// Читает строку, которая не пустая ( пробелы и т.п. НЕ ингорируются)
// Строки начинающиеся с # считаются комментариями и игнорируются.
// Если ничего не удалось считать, возвращается null
public String ReadString()
{
if ( ! Opened() )
return null;
String s=null;
boolean bEOF = false;
ByteArrayOutputStream mBytes = new ByteArrayOutputStream();
do
{
int sLen = 0;
s = null;
mBytes.reset();
boolean bInCommentary;
bInCommentary = false;
for (int i =0; i < MAX_STRING_LEN; i++)
{
int c;
try
{
c = mInputStream.read();
}
catch(IOException e)
{
//System.out.println("? "+e.toString() );
return null;
}
if (-1 == c) // Строка завершилась концом файла, а не переносом.
{
bEOF = true;
if ( sLen>0 )
s = mBytes.toString().substring( 0, sLen );
break;
}
boolean bStop = false;
switch (c)
{
case '#':
bInCommentary = true; // Пропустить конец строки
break;
case '=':
case '\t':
if (bInCommentary)
break; // Пропустить символ
// Иначе делать как и в \r \n
case '\n':
case '\r':
// Finish line
bStop = true;
if ( sLen>0 )
s = mBytes.toString().substring( 0, sLen );
break;
default:
if (bInCommentary)
break; // Пропустить символ
sLen++;
mBytes.write(c);
break;
}
if (bStop)
break;
}
boolean err = false;
if ( s==null )
err=true;
else
if ( s.length() == 0 )
err=true;
if (err)
{
if ( bEOF )
return null; // Нет больше возомжности считать строку смысловую
else
continue; // Ищем дальше.
}
else
break; // Нашли
}
while (true);
if (mBytes!=null)
{
try
{
mBytes.close();
}
catch(IOException e){}
mBytes = null;
}
// TODO: do we need trim()?
return (s.trim());
}
}