📄 dataentryrewriter.java
字号:
package proguard.io;import proguard.classfile.*;import java.io.*;/** * This DataEntryReader writes the resource data entries that it reads to a * given DataEntryWriter, updating their contents based on the renamed classes * in the given ClassPool. * * @author Eric Lafortune */public class DataEntryRewriter implements DataEntryReader{ private ClassPool classPool; private DataEntryWriter dataEntryWriter; /** * Creates a new DataEntryRewriter. */ public DataEntryRewriter(ClassPool classPool, DataEntryWriter dataEntryWriter) { this.classPool = classPool; this.dataEntryWriter = dataEntryWriter; } // Implementations for DataEntryReader. public void read(DataEntry dataEntry) throws IOException { try { // Get the output entry corresponding to this input entry. OutputStream outputStream = dataEntryWriter.getOutputStream(dataEntry); if (outputStream != null) { InputStream inputStream = dataEntry.getInputStream(); // Copy the data from the input entry to the output entry. copyData(inputStream, outputStream); // Close the data entries. dataEntry.closeInputStream(); } } catch (IOException ex) { System.err.println("Warning: can't write resource [" + dataEntry.getName() + "] (" + ex.getMessage() + ")"); } } // Small utility methods. /** * Copies all data that it can read from the given input stream to the * given output stream. */ private void copyData(InputStream inputStream, OutputStream outputStream) throws IOException { Reader reader = new BufferedReader(new InputStreamReader(inputStream)); Writer writer = new BufferedWriter(new OutputStreamWriter(outputStream)); StringBuffer word = new StringBuffer(); while (true) { int i = reader.read(); if (i < 0) { break; } // Is the character part of a word? char c = (char)i; if (Character.isJavaIdentifierPart(c) || c == '.' || c == '-') { // Collect the characters in this word. word.append(c); } else { // Write out the updated word, if any. writeUpdatedWord(writer, word.toString()); word.setLength(0); // Write out the character that terminated it. writer.write(c); } } // Write out the final word. writeUpdatedWord(writer, word.toString()); writer.flush(); outputStream.flush(); } /** * Writes the given word to the given writer, after having adapted it, * based on the renamed class names. */ private void writeUpdatedWord(Writer writer, String word) throws IOException { if (word.length() > 0) { String newWord = word; boolean containsDots = word.indexOf('.') >= 0; // Replace dots by forward slashes. String className = containsDots ? word.replace('.', ClassConstants.INTERNAL_PACKAGE_SEPARATOR) : word; // Find the class corrsponding to the word. Clazz clazz = classPool.getClass(className); if (clazz != null) { // Update the word if necessary. String newClassName = clazz.getName(); if (!className.equals(newClassName)) { // Replace forward slashes by dots. newWord = containsDots ? newClassName.replace(ClassConstants.INTERNAL_PACKAGE_SEPARATOR, '.') : newClassName; } } writer.write(newWord); } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -