LineReader.java

package eu.javaexperience.io.primitive;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;


public class LineReader
{
	protected final Reader read;
	
	
	public LineReader(Reader read)
	{
		this.read = read;
	}

	public static enum LineMode
	{
		Unix('\n'),
		Windows('\r'),
		Mac('\0');
		
		private final char le;
		
		private LineMode(char c)
		{
			le = c;
		}		
	}
	
	public static String readLine(Reader reader,LineMode mode) throws IOException
	{
		StringBuilder ret = new StringBuilder();
		char[] buf = new char[1];
		//lehet \r vagy \n vagy \r\n
		ok:{
			switch (mode)
			{
			case Mac:
				while(true)
				{
					int re = reader.read(buf);
					if(re == 1)
					{
						if(buf[0] == '\n')
							break ok;
						else if(buf[0] == '\r')
							continue;
						else
							ret.append(buf[0]);
					}
					else if(re < 1)
					{
						if(re < 0 && ret.length() == 0)
							return null;
						break ok;
					}
				}

			case Unix:
			case Windows:
				while(true)
				{
					int re = reader.read(buf);
					if(re == 1)
					{
						if(buf[0] == mode.le)
							break ok;
						else
							ret.append(buf[0]);
					}
					else if(re < 1)
					{
						if(re < 0 && ret.length() == 0)
							return null;
						break ok;
					}
				}
			default:
				throw new IllegalArgumentException("No line mode");
			}
		}
		return ret.toString();
	}
	
	public static String readLine(InputStream reader,LineMode mode) throws IOException
	{
		StringBuilder ret = new StringBuilder();
		byte[] buf = new byte[1];
		//lehet \r vagy \n vagy \r\n
		ok:{
			switch (mode)
			{
			case Mac:
				while(true)
				{
					int re = reader.read(buf);
					if(re == 1)
					{
						if(buf[0] == '\n')
							break ok;
						else if(buf[0] == '\r')
							continue;
						else
							ret.append((char)buf[0]);
					}
					else if(re < 1)
					{
						if(re < 0 && ret.length() == 0)
							return null;
						break ok;
					}
				}

			case Unix:
			case Windows:
				while(true)
				{
					int re = reader.read(buf);
					if(re == 1)
					{
						if(buf[0] == mode.le)
							break ok;
						else
							ret.append((char)buf[0]);
					}
					else if(re < 1)
					{
						if(re < 0 && ret.length() == 0)
							return null;
						break ok;
					}
				}
			default:
				throw new IllegalArgumentException("No line mode given");
			}
		}
		return ret.toString();
	}
	
	public static byte[] readByteLine(InputStream reader,LineMode mode) throws IOException
	{
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		byte[] buf = new byte[1];
		//lehet \r vagy \n vagy \r\n
		ok:{
			switch (mode)
			{
			case Mac:
				while(true)
				{
					int re = reader.read(buf);
					if(re == 1)
					{
						if(buf[0] == '\n')
							break ok;
						else if(buf[0] == '\r')
							continue;
						else
							out.write(buf[0]);
					}
					else if(re < 1)
					{
						if(re < 0 && out.size() == 0)
							return null;
						break ok;
					}
				}

			case Unix:
			case Windows:
				while(true)
				{
					int re = reader.read(buf);
					if(re == 1)
					{
						if(buf[0] == mode.le)
							break ok;
						else
							out.write(buf[0]);
					}
					else if(re < 1)
					{
						if(re < 0 && out.size() == 0)
							return null;
						break ok;
					}
				}
			default:
				throw new IllegalArgumentException("No line mode given");
			}
		}
		
		return out.toByteArray();
	}
	
	public String readLine() throws IOException
	{
		return readLine(read,LineMode.Unix);
	}
	
	
	
}