java 需要等待文件可用

njthzxwz  于 2022-12-21  发布在  Java
关注(0)|答案(3)|浏览(145)

下面是我需要将JSON文件转换为Excel文件的代码。从另一个方法加载JSON需要一些时间,所以我需要等待文件出现。

public class converter2_ES {

    @Test
    public void main() throws Exception { 
        LocalDateTime date = LocalDateTime.now();
        DateTimeFormatter dateformat = DateTimeFormatter.ofPattern("dd-MM-yyyy HH-mm-ss");
        String formatedate =date.format(dateformat);
        Workbook workbook = new Workbook(".//json_files//elastic_search.json");      
        //workbook.save(".//output-"+formatedate+".xlsx");  
        workbook.save(".//Excel_files//es_files//ES-"+formatedate+".xlsx");

        System.out.println("Elastic_searchjson file converted successfully");
    }
}
gjmwrych

gjmwrych1#

问题

在我的测试中,文件.//json_files//elastic_search.json实际上是由另一个测试编写的,我如何确保这个测试在将文件写入磁盘的测试之后运行?
这个问题必须从评论中摘录出来。

答案

答案是,这取决于...
一般来说,测试之间不应该有时间耦合,这意味着test2()不应该依赖于test1()的结果或行为。
有很多方法可以解决这个问题,可以通过在两个不同的类中进行测试来解决,每个类都有自己的特定setup()方法和@BeforeEach注解。
另一个解决方案是确保测试以正确的顺序运行,根据您使用的测试框架,有多种方法可以通过@Test注解添加顺序。

6mzjoqzu

6mzjoqzu2#

你应该做一个异步实现,也就是说,你应该等到上一个任务完成后再继续下一个任务,你可以参考这个简单的教程ANDROID - HTTP REQUEST USING ASYNCTASK TUTORIAL IN JAVA
下面是您可以参考的代码示例:

public class MainActivity extends AppCompatActivity {
    private Button btn;
    private EditText time;
    private TextView res;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        time = findViewById(R.id.in_time);
        btn = findViewById(R.id.btn_start);
        finalRes = findViewById(R.id.res);

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AsyncTaskRunner runner = new AsyncTaskRunner();
                String sleepTime = time.getText().toString();
                runner.execute(sleepTime);
            }
        });
    }

    private class AsyncTaskRunner extends AsyncTask<String, String, 
    String> {

        private String resp;
        ProgressDialog progressDialog;

        
        @Override
        protected void onPreExecute() {
            progressDialog = ProgressDialog.show(MainActivity.this,
                    "PleaseWait",
                    "Loading"+time.getText().toString()+ "secs");
        }

        @Override
        protected String doInBackground(String... params) {
            publishProgress("TimeSpent...");
            try {
                int time = Integer.parseInt(params[0])*1000;

                Thread.sleep(time);
                resp = "Time Spent" + params[0] + "secs";
            } catch (InterruptedException e) {
                e.printStackTrace();
                resp = e.getMessage();
            } catch (Exception e) {
                e.printStackTrace();
                resp = e.getMessage();
            }
            return resp;
        }

        @Override
        protected void onPostExecute(String result) {
            // execution of result of Long time consuming operation
            progressDialog.dismiss();
            finalRes.setText(result);
        }

    }
}
euoag5mw

euoag5mw3#

如果要等待其他程序创建文件:

  • How to wait on file creation--其中包含了如何使用WatchService的示例。但是,请注意,您会得到一个事件来指示文件已经创建,但不会得到一个事件来指示文件创建(即写入)已经完成。因此,根据save()方法的工作方式,您可能需要检查修改时间戳的文件大小,以查看它们何时停止更改。

从我对javadocs的阅读来看,WatchService也应该报告当前程序创建的文件的文件事件,但是可能有更好的方法,例如,如果你想等待另一个线程创建一个文件:

  • 如果使用裸线程或线程子类,请使用Thread.join()等待执行创建的线程完成。
  • 如果您使用的是ExecutorService而不是裸线程,请保留submit任务时返回的Future对象,并使用它来检测任务何时完成。

如果您在一些测试代码中这样做,WatchService可能有些过头了,一个简单的轮询循环(带sleep)测试目标文件是否已经创建可能就足够了。
如果你的代码是Swing或JavaFX应用程序的一部分,这些就不合适了。它们有自己的方式来执行一个长时间运行的任务,并在任务完成时采取行动。(如果你只是在UI事件循环中等待任务,你会阻塞事件循环。
Android将再次不同...

相关问题