Java分批次处理File文件,固定行数为一个批次

接着前面那个案例,我们有一个file文件,里面有a b c d e f g h i j 一共10条数据,我们需要以4条为一批,分成3批处理,即第一批是a b c d,第二批数据是e f g h,第三批数据是i j,所以按照这样的逻辑,之前的思路是采用采用Map<Integer, List<TSSBBody>>方式装数据,有多少批数据,就有多少个键值对,至于List的size(),必然是4 4 2,期间遇到一个坑,解决了,后来经过效率测试,这样的逻辑处理,有些费时,10条数据可能看不出差异,但是上万的数据处理起来,竟然没有直接读取file文件效率快,那么,我们如何按批次处理这个file文件呢?

既然要按照批次处理文件,我们首先肯定需要判断文件总的有多少行,然后再考虑多少行为一个批次,最后一个批次有多少行文件,那么,如何判断文件总的有多少行呢?我们可以用LineNumberReader,代码如下:

// 文件内容的总行数
	static int getTotalLines(File file) throws IOException {
		FileReader in = new FileReader(file);
		LineNumberReader reader = new LineNumberReader(in);
		String s = reader.readLine();
		int lines = 0;
		while (s != null) {
			lines++;
			s = reader.readLine();
		}
		reader.close();
		in.close();
		return lines;
	}

接下来,我们就需要明确的是多少行为一个批次?最后一个批次多少行?确定好这些因素,循环处理每一批,这逻辑就实现了,但是这里需要确定一个方法,就是之前一篇文章所说过的,如何按固定行数处理文件,这里为了方便,贴下代码:

// 读取文件指定行内容
	static String readLineNumberString(File sourceFile, int lineNumber) throws IOException {
		String s = null;
		if (lineNumber < 0 || lineNumber > getTotalLines(sourceFile)) {
			System.out.println("传入行数" + lineNumber + "有误,不在范围之内");
		} else {
			InputStreamReader inputReader = null;
			BufferedReader bufferReader = null;
			OutputStream outputStream = null;
			try {
				InputStream inputStream = new FileInputStream(sourceFile);
				inputReader = new InputStreamReader(inputStream, "UTF-8");
				bufferReader = new BufferedReader(inputReader);

				// 读取一行
				String lineContent = null;
				StringBuffer strBuffer = new StringBuffer();
				int currentReadLine = 0;
				while ((lineContent = bufferReader.readLine()) != null) {
					currentReadLine++;
					if(currentReadLine==lineNumber){
						strBuffer.append(lineContent);
						break;
					}
				}
				s = strBuffer.toString();
			} catch (IOException e) {
				System.out.println("" + e.getMessage());
			} finally {
				IOCloseUtil.closeAll(outputStream, bufferReader, inputReader);
			}
		}
		return s;
	}
public static void main(String[] args) {
		String fileName = "1.txt";
		File file = new File("E:\\ceshi\\" + fileName);
		try {
			int sum = 10; //总行数--调用getTotalLines()方法即可
			int pi = 4; //多少行为一个批次
			int sumPi = (int) Math.ceil((double) 10 / 4); //分多少个批次
			System.out.println("一共分" + sumPi + "个批次");
			for (int i = 0; i < sumPi; i++) {
				Integer batch_total_no = 4;

				// 如果是最后一页,这一页的数据量为余数
				if (i + 1 == sumPi && sum % 4 > 0) {
					batch_total_no = sum % 4;
				}

				System.out.println("正在处理第" + (i + 1) + "个批次");
				for (int j = 1; j <= batch_total_no; j++) {
					if (i == sumPi) {
						break;
					} else {
						String aa = readLineNumberString(file, i * pi + j);
						System.out.println((i * pi + j) + "===" + aa);
					}
				}
			}

		} catch (IOException e) {
			e.printStackTrace();
		}
	}

执行main方法,即可实现题目所说效果,当然,实际处理逻辑中,不可能简单的输出每一行就可以了,肯定需要对每一行数据做相应业务逻辑处理。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值