高分悬赏:Java语言怎么从一个txt文本文件的开始删除n行,具体的代码怎么写
有文本文件的话,我可以帮你写一个
不一定是要删除n行,跳过也行。如果一定是删除的话,可以用list的remove();但是这样下标会改变,需要注意。
File file = new File("");
StringBuffer sb = new StringBuffer();
try {
List<String> lines = FileUtils.readLines(file);
for (int i = 0; i < lines.size(); i++) {
if (i < 10) { // 跳过前10行
continue;
}
sb.append(lines.get(i)); // 行内容
sb.append(System.lineSeparator()); // 换行
}
FileUtils.write(new File(""), sb.toString());
} catch (IOException e) {
e.printStackTrace();
}
这种方式可以跳过任何行,相当于删除,然后重新写入另一个文件里。
可以试试RandomAccessFile
/**
* @param file 文件
* @param lineNum 删除行数
* @throws IOException 文件操作异常
*/
private static void removeFirstLines(File file, int lineNum) throws IOException {
RandomAccessFile raf = null;
raf = new RandomAccessFile(file, "rw");
long writePosition = raf.getFilePointer();
for (int i = 0; i < lineNum; i++) {
String line = raf.readLine();
if (line == null) {
return;
}
}
long readPosition = raf.getFilePointer();
byte[] buff = new byte[1024];
int n;
while (-1 != (n = raf.read(buff))) {
raf.seek(writePosition);
raf.write(buff, 0, n);
readPosition += n;
writePosition += n;
raf.seek(readPosition);
}
raf.setLength(writePosition);
}
总体思路就是把文本读出来,跳过前N行,再删除文本,再新建文本,在把读出来的文本贴回去,不过这个操作过程中要注意字符编码
public static void delNline(String filePath,int n) throws IOException {
File file = new File(filePath);
ArrayList<String> arrayList = new ArrayList<>();
InputStreamReader inputReader = new InputStreamReader(new FileInputStream(file),"GBK");
BufferedReader bf = new BufferedReader(inputReader);
String str;
int line = 0;
while ((str = bf.readLine()) != null) {
if(line++<n){
//前面n行都不要
continue;
}
arrayList.add(str);
}
bf.close();
inputReader.close();
//删掉文本
file.delete();
//再创建文本
file = new File(filePath);
file.createNewFile();
//再把读出去的数据写回去
Writer writer = new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream(file,true), StandardCharsets.UTF_8));
arrayList.forEach(sec-> {
try {
writer.write(sec+"\r\n");
} catch (IOException e) {
e.printStackTrace();
}
});
writer.flush();
writer.close();
}
最好不要把文件内容都都读出来,如果文件大的话,会占用太多的内存,跳过前N行,后面边读边写
几十G以下这种不算太大也不算太小的这种可以用第三方软件例如Emeditor大文本编辑器或者自己写一个IO流程序来处理,
文件太大可以考虑一些大数据平台的组件如使用kettle进行去除空行,或编写一些代码例如Spark/Flink/Mapreduce这一类的代码,效率会快一点.这一类的代码网上应该还是很好找的.