gpt4 book ai didi

java - 使用线程文件写入和读取对象

转载 作者:太空宇宙 更新时间:2023-11-04 08:14:52 26 4
gpt4 key购买 nike

我有一个主线程,我们从中启动两个后续线程,分别执行文件写入和文件读取操作。我有另一个名为 orderDetails 的类,其中包含属性及其 getter 和 setter。当前程序的运行方式是一次性将对象列表写入文件并读回。

问题:我需要将对象(cust1)的内容写入文件并同时从文件中读回。必须对指定的所有对象(cust1,cust2)执行此操作。建议解决此问题的可能方法。

主类

public class MainThread  {
public static void main(String[] args) throws InterruptedException {
Thread1 td1=new Thread1();
Thread2 td2=new Thread2();
Thread t1=new Thread(td1);
Thread t2=new Thread(td2);
t1.start();
t1.sleep(100);
t2.start();
}
}

orderDetails 类 - 一个普通的 pojo 类

 public class orderDetails {
private String custName;
private double advancePaid;
private int mobileModel;
private boolean replacement;
private String problemFaced;
private boolean softwareRequirement;
public orderDetails(String custName, double advancePaid, int mobileModel,
boolean replacement, String problemFaced,
boolean softwareRequirement) {
super();
this.custName = custName;
this.advancePaid = advancePaid;
this.mobileModel = mobileModel;
this.replacement = replacement;
this.problemFaced = problemFaced;
this.softwareRequirement = softwareRequirement;
}
public boolean isSoftwareRequirement() {
return softwareRequirement;
}
public void setSoftwareRequirement(boolean softwareRequirement) {
this.softwareRequirement = softwareRequirement;
}
public int getMobileModel() {
return mobileModel;
}
public void setMobileModel(int mobileModel) {
this.mobileModel = mobileModel;
}
public String getProblemFaced() {
return problemFaced;
}
public void setProblemFaced(String problemFaced) {
this.problemFaced = problemFaced;
}
public boolean isReplacement() {
return replacement;
}
public void setReplacement(boolean replacement) {
this.replacement = replacement;
}
public double getAdvancePaid() {
return advancePaid;
}
public void setAdvancePaid(double advancePaid) {
this.advancePaid = advancePaid;
}
public String getCustName() {
return custName;
}
public void setCustName(String custName) {
this.custName = custName;
}

}

文件写入-将属性写入文件

 public class FileWriting implements Runnable {
orderDetails cust1=new orderDetails("vid",2000.00,2543,true,"display",false);
orderDetails cust2=new orderDetails("kesav",8000.00,7845,false,"battery",true);
ArrayList<orderDetails> orderArr=new ArrayList<orderDetails>();
orderDetails obj;
public void run() {
orderArr.add(cust1);
orderArr.add(cust2);
try {
for(orderDetails obj:orderArr)
{
fileOperations(obj);
}
}
catch (IOException e) {
e.printStackTrace();
}
}

public void fileOperations(orderDetails obj) throws IOException{
File f= new File("C:\\Users\\311518\\Desktop\\threadtest2.txt");
Calendar calNow = Calendar.getInstance();
Calendar orderDate;
SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
FileWriter fstream;
if(f.exists()){
//append mode
fstream = new FileWriter(f,true);
}
else
{
// to open a new file
f.createNewFile();
// write mode
fstream = new FileWriter(f,false);
}
BufferedWriter out = new BufferedWriter(fstream);
out.write(obj.getCustName()+" "+obj.getMobileModel()+" "+obj.getProblemFaced()+" "+obj.getAdvancePaid()+" "+obj.isReplacement()+" "+obj.isSoftwareRequirement());
double balanceAmt=obj.getAdvancePaid()-200;
out.write(" "+balanceAmt);
orderDate = (Calendar) calNow.clone();
out.write(" "+formatter.format(orderDate.getTime()));
orderDate.add(Calendar.DAY_OF_YEAR, + 10);
out.write(" "+formatter.format(orderDate.getTime()));
out.newLine();
out.close();
}
}

文件读取类-从文件中读取属性

 public class FileReading implements Runnable{
File f= new File("C:\\Users\\311518\\Desktop\\threadtest2.txt");
public void run() {
try {
readingText();
System.out.println("Thanks for ur order");
} catch (IOException e) {
e.printStackTrace();
}
}
public void readingText() throws IOException{
String [] temp = null;
FileReader fr = new FileReader(f);
BufferedReader br = new BufferedReader(fr);
String s;
System.out.println("--------ORDER DETAILS------");
System.out.println("Name Model Adv Prob Replacement S/w Bal OrderDate Deliverdate ");
while((s = br.readLine()) != null) {
//display ordered details
temp = s.toString().split("\n");
for(int i=0;i<temp.length;i++){
System.out.println(temp[i]);
}
}

}
}

最佳答案

您可以尝试使用公共(public)锁对象,在写入时对其加锁,并等待写入完成后再进行读取。示例:

写:

for(orderDetails obj:orderArr)
{
synchronized(FileWriting.class)
{
fileOperations(obj);
}
Thread.yield();
}

阅读:

synchronized(FileWriting.class) {
readingText();
Thread.yield();
}

也许您还应该在循环中添加阅读,并让编写器在完成写入时发出信号,以便读者可以停止。

关于java - 使用线程文件写入和读取对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10615867/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com