java读取文本文件,每行一条记录,现在要读出这些字段进行加工处理,在某个位置添加还要字段进去

java读取文本文件,每行一条记录,现在要读出这些字段进行加工处理,在某个位置添加还要字段进去,第1张

/

文件处理方法

@param iFile

输入文件对象

@param oFile

输出文件对象

@throws Exception

/

public void process(File iFile,File oFile) throws Exception{

BufferedReader reader=new BufferedReader(new FileReader(iFile));

BufferedWriter writer=new BufferedWriter(new FileWriter(oFile));

String line=null;

while((line=readerreadLine())!=null){

// line 就是你拿到的每一行

String[] arr = linesplit(","); //用逗号分割,得到每一行所有的字段数组

// 然后在处理新增字段,这个也好搞

StringBuilder sb = new StringBuilder();

for(int i = 0; i < arrlength; i++) { //遍历所有字段

sbappend(arr[i])append(","); //新的记录,字段用逗号分隔

if(i == [要插入位置的索引]) {

sbappend("我是新插的内容")append(",");

}

}

// 把最后的一个分割逗号删掉即可

。。。。。。

再写入到文件中 xxx (省略)

}

writerflush();

writerclose();

readerclose();

}

涉及到java中读写文件的IO *** 作。

获取一个文本文件的行数较为方便的方法,是通过BufferedReader类的readLine()方法,间接的统计行数。

源代码:

public static int getTextLines() throws IOException {

String path = "c:\\jobtxt" ;// 定义文件路径

FileReader fr = new FileReader(path); //这里定义一个字符流的输入流的节点流,用于读取文件(一个字符一个字符的读取)

BufferedReader br = new BufferedReader(fr); // 在定义好的流基础上套接一个处理流,用于更加效率的读取文件(一行一行的读取)

int x = 0; // 用于统计行数,从0开始

while(brreadLine() != null) { // readLine()方法是按行读的,返回值是这行的内容

x++; // 每读一行,则变量x累加1

}

return x; //返回总的行数

}

package demo;

import javaioBufferedInputStream;

import javaioBufferedReader;

import javaioFile;

import javaioFileInputStream;

import javaioInputStreamReader;

import javautilArrayList;

import javautilList;

public class DemoApp {

public static void main(String[] args) throws Exception {

// 指定的文件

File file = new File("E:\\Workspaces\\eclipse37\\Demo\\src\\testtxt");

// 装载list

List<String> list = new ArrayList<String>();

// 读取文件

FileInputStream fis = new FileInputStream(file);

BufferedReader br = new BufferedReader(new InputStreamReader(fis));

StringBuffer buffer = new StringBuffer();

String line;

int i = 0;

while ((line = brreadLine()) != null) {

Systemoutprintln(line);

if (i == 0) {

bufferappend(line + "\n");

} else {

// 判断截取点

if (linesubstring(0, 1)equals(">")) {

listadd(buffertoString());

buffer = new StringBuffer();

bufferappend(line + "\n");

} else {

bufferappend(line + "\n");

}

}

i++;

}

if (line == null) {

listadd(buffertoString());

}

// test

Systemoutprintln("--------------------------");

for(int j=0; j<listsize(); j++) {

Systemoutprintln( j + ":   " + listget(j));

Systemoutprintln("-----------------------");

}

}

}

你把原来程序中直接读的地方,改成调用上面的函数,由该函数统一读行。这样,不管是你有 N 个线程,还是一个线程,都不会发生读的行重复,或者读的行不完整的现象了。

为了充分利用多线程读取,就需要把文件划分成多个区域,供每个线程读取。那么就需要有一个算法来计算出每个线程读取的开始位置和结束位置。那么首先根据配置的线程数和文件的总长度计,算出每个线程平均分配的读取长度。

但是有一点,由于文件是纯文本文件,必须按行来处理,如果分割点在某一行中间,那么这一行数据就会被分成两部分,分别由两个线程同时处理,这种情况是不能出现的。所以各个区域的结束点上的字符必须是换行符。第一个区域的开始位置是0,结束位置首先设为(文件长度/线程数),如果结束点位置不是换行符,就只能加1,直到是换行符位置。

如果多线程 *** 作,那么需要保证多个线程 *** 作同一个对象,此外请保证先有线程放进内容,其他线程才能拿出数据。

附上具体参考代码:

public class Test{

public static void main(String args[])throws Exception{

File file = new File("D:\\Testjava");//Text文件

BufferedReader br = new BufferedReader(new FileReader(file));//构造一个BufferedReader类来读取文件

String s = null;

while((s = brreadLine())!=null){//使用readLine方法,一次读一行

Systemoutprintln(s);

}

brclose();;

}

}

import javaioBufferedReader;

import javaioFile;

import javaioFileReader;

import javaioRandomAccessFile;

import javanioByteBuffer;

import javanioMappedByteBuffer;

import javaniochannelsFileChannel;

public class ReadBig {

public static String fff = "C:\\mq\\read\\fromxml";

public static void main1(String[] args) throws Exception {

final int BUFFER_SIZE = 0x300000;// 缓冲区大小为3M

File f = new File(fff);

/

map(FileChannelMapMode mode,long position, long size)

mode - 根据是按只读、读取/写入或专用(写入时拷贝)来映射文件,分别为 FileChannelMapMode 类中所定义的

READ_ONLY、READ_WRITE 或 PRIVATE 之一

position - 文件中的位置,映射区域从此位置开始;必须为非负数

size - 要映射的区域大小;必须为非负数且不大于 IntegerMAX_VALUE

所以若想读取文件后半部分内容,如例子所写;若想读取文本后1/8内容,需要这样写map(FileChannelMapModeREAD_ONLY,

flength()7/8,flength()/8)

想读取文件所有内容,需要这样写map(FileChannelMapModeREAD_ONLY, 0,flength())

/

MappedByteBuffer inputBuffer = new RandomAccessFile(f, "r")

getChannel()map(FileChannelMapModeREAD_ONLY,

flength() / 2, flength() / 2);

byte[] dst = new byte[BUFFER_SIZE];// 每次读出3M的内容

long start = SystemcurrentTimeMillis();

for (int offset = 0; offset < inputBuffercapacity(); offset += BUFFER_SIZE) {

if (inputBuffercapacity() - offset >= BUFFER_SIZE) {

for (int i = 0; i < BUFFER_SIZE; i++)

dst[i] = inputBufferget(offset + i);

} else {

for (int i = 0; i < inputBuffercapacity() - offset; i++)

dst[i] = inputBufferget(offset + i);

}

int length = (inputBuffercapacity() % BUFFER_SIZE == 0) BUFFER_SIZE

: inputBuffercapacity() % BUFFER_SIZE;

Systemoutprintln(new String(dst, 0, length));// new

// String(dst,0,length)这样可以取出缓存保存的字符串,可以对其进行 *** 作

}

long end = SystemcurrentTimeMillis();

Systemoutprintln("读取文件文件一半内容花费:" + (end - start) + "毫秒");

}

public static void main2(String[] args) throws Exception {

int bufSize = 1024;

byte[] bs = new byte[bufSize];

ByteBuffer byteBuf = ByteBufferallocate(1024);

FileChannel channel = new RandomAccessFile(fff, "r")getChannel();

while (channelread(byteBuf) != -1) {

int size = byteBufposition();

byteBufrewind();

byteBufget(bs); // 把文件当字符串处理,直接打印做为一个例子。

Systemoutprint(new String(bs, 0, size));

byteBufclear();

}

}

public static void main(String[] args) throws Exception {

BufferedReader br = new BufferedReader(new FileReader(fff));

String line = null;

while ((line = brreadLine()) != null) {

Systemoutprintln(line);

}

}

}

以上就是关于java读取文本文件,每行一条记录,现在要读出这些字段进行加工处理,在某个位置添加还要字段进去全部的内容,包括:java读取文本文件,每行一条记录,现在要读出这些字段进行加工处理,在某个位置添加还要字段进去、java中怎么获得一个文本文件的行数、java下文本文件读取并分割等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9553981.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-29
下一篇2023-04-29

发表评论

登录后才能评论

评论列表(0条)

    保存