Java编程思想第4版[中文版](PDF格式)-第160部分
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
Pr。error(〃could not open 〃 + f);
}
return in;
}
static BufferedReader disOpen(String fname) {
return disOpen(new File(fname));
}
static DataOutputStream dosOpen(File f) {
DataOutputStream in = null;
try {
in = new DataOutputStream(
new BufferedOutputStream(
new FileOutputStream(f)));
} catch(IOException e) {
Pr。error(〃could not open 〃 + f);
}
return in;
}
static DataOutputStream dosOpen(String fname) {
return dosOpen(new File(fname));
}
static PrintWriter psOpen(File f) {
PrintWriter in = null;
try {
in = new PrintWriter(
new BufferedWriter(
new FileWriter(f)));
} catch(IOException e) {
Pr。error(〃could not open 〃 + f);
623
…………………………………………………………Page 625……………………………………………………………
}
return in;
}
static PrintWriter psOpen(String fname) {
return psOpen(new File(fname));
}
static void close(Writer os) {
try {
os。close();
} catch(IOException e) {
Pr。error(〃closing 〃 + os);
}
}
static void close(DataOutputStream os) {
try {
os。close();
} catch(IOException e) {
Pr。error(〃closing 〃 + os);
}
}
static void close(Reader os) {
try {
os。close();
} catch(IOException e) {
Pr。error(〃closing 〃 + os);
}
}
}
class SourceCodeFile {
public static final String
startMarker = 〃//:〃; // Start of source file
endMarker = 〃} ///:~〃; // End of source
endMarker2 = 〃}; ///:~〃; // C++ file end
beginContinue = 〃} ///:Continued〃;
endContinue = 〃///:Continuing〃;
packMarker = 〃###〃; // Packed file header tag
eol = // Line separator on current system
System。getProperty(〃line。separator〃);
filesep = // System's file path separator
System。getProperty(〃file。separator〃);
public static String copyright = 〃〃;
static {
try {
BufferedReader cr =
new BufferedReader(
new FileReader(〃Copyright。txt〃));
String crin;
while((crin = cr。readLine()) != null)
copyright += crin + 〃n〃;
cr。close();
} catch(Exception e) {
624
…………………………………………………………Page 626……………………………………………………………
copyright = 〃〃;
}
}
private String filename; dirname;
contents = new String();
private static String chapter = 〃c02〃;
// The file name separator from the old system:
public static String oldsep;
public String toString() {
return dirname + filesep + filename;
}
// Constructor for parsing from document file:
public SourceCodeFile(String firstLine;
BufferedReader in) {
dirname = chapter;
// Skip past marker:
filename = firstLine。substring(
startMarker。length())。trim();
// Find space that terminates file name:
if(filename。indexOf(' ') != …1)
filename = filename。substring(
0; filename。indexOf(' '));
System。out。println(〃found: 〃 + filename);
contents = firstLine + eol;
if(copyright。length() != 0)
contents += copyright + eol;
String s;
boolean foundEndMarker = false;
try {
while((s = in。readLine()) != null) {
if(s。startsWith(startMarker))
Pr。error(〃No end of file marker for 〃 +
filename);
// For this program; no spaces before
// the 〃package〃 keyword are allowed
// in the input source code:
else if(s。startsWith(〃package〃)) {
// Extract package name:
String pdir = s。substring(
s。indexOf(' '))。trim();
pdir = pdir。substring(
0; pdir。indexOf(';'))。trim();
// Capture the chapter from the package
// ignoring the '' subdirectories:
if(!pdir。startsWith(〃〃)) {
int firstDot = pdir。indexOf('。');
if(firstDot != …1)
chapter =
pdir。substring(0;firstDot);
else
chapter = pdir;
}
625
…………………………………………………………Page 627……………………………………………………………
// Convert package name to path name:
pdir = pdir。replace(
'。'; filesep。charAt(0));
System。out。println(〃package 〃 + pdir);
dirname = pdir;
}
contents += s + eol;
// Move past continuations:
if(s。startsWith(beginContinue))
while((s = in。readLine()) != null)
if(s。startsWith(endContinue)) {
contents += s + eol;
break;
}
// Watch for end of code listing:
if(s。startsWith(endMarker) ||
s。startsWith(endMarker2)) {
foundEndMarker = true;
break;
}
}
if(!foundEndMarker)
Pr。error(
〃End marker not found before EOF〃);
System。out。println(〃Chapter: 〃 + chapter);
} catch(IOException e) {
Pr。error(〃Error reading line〃);
}
}
// For recovering from a packed file:
public SourceCodeFile(BufferedReader pFile) {
try {
String s = pFile。readLine();
if(s == null) return;
if(!s。startsWith(packMarker))
Pr。error(〃Can't find 〃 + packMarker
+ 〃 in 〃 + s);
s = s。substring(
packMarker。length())。trim();
dirname = s。substring(0; s。indexOf('#'));
filename = s。substring(s。indexOf('#') + 1);
dirname = dirname。replace(
oldsep。charAt(0); filesep。charAt(0));
filename = filename。replace(
oldsep。charAt(0); filesep。charAt(0));
System。out。println(〃l isting: 〃 + dirname
+ filesep + filename);
while((s = pFile。readLine()) != null) {
// Watch for end of code listing:
if(s。startsWith(endMarker) ||
s。startsWith(endMarker2)) {
contents += s;
626
…………………………………………………………Page 628……………………………………………………………
break;
}
contents += s + eol;
}
} catch(IOException e) {
System。err。println(〃Error reading line〃);
}
}
public boolean hasFile() {
return filename != null;
}
public String directory() { return dirname; }
public String filename() { return filename; }
public String contents() { return contents; }
// To write to a packed file:
public void writePacked(DataOutputStream out) {
try {
out。writeBytes(
packMarker + dirname + 〃#〃
+ filename + eol);
out。writeBytes(contents);
} catch(IOException e) {
Pr。error(〃writing 〃 + dirname +
filesep + filename);
}
}
// To generate the actual file:
public void writeFile(String rootpath) {
File path = new File(rootpath; dirname);
path。mkdirs();
PrintWriter p =
IO。psOpen(new File(path; filename));
p。print(contents);
IO。close(p);
}
}
class DirMap {
private Hashtable t = new Hashtable();
private String rootpath;
DirMap() {
rootpath = System。getProperty(〃user。dir〃);
}
DirMap(String alternateDir) {
rootpath = alternateDir;
}
public void add(SourceCodeFile f){
String path = f。directory();
if(!t。containsKey(path))
t。put(path; new Vector());
((Vector)t。get(path))。addElement(f);
}
627
…………………………………………………………Page 629……………………………………………………………
public void writePackedFile(String fname) {
DataOutputStream packed = IO。dosOpen(fname);
try {
packed。writeBytes(〃###Old Separator:〃 +
SourceCodeFile。filesep + 〃###n〃);
} catch(IOException e) {
Pr。error(〃Writing separator to 〃 + fname);
}
Enumeration e = t。keys();
while(e。hasMoreElements()) {
String dir = (String)e。nextElement();
System。out。println(
〃Writing directory 〃 + dir);
Vector v = (Vector)t。get(dir);
for(int i = 0; i 《 v。size(); i++) {
SourceCodeFile f =
(SourceCodeFile)v。elementAt(i);
f。writePacked(packed);
}
}
IO。close(packed);
}
// Write all the files in their directories:
public void write() {
Enumeration e = t。keys();
while(e。hasMoreElements()) {
String dir = (String)e。nextElement();
Vector v = (Vector)t。get(dir);
for(int i = 0; i 《 v。size(); i++) {
SourceCodeFile f =
(SourceCodeFile)v。elementAt(i);
f。writeFile(rootpath);
}
// Add file indicating file quantity
// written to this directory as a check:
IO。close(IO。dosOpen(
new File(new File(rootpath; dir);
Integer。toString(v。size())+〃。files〃)));
}
}
}
public class CodePackager {