[Java] Implementierte einen strengen Zeilenvorschub-Stream-Reader, der Line nur mit CrLf liest.

Um klar zu sein, ich denke, es ist eine ** Katze, die millionenfach implementiert wurde **. Ich habe es aus irgendeinem Grund implementiert und es auf GitHub hochgeladen.

■ Zusammenfassung:

◇ Hintergrund

Als Voraussetzung ist es sehr häufig ** "Es wurde notwendig, einen CSV-Parser zu implementieren" **. Ich persönlich mag das CSV-Dateiformat nicht, weil es viel Ärger macht. Ich möchte XML oder JSON als systemübergreifende IF sehen und andere strukturierte Zeichenfolgenformate übernehmen. Leider habe ich mich aufgrund verschiedener Umstände entschlossen zu sagen, dass ** alles CSV ist **.

◇ Ich habe danach gesucht, bevor ich es unabhängig implementiert habe

Kurz gesagt, ich möchte einen CSV-Parser, und wenn möglich, möchte ich so etwas Schlammiges nicht selbst schreiben. Also suchte ich nach einer Bibliothek, die benutzt werden konnte, aber mir fiel keine ein.

Die folgenden Punkte waren die Hauptengpässe.

Ich möchte die bereits implementierte Bibliothek loswerden * (ich möchte keinen schlammigen Code selbst schreiben) *, also habe ich mein Bestes versucht, ihn zu finden. Schließlich konnte ich kein gutes Produkt finden, das alle Anforderungen erfüllen konnte.

◇ Implementierungsanforderungen

Nun, ich habe die Textdatei Zeile für Zeile gelesen. Es ist nur eine CSV-Token-Analyse, während Sie normal anfragen. Es ist schlammig, aber es ist einfach und leicht.

Ich habe nachgedacht, aber leider wusste ich nicht, dass ** BufferedReader # readLine () nicht zwischen CrLf und Lf unterscheidet **.

Obwohl der Token-Parser sofort erstellt wurde, lief das Lesen der wesentlichen Zeilen nicht gut, und am Ende war es notwendig, ihn selbst zu erstellen.

■ Implementierungscode:

Nur der Kernlogikteil wird extrahiert. Ich lasse andere verwandte Klassen aus, daher sehen Sie bitte GitHub für den gesamten Betrag.

CrLfReader#next



	public String next()
	{
		this.sb.setLength( 0 );
		
		if ( this.build() )
		{
			return this.sb.toString();
		}
		else
		{
			return null;
		}
	}

CrLfReader#build



	private boolean build()
	{
		if ( this.end )
		{
			return false;
		}
		else
		{
			this.readline( false );
			return true;
		}
	}

CrLfReader.Buffer



	private class Buffer
	{
		private final char[] temp;
		
		private int size;
		private int index;
		private boolean eof;
		
		public Buffer(int size)
		{
			this.temp = new char[max( size, MIN_SIZE )];
			this.size = 0;
			this.index = this.temp.length;
			this.eof = false;
		}
		
		public boolean fill()
		{
			if ( !eof )
			{
				size = reader.read( temp );
				index = 0;
				eof = -1 == size;
			}
			
			return !eof;
		}
		
		
		public boolean seekable()
		{
			return index < size;
		}
		
		public char seek()
		{
			return temp[index++];
		}
	}

CrLfReader#readline



	private static final char CR = '\r';
	private static final char LF = '\n';
	
	private void readline(boolean cr)
	{
		while ( this.buffer.seekable() )
		{
			final char c = this.buffer.seek();
			
			if ( cr )
			{
				if ( LF == c ) return;
				
				this.sb.append( CR );
			}
			
			cr = CR == c;
			
			if ( !cr )
			{
				this.sb.append( c );
			}
		}
		
		
		if ( this.buffer.fill() )
		{
			this.readline( cr );
		}
		else
		{
			if ( cr ) sb.append( CR );
			
			this.end = true;
		}
	}

■GitHub

repository URL https://github.com/sugaryo/sharp4j

class FQN sharp4j.util.io.CrLfReader

Beiseite

In C # können Sie Yield Return verwenden, um es zu einem bequemeren Dienstprogramm zu machen. Wird Java die Stream-API verwenden?

Ich würde es gerne erweitern, nachdem ich ein wenig studiert habe.

Recommended Posts

[Java] Implementierte einen strengen Zeilenvorschub-Stream-Reader, der Line nur mit CrLf liest.
[Java] Erstellen Sie eine Sammlung mit nur einem Element
Machen Sie Java Stream Zeilenumbrüche mit Eclipse schön
[Java] So unterbrechen Sie eine Zeile mit StringBuilder
Ich möchte eine Schleife schreiben, die auf einen Index mit der Stream-API von Java 8 verweist
Nur der Stream der obersten Ebene kann mit Java Stream parallelisiert werden.
[MQTT / Java] Implementierte eine Klasse, die Pub / Sub von MQTT in Java ausführt