You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by se...@apache.org on 2013/05/16 15:09:57 UTC
svn commit: r1483340 - in /commons/proper/io/trunk/src:
main/java/org/apache/commons/io/input/Tailer.java
test/java/org/apache/commons/io/input/TailerTest.java
Author: sebb
Date: Thu May 16 13:09:56 2013
New Revision: 1483340
URL: http://svn.apache.org/r1483340
Log:
IO-354 Commons IO Tailer does not respect UTF-8 Charset
Rework to allow charset to be specified
Modified:
commons/proper/io/trunk/src/main/java/org/apache/commons/io/input/Tailer.java
commons/proper/io/trunk/src/test/java/org/apache/commons/io/input/TailerTest.java
Modified: commons/proper/io/trunk/src/main/java/org/apache/commons/io/input/Tailer.java
URL: http://svn.apache.org/viewvc/commons/proper/io/trunk/src/main/java/org/apache/commons/io/input/Tailer.java?rev=1483340&r1=1483339&r2=1483340&view=diff
==============================================================================
--- commons/proper/io/trunk/src/main/java/org/apache/commons/io/input/Tailer.java (original)
+++ commons/proper/io/trunk/src/main/java/org/apache/commons/io/input/Tailer.java Thu May 16 13:09:56 2013
@@ -105,6 +105,7 @@ import org.apache.commons.io.IOUtils;
* </pre>
* <p>If you interrupt a tailer, the tailer listener is called with the {@link InterruptedException}.</p>
*
+ * <p>The file is read using the default charset; this can be overriden if necessary</p>
* @see TailerListener
* @see TailerListenerAdapter
* @version $Id$
@@ -119,6 +120,9 @@ public class Tailer implements Runnable
private static final int DEFAULT_BUFSIZE = 4096;
+ // The default charset used for reading files
+ private static final Charset DEFAULT_CHARSET = Charset.defaultCharset();
+
/**
* Buffer on top of RandomAccessFile.
*/
@@ -130,6 +134,11 @@ public class Tailer implements Runnable
private final File file;
/**
+ * The character set that will be used to read the file.
+ */
+ private final Charset cset;
+
+ /**
* The amount of time to wait for the file to be updated.
*/
private final long delayMillis;
@@ -218,6 +227,23 @@ public class Tailer implements Runnable
* @param bufSize Buffer size
*/
public Tailer(final File file, final TailerListener listener, final long delayMillis, final boolean end, final boolean reOpen, final int bufSize) {
+ this(file, DEFAULT_CHARSET, listener, delayMillis, end, reOpen, bufSize);
+ }
+
+ /**
+ * Creates a Tailer for the given file, with a specified buffer size.
+ * @param file the file to follow.
+ * @param cset the Charset to be used for reading the file
+ * @param listener the TailerListener to use.
+ * @param delayMillis the delay between checks of the file for new content in milliseconds.
+ * @param end Set to true to tail from the end of the file, false to tail from the beginning of the file.
+ * @param reOpen if true, close and reopen the file between reading chunks
+ * @param bufSize Buffer size
+ * @deprecated
+ */
+ @Deprecated
+ public Tailer(final File file, final Charset cset, final TailerListener listener, final long delayMillis, final boolean end, final boolean reOpen
+ , final int bufSize) {
this.file = file;
this.delayMillis = delayMillis;
this.end = end;
@@ -228,6 +254,7 @@ public class Tailer implements Runnable
this.listener = listener;
listener.init(this);
this.reOpen = reOpen;
+ this.cset = cset;
}
/**
@@ -257,7 +284,24 @@ public class Tailer implements Runnable
*/
public static Tailer create(final File file, final TailerListener listener, final long delayMillis, final boolean end, final boolean reOpen,
final int bufSize) {
- final Tailer tailer = new Tailer(file, listener, delayMillis, end, reOpen, bufSize);
+ return create(file, DEFAULT_CHARSET, listener, delayMillis, end, reOpen, bufSize);
+ }
+
+ /**
+ * Creates and starts a Tailer for the given file.
+ *
+ * @param file the file to follow.
+ * @param charset the character set to use for reading the file
+ * @param listener the TailerListener to use.
+ * @param delayMillis the delay between checks of the file for new content in milliseconds.
+ * @param end Set to true to tail from the end of the file, false to tail from the beginning of the file.
+ * @param reOpen whether to close/reopen the file between chunks
+ * @param bufSize buffer size.
+ * @return The new tailer
+ */
+ public static Tailer create(final File file, final Charset charset, final TailerListener listener, final long delayMillis, final boolean end, final boolean reOpen
+ ,final int bufSize) {
+ final Tailer tailer = new Tailer(file, charset, listener, delayMillis, end, reOpen, bufSize);
final Thread thread = new Thread(tailer);
thread.setDaemon(true);
thread.start();
@@ -453,8 +497,6 @@ public class Tailer implements Runnable
* @throws java.io.IOException if an I/O error occurs.
*/
private long readLines(final RandomAccessFile reader) throws IOException {
- // Make explicit that the default charset is being used here
- Charset cset = Charset.defaultCharset();
ByteArrayOutputStream lineBuf = new ByteArrayOutputStream(64);
long pos = reader.getFilePointer();
long rePos = pos; // position to re-read
Modified: commons/proper/io/trunk/src/test/java/org/apache/commons/io/input/TailerTest.java
URL: http://svn.apache.org/viewvc/commons/proper/io/trunk/src/test/java/org/apache/commons/io/input/TailerTest.java?rev=1483340&r1=1483339&r2=1483340&view=diff
==============================================================================
--- commons/proper/io/trunk/src/test/java/org/apache/commons/io/input/TailerTest.java (original)
+++ commons/proper/io/trunk/src/test/java/org/apache/commons/io/input/TailerTest.java Thu May 16 13:09:56 2013
@@ -120,12 +120,12 @@ public class TailerTest extends FileBase
final TestTailerListener listener = new TestTailerListener();
final String osname = System.getProperty("os.name");
final boolean isWindows = osname.startsWith("Windows");
- tailer = new Tailer(file, listener, delay, false, isWindows);
+ // Need to use UTF-8 to read & write the file otherwise it can be corrupted (depending on the default charset)
+ final Charset charsetUTF8 = Charset.forName("UTF-8");
+ tailer = new Tailer(file, charsetUTF8, listener, delay, false, isWindows, 4096);
final Thread thread = new Thread(tailer);
thread.start();
- // Need to use UTF-8 to read & write the file otherwise it can be corrupted (depending on the default charset)
- final Charset charsetUTF8 = Charset.forName("UTF-8");
Writer out = new OutputStreamWriter(new FileOutputStream(file), charsetUTF8);
BufferedReader reader = null;
try{