Robert Heine
Robert Heine

Reputation: 1838

Removing newline characters from InputStream

I like to remove all newline characters (for both \n and \r\n) from an java.io.InputStream, while reading a file, the corresponding method looks like this:

/**
 * @param target {@linkplain File}
 * @return {@linkplain InputStream}
 * @throws Exception
 */
protected InputStream initInput(final File file)
    throws Exception {
    InputStream stream = null;
    try {
        if (file.isDirectory()) {
            // throw exception
        }
        if (!file.exists()) {
            // throw another exception
        }
        // 
        // *remove newlines here*
        //
        stream = new FileInputStream(file);

    } catch (FileNotFoundException e) {
        // throw another exception
    }
    return stream;
}

Upvotes: 7

Views: 20672

Answers (3)

Miguel Prz
Miguel Prz

Reputation: 13792

Sometimes, the standard Java libraries fail to provide enough methods for manipulation of its core classes. Apache Commons Lang provides these extra methods.

If you can use that library, the StringUtils.chomp method maybe useful.

Upvotes: 0

A4L
A4L

Reputation: 17595

You could have your own implmentation of java.io.FileInputStream and Override the read-methods in a way that you jump over \r and \n while reading.

Hier is sample Implementation (without any error handling)

import java.io.File;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class NoNewLineFileInputStream extends FileInputStream {

    public NoNewLineFileInputStream(String filepath) throws FileNotFoundException {
        super(filepath);
    }

    public NoNewLineFileInputStream(File file) throws FileNotFoundException {
        super(file);
    }

    public NoNewLineFileInputStream(FileDescriptor filedescriptor) {
        super(filedescriptor);
    }

    @Override
    public int read(byte[] b) throws IOException {
        return this.read(b, 0, b.length);
    }

    @Override
    public int read(byte[] b, int off, int len) throws IOException {
        int n = 0, c;
        do {
            c = this.read();
            if(c != -1) {
                b[off + n] = (byte) c;
                n++;
                len--;  
            } else {
                return c;
            }
        } while(c != -1 && len > 0);
        return n;
    }


    @Override
    public int read() throws IOException {
        int c;
        do {
            c = super.read();
        } while(c != -1 && (c == '\n' || c == '\r'));
        return c;
    }
}

And for some basic testing ...

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import junit.framework.Assert;

import org.junit.BeforeClass;
import org.junit.Test;

public class NoNewLineFileInputStreamTest {

    private final static String txt = "testnl.txt";

    @BeforeClass
    public static void genTestFile() throws IOException {
        OutputStream os = new FileOutputStream(txt);
        os.write((
                "Hello\n" +
                ",\r\n" +
                "World!\r" +
                "").getBytes());
        os.close();
    }

    @Test
    public void readInt() throws IOException {
        InputStream is = new NoNewLineFileInputStream(txt);
        int c = is.read();
        while(c != -1) {
            Assert.assertTrue(c != '\n' && c != '\r');
            c = is.read();
        }
        is.close();
    }

    @Test
    public void readBytes() throws IOException {
        InputStream is = new NoNewLineFileInputStream(txt);
        int l = is.available();
        if(l > 0) {
            byte[] content = new byte[l];
            int n = is.read(content);
            String expected = "Hello,World!";
            Assert.assertEquals(expected.getBytes().length, n);
            Assert.assertEquals(expected, new String(content, 0, n));
        }
        is.close();
    }

    @Test
    public void readBytesOffset() throws IOException {
        InputStream is = new NoNewLineFileInputStream(txt);
        int l = is.available();
        if(l > 0) {
            byte[] content = new byte[l*3];
            int n = is.read(content, 3, 5);
            String expected = "Hello";
            Assert.assertEquals(expected.getBytes().length, n);
            Assert.assertEquals(expected, new String(content, 3, n));
        }
        is.close();
    }
}

Your method would look like this

/**
 * @param target {@linkplain File}
 * @return {@linkplain InputStream}
 * @throws Exception
 */
protected InputStream initInput(final File file)
    throws Exception {
    InputStream stream = null;
    try {
        if (file.isDirectory()) {
            // throw exception
        }
        if (!file.exists()) {
            // throw another exception
        }
        // 
        // read operations using this implementation will jump over all '\n' and '\r'
        //
        stream = new NoNewLineFileInputStream(file);

    } catch (FileNotFoundException e) {
        // throw another exception
    }
    return stream;
}

For better compatibility with the java.io.InputStream abstract class you may want to override all its methods in your class.

Upvotes: 8

Michael A
Michael A

Reputation: 5850

You can convert it to a String, and replace the new line characters with nothing:

InputStream is = new ByteArrayInputStream("file content".getBytes());

    //read it with BufferedReader
    BufferedReader br  = new BufferedReader(new InputStreamReader(is));

    StringBuilder sb = new StringBuilder();

    String line;
    while ((line = br.readLine()) != null) {
        sb.append(line.replace("\r","").replace("\n",""))       


    System.out.println(sb.toString());

This will be good considering your text dont contain "\n" and "\r" that are relavent for you.

Upvotes: 6

Related Questions