Для начала у меня есть два процесса, которые работают одновременно и поддерживают друг друга.Один процесс читает простой плоский файл, который содержит снимки данных, разделенные временными метками.Это приложение просто открывает этот файл (без блокировки файлов), считывает снимок и помещает его в другой файл с именем topology.netviz
(с блокировкой файлов).Второе приложение читает topology.netziv
(с блокировкой файла) и передает данные во временный файл, чтобы уменьшить задержку программирования, удерживающего блокировку между другим процессом.перенести данные во временный файл во втором процессе, странные символы / поврежденные данные передаются.Ниже приведен код, который позволит вам понять, в чем может быть проблема.
Процесс 1:
try {
// Determine if File Exists
topologyFile = new File(Settings.NODE_TOPOLOGY_PATH);
if (!topologyFile.exists())
topologyFile.createNewFile();
// FileChannel Gives the Ability to Create a File Lock
FileChannel channel =
new RandomAccessFile(topologyFile, "rwd").getChannel();
// Use the FileChannel to Create a Lock on the 'distance.dat' (Blocking Method)
FileLock lock = channel.lock();
// Delete Files Contents
channel.truncate(0);
// Convert 'data' into ByteBuffer
ByteBuffer buffer = ByteBuffer.wrap(data);
// Write 'buffer' to 'channel'
channel.write(buffer, 0);
// Release Lock
lock.release();
// Close Channel
channel.close();
}
catch(IOException error)
{
System.out.println("Topology Thread: FileChannel; I/O Error Occured");
}
catch(NonWritableChannelException error)
{
System.
out.println("Topology Thread: FileChannel; File is not Writeable");
}
Процесс 2:
try {
// Determine if File Exists
topologyFileTemp = new File("tmp/topology.dat");
if (topologyFileTemp.exists())
topologyFileTemp.delete(); // Should Never Occur Unless Program Crashes
// Recreate 'topologyFileTemp'
topologyFileTemp = new File("tmp/topology.dat");
topologyFileTemp.createNewFile();
// Determine if File Exists
topologyFile = new File("topology.netviz");
if (!topologyFile.exists())
topologyFile.createNewFile(); // Should Never Occur
// Initialize Data Container from 'topology.netviz' in the Form of Bytes
ByteBuffer topologyData =
ByteBuffer.allocate((int)topologyFile.length());
// FileChannel Gives the Ability to Create a File Lock for 'topology.netviz'
FileChannel rChannel =
new RandomAccessFile(topologyFile, "rwd").getChannel();
// Use the FileChannel to Create a Lock on the 'distance.dat' (Blocking Method)
FileLock lock = rChannel.lock();
// Grab Data from 'topology.netviz'
rChannel.read(topologyData);
// Release Lock
lock.release();
// Close Channel
rChannel.close();
// FileChannel Gives the Ability to Create a File Lock for 'tmp/topology.dat'
FileChannel wChannel =
new RandomAccessFile(topologyFileTemp, "rw").getChannel();
// Reset Buffers Position
topologyData.position(0);
// Write 'topologyData' to 'tmp/topology.dat'
wChannel.write(topologyData);
// Close the file
wChannel.close();
}
catch(IOException error)
{
System.out.println("Topology Thread: FileChannel; I/O Error Occured");
}
catch(NonWritableChannelException error)
{
System.out.
println("Topology Thread: FileChannel; File is not Writeable");
}