1 package antlr; 2 3 10 11 import java.io.*; 12 13 18 public class PreservingFileWriter extends FileWriter { 19 protected File target_file; protected File tmp_file; 22 public PreservingFileWriter(String file) throws IOException 23 { 24 super(file+".antlr.tmp"); 25 26 target_file = new File(file); 28 29 File parentdir = target_file.getParentFile(); 30 if( parentdir != null ) 31 { 32 if (!parentdir.exists()) 33 throw new IOException("destination directory of '"+file+"' doesn't exist"); 34 if (!parentdir.canWrite()) 35 throw new IOException("destination directory of '"+file+"' isn't writeable"); 36 } 37 if( target_file.exists() && ! target_file.canWrite() ) 38 throw new IOException("cannot write to '"+file+"'"); 39 40 tmp_file = new File(file+".antlr.tmp"); 42 tmp_file.deleteOnExit(); 44 } 45 46 49 public void close() throws IOException 50 { 51 Reader source = null; 52 Writer target = null; 53 54 try { 55 super.close(); 57 58 char[] buffer = new char[1024]; 59 int cnt; 60 61 if( target_file.length() == tmp_file.length() ) 63 { 64 Reader tmp; 66 char[] buf2 = new char[1024]; 67 68 source = new BufferedReader(new FileReader(tmp_file)); 69 tmp = new BufferedReader(new FileReader(target_file)); 70 int cnt1, cnt2; 71 boolean equal = true; 72 73 while( equal ) 74 { 75 cnt1 = source.read(buffer,0,1024); 76 cnt2 = tmp.read(buf2,0,1024); 77 if( cnt1 != cnt2 ) 78 { 79 equal = false; 80 break; 81 } 82 if( cnt1 == -1 ) break; 84 for( int i = 0; i < cnt1; i++ ) 85 { 86 if( buffer[i] != buf2[i] ) 87 { 88 equal = false; 89 break; 90 } 91 } 92 } 93 source.close(); 95 tmp.close(); 96 source = tmp = null; 97 98 if( equal ) 99 return; 100 } 101 102 source = new BufferedReader(new FileReader(tmp_file)); 103 target = new BufferedWriter(new FileWriter(target_file)); 104 105 while(true) 106 { 107 cnt = source.read(buffer,0,1024); 108 if( cnt == -1 ) 109 break; 110 target.write(buffer, 0, cnt ); 111 } 112 } 113 finally { 114 if( source != null ) 115 { 116 try { source.close(); } 117 catch( IOException e ) { ; } 118 } 119 if( target != null ) 120 { 121 try { target.close(); } 122 catch( IOException e ) { ; } 123 } 124 } 125 } 126 } 127 | Popular Tags |