java 从 InputStream 中删除换行符
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/14752622/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Removing newline characters from InputStream
提问by Rob
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:
我喜欢从 an 中删除所有换行符(对于 \n 和 \r\n)java.io.InputStream
,在读取文件时,相应的方法如下所示:
/**
* @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;
}
采纳答案by A4L
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.
你可以有你自己的implmentationjava.io.FileInputStream
和覆盖的方式,你跳过读的方法\r
和\n
同时阅读。
Hier is sample Implementation (without any error handling)
Hier 是示例实现(没有任何错误处理)
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.
为了更好地与java.io.InputStream
抽象类兼容,您可能希望在您的类中覆盖它的所有方法。
回答by Michael A
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.
考虑到您的文本不包含与您相关的“\n”和“\r”,这会很好。
回答by Miguel Prz
Use Apache Commons Lang and the StringUtils.chompfunction
使用 Apache Commons Lang 和StringUtils.chomp函数