JAVA:我的两个应用程序如何访问同一个文件?

JAVA:我的两个应用程序如何访问同一个文件?,java,file,javax.imageio,Java,File,Javax.imageio,我制作了两个应用程序,设计为并发运行(我不想将它们合并),一个从某个文件读取,另一个写入。当一个或另一个运行时没有错误,但是如果它们都运行get,则访问被拒绝错误。 第一组的相关代码: class MakeImage implements Runnable { @Override public void run() { File file = new File("C:/Users/jeremy/Desktop/New folder

我制作了两个应用程序,设计为并发运行(我不想将它们合并),一个从某个文件读取,另一个写入。当一个或另一个运行时没有错误,但是如果它们都运行get,则访问被拒绝错误。 第一组的相关代码:

    class MakeImage implements Runnable {
        @Override
        public void run() {
            File file = new File("C:/Users/jeremy/Desktop/New folder (3)/test.png");
            while (true) {


                try{
//make image
                if(image!=null)
                {
                    file.createNewFile();
                ImageIO.write(image, "png", file);
                hello.repaint();}}
                catch(Exception e)
                {
                    e.printStackTrace();
                }

                }
    }
}   
第二组的相关代码:

            BufferedImage image = null;
            try {
                // Read from a file
                image = ImageIO.read(new File("C:/Users/jeremy/Desktop/New folder (3)/test.png"));
            }
            catch(Exception e){
                e.printStackTrace();
            }
            if(image!=null)
            {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ImageIO.write( image, "png", baos );
            baos.flush();
            byte[] imageInByte = baos.toByteArray();
            baos.close();
            returns=Base64.encodeBase64String(imageInByte);
            }

我看了这个:,但这是当两个都写入文件时,这里只有一个。我尝试了前一个答案中建议的“稍后重试”方法,但没有任何运气。任何帮助都将不胜感激。

在修改文件的方法上使用
synchronized

编辑:

根据线程安全类的定义,它是这样的。。“一个类被认为是线程安全的,它在底层操作系统交错和调度的情况下正常工作,没有来自客户端的同步机制”

我相信有一个文件要在另一台机器上访问,所以如果它存在的话,一定有某种客户机-服务器机制。。然后让服务器端拥有同步机制,那么有多少客户端访问它就无关紧要了


如果没有,同步就足够了

在修改文件的方法上使用
synchronized

编辑:

根据线程安全类的定义,它是这样的。。“一个类被认为是线程安全的,它在底层操作系统交错和调度的情况下正常工作,没有来自客户端的同步机制”

我相信有一个文件要在另一台机器上访问,所以如果它存在的话,一定有某种客户机-服务器机制。。然后让服务器端拥有同步机制,那么有多少客户端访问它就无关紧要了


如果没有,同步就足够了

除非您使用某种OS级别的文件锁定并检查锁定,否则您将无法非常轻松地可靠地执行此操作。一种相当可靠的管理方法是使用目录中的另一个文件作为信号量,在写入或读取时“触摸”它,在完成后将其删除。在访问文件之前检查信号量是否存在。否则,您将需要使用某种数据库来存储文件锁(保证一致性)并在那里检查它


这就是说,你真的应该把它合并成一个程序。

除非你使用操作系统级的文件锁定,并检查锁,否则你将无法很容易地可靠地做到这一点。一种相当可靠的管理方法是使用目录中的另一个文件作为信号量,在写入或读取时“触摸”它,在完成后将其删除。在访问文件之前检查信号量是否存在。否则,您将需要使用某种数据库来存储文件锁(保证一致性)并在那里检查它

也就是说,你真的应该把它合并成一个程序。

试试看

这是一个有用但非常危险的功能。它是这样的:“如果为同一个文件创建不同的RandomAccessFile实例,则可以同时写入文件的不同部分。”
您可以使用seek方法创建指向文件不同部分的多个线程,并且多个线程可以同时更新文件。Seek允许您移动到文件的任何部分,即使它不存在(在EOF之后),因此您可以移动到新创建的文件中的任何位置,并在该位置写入字节。您可以打开同一文件的多个实例,同时查找不同的位置和写入多个位置。

试试看

这是一个有用但非常危险的功能。它是这样的:“如果为同一个文件创建不同的RandomAccessFile实例,则可以同时写入文件的不同部分。”

您可以使用seek方法创建指向文件不同部分的多个线程,并且多个线程可以同时更新文件。Seek允许您移动到文件的任何部分,即使它不存在(在EOF之后),因此您可以移动到新创建的文件中的任何位置,并在该位置写入字节。您可以打开同一文件的多个实例,同时查找不同的位置并写入多个位置。

这些程序在不同的虚拟机中运行,这有什么帮助?我不知道他在哪里说这是一台不同的机器。根据代码,这显然不是一台不同的机器。那里有一个目录…你建议使用信号量将使用synchronized关键字,没有它信号量将无法工作。。。所以如果你说这不是两个不同的虚拟机。。。。。。我看不出有人提到程序在不同的虚拟机上运行,这有什么帮助?我看不出他说这是一台不同的机器。从代码来看,这显然不是一台不同的机器。那里有一个目录…你建议使用信号量将使用synchronized关键字,没有它信号量将无法工作。。。所以如果你说这不是两个不同的虚拟机。。。。。。我没有看到任何地方提到过它