`
Goro
  • 浏览: 173998 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

解决readLine() 不区分\r \n的问题。

    博客分类:
  • Java
阅读更多
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();
		}	
	}			
}
分享到:
评论
1 楼 sty00 2014-03-13  
  感谢分享

相关推荐

    Android实现表单上传文件

    在Android开发中,当涉及到与服务器进行数据交互,特别是上传文件时,如用户注册时上传头像,我们通常会遇到一个问题:内置的`HttpURLConnection`或`HttpClient`并不直接支持表单格式的文件上传。因此,我们需要采取...

    java精华

    `equalsIgnoreCase()` 方法用于忽略大小写比较两个字符串,这对于不区分大小写的比较非常有用。例如,如果用户输入 "BYE",而程序中需要的字符串是 "bye",使用 `equalsIgnoreCase()` 将会判断两者相等并退出程序。 ...

    2021-2022计算机二级等级考试试题及答案No.12045.docx

    - **域名**在DNS(Domain Name System)中不区分大小写。 **问题解析:** 题目表述为域名不分大小写。这是**正确**的说法。 ### 10. 超链接数据类型 **知识点概述:** - **超链接数据类型**:用于存储指向其他...

    C_基础知识

    - **定义**: 程序是指令的有序集合,这些指令指导计算机执行特定的任务或解决问题。 - **例子**: - 日常生活中的程序:例如去银行取钱的过程可以被看作是一个程序,它包括以下步骤: 1. 带上存折去取钱; 2. 填写...

    2009 达内Unix学习笔记

    tail [+/-[n][l][r|f]] [文件] 七、文件/目录的增删 echo 显示一行内容。 touch 如果文件/目录不存在,则创建新文件/目录;如果文件存在,那么就是更新该文件的最后访问时间, 用法 touch [-acm] [-r ref_file]...

    JAVA精华.docJAVA精华.doc

    这个程序使用了一个字节数组`buf`来存储输入的字符,然后根据输入的换行符('\n')或回车符('\r')进行处理。`System.in.read()`方法用于读取标准输入的一个字节,然后根据读取的字符进行适当的操作。如果输入是"bye",...

    《笨方法学python》第四版各练习笔记

    - 变量名遵循标识符规则,区分大小写,不能以数字开头。 - 变量可以存储不同类型的数据,如字符串、整数、浮点数等。 5. **格式化字符串**: - `%`操作符用于格式化输出,如`%s`代表字符串,`%d`代表整数,`%c`...

    Java小程序

    1. **提示用户输入**: `System.out.print("请输入5个数字,以回车键结束\r\n");` - 使用`System.out.print`方法输出提示信息。 2. **创建文件**: `numberfile = new File("D:\\doublenumber.txt");` - 使用`File`...

    使用Python文件读写,自定义分隔符(custom delimiter)

    在Python中进行文件读写时,通常我们使用内置的`open()`函数,它默认使用特定的换行符,如`\n`(Unix风格)、`\r`(Mac风格)或`\r\n`(Windows风格)。然而,有时候我们可能需要处理特殊格式的文件,其中的数据不是...

    C# for CSDN 乱七八糟的看不懂

    使用集合时,必须注意集合的生命期问题。如果有两个集合 L1 和 L2,使用 了 L1=L2; 后,只要 L2 生命期没有终结,它的以后的变化就可能会影响到 L1 的数值。因 此在赋值后应该及时销毁或者初始化 L2,以免发生不可...

    java获取http请求的Header和Body的简单方法

    3. 空行(CRLF, \r\n):用于区分请求头和请求体。 4. 请求体(Request Body):通常在POST或PUT请求中,用来传递数据。 在Java中,我们通常使用Servlet API来处理HTTP请求。`HttpServletRequest`接口提供了访问...

    Java中用Socket实现HTTP文件上传实例

    } else if (line.startsWith("\r\n")) { // End of headers, start reading file content byte[] fileBytes = readUntilDelimiter(reader, "--" + boundary); // Process fileBytes } } // Helper method to ...

Global site tag (gtag.js) - Google Analytics