从InputStream中删除换行符

我想从java.io.InputStream删除所有换行符(对于\ n和\ r \ n),在读取文件时,相应的方法如下所示:

 /** * @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; } 

您可以拥有自己的java.io.FileInputStream并以读取时跳过\r\n的方式覆盖读取方法。

Hier是示例实现(没有任何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; } } 

并进行一些基本测试……

 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(); } } 

你的方法看起来像这样

 /** * @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; } 

为了更好地兼容java.io.InputStream抽象类,您可能希望覆盖类中的所有方法。

您可以将其转换为String,并将任何内容替换为新行字符:

 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()); 

考虑到你的文字不包含对你来说相关的“\ n”和“\ r”,这将是很好的。

使用Apache Commons Lang和StringUtils.chomp函数