> readFileAppointLine(String filePathName, Integer line) throws Exception;
package com.chuangqi.tool.readFile;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
* @Description 读取txt文件
* @Author qizhentao
* @Date 2020/3/12 13:58
* @Version 1.0
public class ReadTxt implements ReadStrategy {
@Override
public List<List<Object>> readFileAppointLine(String filePathName, Integer line) throws Exception {
int index = 0; // 索引
if(line == null){
line = 50; // 如果不传入显示多少行,则默认展示50行
// 读取文件
FileInputStream fileInputStream = new FileInputStream(filePathName);
Scanner scanner = new Scanner(fileInputStream) ;
// 获取文件第一行数据,设为title
String nextLine = scanner.nextLine();
// title内容
String [] title = nextLine.split("\\s+");
// 列数
int lineNumber = title.length;
// 封装最终数据
List<List<Object>> list = new ArrayList<>(lineNumber);
list.add(Arrays.asList(title));
// 用于存储每行数据
List<Object> lineList = new ArrayList();
while(scanner.hasNext()){
// 展示指定行数据
if(line != 0 && index >= (lineNumber * line)){
// 打印最终封装的数据
for (List li:list) {
Console.log(li);
fileInputStream.close();
scanner.close();
return list;
lineList.add(scanner.next());
// 读取完一行数据
if (++index % lineNumber == 0){
list.add(lineList);
lineList = new ArrayList();
//System.out.println(world);
continue;
//System.out.print(world + " ");
fileInputStream.close();
scanner.close();
return list;
package com.chuangqi.tool.readFile;
import java.util.List;
* @Description 读取dat文件
* @Author qizhentao
* @Date 2020/3/12 14:08
* @Version 1.0
public class ReadDat implements ReadStrategy{
@Override
public List<List<Object>> readFileAppointLine(String filePathName, Integer line) throws Exception {
ReadTxt readTxt = new ReadTxt();
return readTxt.readFileAppointLine(filePathName, line);
package com.chuangqi.tool.readFile;
import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;
import java.util.List;
* @Description 读取xls文件
* @Author qizhentao
* @Date 2020/3/12 14:10
* @Version 1.0
public class ReadXls implements ReadStrategy{
@Override
public List<List<Object>> readFileAppointLine(String filePathName, Integer line) throws Exception {
if(line == null){
line = 51;
// 读取xls、csv文件
ExcelReader reader = ExcelUtil.getReader(filePathName);
// 获取文件中所有内容
List<List<Object>> readAll = reader.read();
// 返回所有数据
if(line == 0){
return readAll;
// 封装指定条数内容
List<List<Object>> subList = readAll.subList(0, (line + 1));
/*// 打印
for (List li : subList) {
Console.log(li);
return subList;
package com.chuangqi.tool.readFile;
import java.util.List;
* @Description 读取csv文件
* @Author qizhentao
* @Date 2020/3/12 14:12
* @Version 1.0
public class ReadCsv implements ReadStrategy{
@Override
public List<List<Object>> readFileAppointLine(String filePathName, Integer line) throws Exception {
ReadXls readXls = new ReadXls();
return readXls.readFileAppointLine(filePathName, line);
package com.chuangqi.tool.readFile;
import cn.hutool.core.lang.Console;
import java.util.List;
* @Description 读取文件-策略封装
* @Author qizhentao
* @Date 2020/3/12 14:31
* @Version 1.0
public class ReadStrategyContent {
private ReadStrategy readStrategy;
public ReadStrategyContent(){
public ReadStrategyContent(ReadStrategy readStrategy){
this.readStrategy = readStrategy;
* 通过无参构造读取txt、dat、csv、xls文件内容
* @param filePathName 文件全路径
* @param line 读取行数,0表示读取全部内容
* @return
public List<List<Object>> getReadFile(String filePathName, Integer line){
if (filePathName.endsWith(".txt") || filePathName.endsWith(".TXT")){
readStrategy = new ReadTxt();
}else if(filePathName.endsWith(".dat") || filePathName.endsWith(".DAT")){
readStrategy = new ReadDat();
}else if(filePathName.endsWith(".csv") || filePathName.endsWith(".CSV")){
readStrategy = new ReadCsv();
}else if(filePathName.endsWith(".xls") || filePathName.endsWith(".xlsx") || filePathName.endsWith(".XLS") || filePathName.endsWith(".XLSX")){
readStrategy = new ReadXls();
return getStructureReadFile(filePathName, line);
* 通过有构造执行对应的方法
* @param filePathName 读取文件全路径
* @param line 读取行数,0表示读取全部内容
* @return
public List<List<Object>> getStructureReadFile(String filePathName, Integer line){
if (readStrategy == null){
Console.log("ReadStrategy不能为空");
try {
return readStrategy.readFileAppointLine(filePathName, line);
} catch (Exception e) {
e.printStackTrace();
return null;
// 测试
public static final String DAT = "C:\\Users\\cq\\Desktop\\Data1随机数30.DAT";
public static final String TXT = "C:\\Users\\cq\\Desktop\\Data1_Step_PZ.txt";
public static final String CSV = "C:\\Users\\cq\\Desktop\\csv测试.csv";
public static final String XLS = "C:\\Users\\cq\\Desktop\\xls测试.xls";
public static void main(String[] args) {
// 无参构造读取
long l = System.currentTimeMillis();
ReadStrategyContent readStrategyContent = new ReadStrategyContent();
List<List<Object>> readFile = readStrategyContent.getReadFile(TXT, 100000);
System.out.println(System.currentTimeMillis() - l);
// 文件行数 解析加载耗时(毫秒)
// 10000 130
// 100000 360
// 1000000 3500
for (List li:readFile) {
Console.log(li);
Console.log("读取行数:{}",readFile.size());
/*// 有参构造读取
ReadStrategyContent readStrategyContent = new ReadStrategyContent(new ReadTxt());
List<List<Object>> readFile = readStrategyContent.getReadFile("C:\\Users\\cq\\Desktop\\项目参考文档\\BS仿真评估\\gitLab\\测试导入文件\\Data1_Step_PZ.txt", 50);
for (List li:readFile) {
Console.log(li);
解析xls、csv文件所需要的pom<!-- 工具包 --> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <vers...
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;
以下是java代码,直接可用,不用手动计算异或值
此处的jdk版本需要1.8以上…,另外两个参数(解析文件路径和输出路径)需要改成自己的哦~
此处的原理是判断图片文件的十六进制特征码。
第一种:weChatImgRevert.java
package com;
在实际工作中, 我们需要读取一些报表之类的数据文件, 这些文件一般可以是.dat .txt 格式的 , 那么如何读取呢?
下面案例以 .txt 为例.
package wxy.IO;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOExc
1、 写一段程序,让其运行时的表现为触发了5次Young GC、3次Full GC、然后3次Young GC;
2、 如果一个Java进程突然消失了,你会怎么去排查这种问题?
3、 给了一段Spring加载Bean的代码片段,阐述一下具体的执行流程?
是不是看上去很难,是不是和自己准备的“题库”中的问题不一样?不知道从何处下手?如果你有这种感觉,那么说明你的技术还需要继续修炼。
面对如此多的技术面试,怎么样才能说自己的技术已经过关了呢?
String wxPath="C:\Users\Administrator\Documents\WeChat Files";
//保存路径(输出)
String savePath="C:\Users\Administrator\Desktop";
//开始解析
convert(wxPath, savePath);
* @param path 图片目录地址
* @param targetPath 转换后目录
但是还有一个场景不知道有没有考虑过?
因为大多数业务下,秒杀抢购时,其实还有一个支付业务。
在秒杀抢购成功后,库存表库存-1,但是用户需要在三分钟内支付,如果超时的话算作库存失败,这个时候应该库存要+1了。
像是这种场景,是否是说需要用延迟队列来实现?那思路又是什么?以下思路是否可以实现呢?例如当用户抢购成功后,MQ消费者的消费方法会在库存中-1,同时把用户的手机号和商品id作为标记,放置到延迟队列(设置过期三分钟)。此时,如果用户前端调用了支付方法,那么就从延迟队列中删除该消息。而延迟队列会在三分钟后消费,如果某个用户没在3分钟内支付,那么该消息就会在满3分钟时被延迟队列的方法执行,最后库存又+1.
【Seata】分布式事务框架原理解析
花哥码天下: