csdn上碰到一个提问者希望只在\n时,才换行来读取文本文件的每一行。
但java的BufferedReader#readLine() 不区分\r 还是\n 都会换到下一行。
并且提问者的文件还特别大,不能一次全读到内存里来。
为了这个写了个自己的类。 (还没好好测过。。。有bug欢迎留言)
package sh.pl;
import java.io.IOException;
import java.io.Reader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
public class LineReader {
private static final int BUFFER_SIZE = 4096;
private Reader in;
private int bufferSize;
private List<String> bufferedLines;
private String lineSeparator;
private String preString;
public LineReader(Reader in) {
if (in == null) {
throw new IllegalArgumentException("in is null");
}
this.in = in;
bufferedLines = new ArrayList<String>();
lineSeparator = System.getProperty("line.separator");
bufferSize = BUFFER_SIZE;
}
public void close() throws IOException {
in.close();
}
public void setBufferSize(int bufferSize) {
if (bufferSize <= 0) {
throw new IllegalArgumentException("bufferSize <= 0");
}
this.bufferSize = bufferSize;
}
public void setLineSeparator(String lineSeparator) {
if (lineSeparator == null) {
throw new IllegalArgumentException("lineSeparator is null");
}
this.lineSeparator = lineSeparator;
}
public String readLine() throws IOException {
if (bufferedLines.size() > 1) {
return bufferedLines.remove(0);
} else if (bufferedLines.size() == 1) {
preString = bufferedLines.remove(0);
return readLine();
} else {
char[] src = new char[bufferSize];
int len;
if ((len = in.read(src)) != -1) {
String bufferString = new String(src, 0, len);
if (preString != null) {
bufferString = preString + bufferString;
preString = null;
}
boolean returnDelims = false;
StringTokenizer token = new StringTokenizer(bufferString,
lineSeparator, returnDelims);
while (token.hasMoreTokens()) {
bufferedLines.add(token.nextToken());
}
if (bufferString.endsWith(lineSeparator)) {
bufferedLines.add("");
}
return readLine();
} else {
if (preString != null) {
String ret = preString;
preString = null;
return ret;
} else {
return null;
}
}
}
}
}
使用
LineReader lr = null;
try {
lr = new LineReader(new InputStreamReader(new FileInputStream(
fileName), yourFileEncode));
//指定换行符
lr.setLineSeparator("\n");
String line;
while ((line = lr.readLine()) != null) {
System.out.println("'" + line + "'");
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (lr != null) {
try {
lr.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
分享到:
相关推荐
在Android开发中,当涉及到与服务器进行数据交互,特别是上传文件时,如用户注册时上传头像,我们通常会遇到一个问题:内置的`HttpURLConnection`或`HttpClient`并不直接支持表单格式的文件上传。因此,我们需要采取...
tail [+/-[n][l][r|f]] [文件] 七、文件/目录的增删 echo 显示一行内容。 touch 如果文件/目录不存在,则创建新文件/目录;如果文件存在,那么就是更新该文件的最后访问时间, 用法 touch [-acm] [-r ref_file]...
`equalsIgnoreCase()` 方法用于忽略大小写比较两个字符串,这对于不区分大小写的比较非常有用。例如,如果用户输入 "BYE",而程序中需要的字符串是 "bye",使用 `equalsIgnoreCase()` 将会判断两者相等并退出程序。 ...
- **域名**在DNS(Domain Name System)中不区分大小写。 **问题解析:** 题目表述为域名不分大小写。这是**正确**的说法。 ### 10. 超链接数据类型 **知识点概述:** - **超链接数据类型**:用于存储指向其他...
这个程序使用了一个字节数组`buf`来存储输入的字符,然后根据输入的换行符('\n')或回车符('\r')进行处理。`System.in.read()`方法用于读取标准输入的一个字节,然后根据读取的字符进行适当的操作。如果输入是"bye",...
- 变量名遵循标识符规则,区分大小写,不能以数字开头。 - 变量可以存储不同类型的数据,如字符串、整数、浮点数等。 5. **格式化字符串**: - `%`操作符用于格式化输出,如`%s`代表字符串,`%d`代表整数,`%c`...
1. **提示用户输入**: `System.out.print("请输入5个数字,以回车键结束\r\n");` - 使用`System.out.print`方法输出提示信息。 2. **创建文件**: `numberfile = new File("D:\\doublenumber.txt");` - 使用`File`...
在Python中进行文件读写时,通常我们使用内置的`open()`函数,它默认使用特定的换行符,如`\n`(Unix风格)、`\r`(Mac风格)或`\r\n`(Windows风格)。然而,有时候我们可能需要处理特殊格式的文件,其中的数据不是...
使用集合时,必须注意集合的生命期问题。如果有两个集合 L1 和 L2,使用 了 L1=L2; 后,只要 L2 生命期没有终结,它的以后的变化就可能会影响到 L1 的数值。因 此在赋值后应该及时销毁或者初始化 L2,以免发生不可...
3. 空行(CRLF, \r\n):用于区分请求头和请求体。 4. 请求体(Request Body):通常在POST或PUT请求中,用来传递数据。 在Java中,我们通常使用Servlet API来处理HTTP请求。`HttpServletRequest`接口提供了访问...
} else if (line.startsWith("\r\n")) { // End of headers, start reading file content byte[] fileBytes = readUntilDelimiter(reader, "--" + boundary); // Process fileBytes } } // Helper method to ...