0

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

    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);
            }

我看了这个:Java:如何处理试图修改同一个文件的两个进程,但那是当两者都写入文件时,这里只有一个。我按照前者的答案尝试了稍后重试的方法,但没有任何运气。任何帮助将不胜感激。

4

3 回答 3

3

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

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

于 2012-07-17T18:14:52.810 回答
0

synchronized修改文件的方法上

编辑:

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

我相信有一个文件要在不同的机器上访问,所以必须有一些客户端 - 服务器机制,如果它存在..那么让服务器端有同步机制,然后有多少客户端并不重要访问它...

如果没有,同步就绰绰有余了…………

于 2012-07-17T18:10:00.200 回答
0

尝试RandomAccessFile

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

于 2012-07-17T18:15:55.473 回答