java多线程读写文件

java多线程读写文件,第1张

public static void main(String[] args) {

File data = new File("data.txt")

try {

InputStreamReader read = new InputStreamReader(new FileInputStream(

data), "UTF-8")

final BufferedReader bufferedReader = new BufferedReader(read)

for (int i = 0i <5i++) {

new Thread(new Runnable() {

@Override

public void run() {

String lineTXT = null

synchronized (bufferedReader) {

try {

while ((lineTXT = bufferedReader.readLine()) != null) {

System.out.println(Thread.currentThread()+":"+lineTXT)

bufferedReader.notify()

bufferedReader.wait()

}

} catch (IOException e) {

e.printStackTrace()

} catch (InterruptedException e) {

e.printStackTrace()

}finally{

bufferedReader.notifyAll()

}

}

}

}).start()

}

} catch (UnsupportedEncodingException e) {

e.printStackTrace()

} catch (FileNotFoundException e) {

e.printStackTrace()

}

}

1、采用public static的变量存储这一数值,每个线程都往这一共有静态变量里写入已复制大小。 2、采用Callable方式实现多线程,将结果作为返回值返回到主线程。这一方法只能在所有子线程都完成之后才能通过future获取。

这个是我写的三个类,用于多线程 *** 作读取文件内容和写入文件内容,不知道是不是你合你味口。

________________第一个类______读取内容__写入内容____________________

package pro

import java.io.*

public class ReadFileToWriteOtherFile {

private File oldFile

private File newFile

private BufferedReader br

private BufferedWriter bw

private String totalString=""

private Boolean flag=true //用于标记文件名是否存在 true表示存在

public ReadFileToWriteOtherFile()

{

oldFile=null

newFile=null

br=null

bw=null

System.out.println("初始化成功")

}

public void readInfoFromFile(String fileName)

{

System.out.println("开始读取")

try

{

oldFile=new File(fileName)

if(oldFile.exists()) //如果文件存在

{

System.out.println("存在")

br=new BufferedReader(new FileReader(oldFile))

String info=br.readLine()//读取一行

while(info!=null)

{

totalString+=info //将读取到的一行添加到totalString中

info=br.readLine() //再读取下一行

//System.out.println(totalString)

}

System.out.println("读取完成,准备写入…………")

}

else //如果文件不存在

{

System.out.println("文件不存在")

flag=false //标记该文件不存在

}

// System.out.println("totalString="+totalString)

}

catch(FileNotFoundException e)

{

System.out.println(e)System.out.println("开始读取中1")

}

catch(IOException e)

{System.out.println(e)System.out.println("开始读取中2")}

}

public void writeInfoToFile(String fileName)

{

if(!flag) //如果标记前面的文件不存在,则return

{

flag=true //改回原来的文件标记符

return

}

try

{

newFile=new File(fileName)

if(newFile.exists()) //如果存在,不用创建新文件

{

System.out.println("文件存在,可以写入!")

}

else //如果不存在,则创建一个新文件

{

System.out.println("文件不存在,准备创建新文件")

newFile.createNewFile()

System.out.println("文件创建成功,可以写入")

}

bw=new BufferedWriter(new FileWriter(newFile,true))

// System.out.println("totalString="+totalString)

bw.write(totalString,0,totalString.length())

bw.flush() //刷新缓冲区

System.out.println("写入完成")

totalString="\r\t" //清空原来的字符串

}

catch(FileNotFoundException e)

{System.out.println(e)}

catch(IOException e)

{System.out.println(e)}

}

}

________________第二个类______一个自定义的线程类____________________

package pro

import java.lang.Thread

public class MyThread extends Thread

{

private int index //用于数组的位置

private String[] fileNames //定义一个字符串数组

ReadFileToWriteOtherFile bftwo=new ReadFileToWriteOtherFile() //定义前面的自定义类

public MyThread(String[] fileNames,int index) //index表示数组位置标号

{

this.index=index

this.fileNames=fileNames

}

public void run()

{

bftwo.readInfoFromFile(fileNames[index])//传入数组中的字符串参数

bftwo.writeInfoToFile("b.txt")//传入写入的目的地文件

//index++ //数组位置加1

System.out.println("==============")//分隔线

}

}

________________第三个类______主程序____________________

package pro

//import org.springframework.context.ApplicationContext

//import org.springframework.context.support.ClassPathXmlApplicationContext

import java.io.*

public class BeanRunApp {

/**

* Method main

*

*

* @param args

*

*/

public static void main(String[] args)

{

/* ApplicationContext apc=new ClassPathXmlApplicationContext("beans.xml")

ClassRoom croom=(ClassRoom)apc.getBean("classRoom")

croom.out()

System.out.println("over")

*/

long startTime=System.currentTimeMillis()

String[] a={"a.txt","c.txt","d.txt","e.txt"} //用一个符品数组保存文件名

for(int i=0i<a.lengthi++) //用数组的长度来作为循环条件

{ //把这个数组和i的值作为构造函数传入线程类

MyThread myth=new MyThread(a,i)

System.out.println("--------------------------------")

myth.start() //执行

System.out.println("当前的线程是:"+myth.getName())

}

long endTime=System.currentTimeMillis()

System.out.println("耗时:"+(endTime-startTime)+"毫秒")

}

}


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

原文地址: http://outofmemory.cn/tougao/11420219.html

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

发表评论

登录后才能评论

评论列表(0条)

保存