📄 spelldictionarydisk.java
字号:
for (int i = 0; i < wordFiles.length; i++) {
BufferedReader r = new BufferedReader(new FileReader(wordFiles[i]));
String word;
while ((word = r.readLine()) != null) {
if (!word.equals("")) {
w.add(word.trim());
}
}
r.close();
}
Collections.sort(w);
// FIXME - error handling for running out of disk space would be nice.
File file = File.createTempFile("jazzy", "sorted");
BufferedWriter writer = new BufferedWriter(new FileWriter(file));
String prev = null;
for (int i = 0; i < w.size(); i++) {
String word = (String) w.get(i);
if (prev == null || !prev.equals(word)) {
writer.write(word);
writer.newLine();
}
prev = word;
}
writer.close();
return file;
}
private void buildCodeDb(File sortedWords) throws FileNotFoundException, IOException {
List codeList = new ArrayList();
BufferedReader reader = new BufferedReader(new FileReader(sortedWords));
String word;
while ((word = reader.readLine()) != null) {
codeList.add(new CodeWord(this.getCode(word), word));
}
reader.close();
Collections.sort(codeList);
List index = new ArrayList();
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(new File(db, FILE_DB)));
String currentCode = null;
int currentPosition = 0;
int currentLength = 0;
for (int i = 0; i < codeList.size(); i++) {
CodeWord cw = (CodeWord) codeList.get(i);
String thisCode = cw.getCode();
// if (thisCode.length() > 3) thisCode = thisCode.substring(0, 3);
thisCode = getIndexCode(thisCode, codeList);
String toWrite = cw.getCode() + "," + cw.getWord() + "\n";
byte[] bytes = toWrite.getBytes();
if (currentCode == null) currentCode = thisCode;
if (!currentCode.equals(thisCode)) {
index.add(new Object[]{currentCode, new int[]{currentPosition, currentLength}});
currentPosition += currentLength;
currentLength = bytes.length;
currentCode = thisCode;
} else {
currentLength += bytes.length;
}
out.write(bytes);
}
out.close();
// Output the last iteration
if (currentCode != null && currentPosition != 0 && currentLength != 0)
index.add(new Object[]{currentCode, new int[]{currentPosition, currentLength}});
BufferedWriter writer = new BufferedWriter(new FileWriter(new File(db, FILE_INDEX)));
for (int i = 0; i < index.size(); i++) {
Object[] o = (Object[]) index.get(i);
writer.write(o[0].toString());
writer.write(",");
writer.write(String.valueOf(((int[]) o[1])[0]));
writer.write(",");
writer.write(String.valueOf(((int[]) o[1])[1]));
writer.newLine();
}
writer.close();
}
private void buildContentsFile() throws IOException {
File[] wordFiles = words.listFiles();
if (wordFiles.length > 0) {
BufferedWriter writer = new BufferedWriter(new FileWriter(new File(db, FILE_CONTENTS)));
for (int i = 0; i < wordFiles.length; i++) {
writer.write(wordFiles[i].getName());
writer.write(",");
writer.write(String.valueOf(wordFiles[i].length()));
writer.newLine();
}
writer.close();
} else {
new File(db, FILE_CONTENTS).delete();
}
}
/**
* Loads the index file from disk. The index file accelerates words lookup
* into the dictionary db file.
*/
protected void loadIndex() throws IOException {
index = new HashMap();
File idx = new File(db, FILE_INDEX);
BufferedReader reader = new BufferedReader(new FileReader(idx));
String line;
while ((line = reader.readLine()) != null) {
String[] fields = split(line, ",");
index.put(fields[0], new int[]{Integer.parseInt(fields[1]), Integer.parseInt(fields[2])});
}
reader.close();
}
private int[] getStartPosAndLen(String code) {
while (code.length() > 0) {
int[] posLen = (int[]) index.get(code);
if (posLen == null) {
code = code.substring(0, code.length() - 1);
} else {
return posLen;
}
}
return null;
}
private String getIndexCode(String code, List codes) {
if (indexCodeCache == null) indexCodeCache = new ArrayList();
if (code.length() <= 1) return code;
for (int i = 0; i < indexCodeCache.size(); i++) {
String c = (String) indexCodeCache.get(i);
if (code.startsWith(c)) return c;
}
int foundSize = -1;
boolean cacheable = false;
for (int z = 1; z < code.length(); z++) {
String thisCode = code.substring(0, z);
int count = 0;
for (int i = 0; i < codes.size();) {
if (i == 0) {
i = Collections.binarySearch(codes, new CodeWord(thisCode, ""));
if (i < 0) i = 0;
}
CodeWord cw = (CodeWord) codes.get(i);
if (cw.getCode().startsWith(thisCode)) {
count++;
if (count > INDEX_SIZE_MAX) break;
} else if (cw.getCode().compareTo(thisCode) > 0) break;
i++;
}
if (count <= INDEX_SIZE_MAX) {
cacheable = true;
foundSize = z;
break;
}
}
String newCode = (foundSize == -1) ? code : code.substring(0, foundSize);
if (cacheable) indexCodeCache.add(newCode);
return newCode;
}
private static String[] split(String input, String delimiter) {
StringTokenizer st = new StringTokenizer(input, delimiter);
int count = st.countTokens();
String[] out = new String[count];
for (int i = 0; i < count; i++) {
out[i] = st.nextToken();
}
return out;
}
private class CodeWord implements Comparable {
private String code;
private String word;
public CodeWord(String code, String word) {
this.code = code;
this.word = word;
}
public String getCode() {
return code;
}
public String getWord() {
return word;
}
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof CodeWord)) return false;
final CodeWord codeWord = (CodeWord) o;
if (!word.equals(codeWord.word)) return false;
return true;
}
public int hashCode() {
return word.hashCode();
}
public int compareTo(Object o) {
return code.compareTo(((CodeWord) o).getCode());
}
}
private class FileSize {
private String filename;
private long size;
public FileSize(String filename, long size) {
this.filename = filename;
this.size = size;
}
public String getFilename() {
return filename;
}
public long getSize() {
return size;
}
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof FileSize)) return false;
final FileSize fileSize = (FileSize) o;
if (size != fileSize.size) return false;
if (!filename.equals(fileSize.filename)) return false;
return true;
}
public int hashCode() {
int result;
result = filename.hashCode();
result = (int) (29 * result + size);
return result;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -