tabs.java
来自「java操作excel的类」· Java 代码 · 共 613 行 · 第 1/2 页
JAVA
613 行
* Read form the input stream, changing the tabs at the beginning of each line * to the specified number of spaces or the other way around, write the result * to the output stream. * * The current system's line separator is used. * * @param in stream that contains the text which needs line number conversion. * @param out stream where converted text is written. * @param inputTabWidth number of spaces used instead of a tab in the input. * @param outputTabWidth TABS if tabs should be used, otherwise, number of spaces to use. * @return true if the output was modified from the input, false if it is exactly the same * @throws BinaryDataException if non-text data is encountered. * @throws IOException if an input or output error occurs. * * @since ostermillerutils 1.00.00 */ public static boolean convert(InputStream in, OutputStream out, int inputTabWidth, int outputTabWidth) throws IOException { return convert(in, out, inputTabWidth, outputTabWidth, DEFAULT_MODIFY_BINARY); } /** * Read form the input stream, changing the tabs at the beginning of each line * to the specified number of spaces or the other way around, write the result * to the output stream. * * The current system's line separator is used. * * @param in stream that contains the text which needs line number conversion. * @param out stream where converted text is written. * @param inputTabWidth number of spaces used instead of a tab in the input. * @param outputTabWidth TABS if tabs should be used, otherwise, number of spaces to use. * @param binaryException throw an exception and abort the operation if binary data is encountered and binaryExcepion is false. * @return true if the output was modified from the input, false if it is exactly the same. * @throws BinaryDataException if non-text data is encountered. * @throws IOException if an input or output error occurs. * * @since ostermillerutils 1.00.00 */ public static boolean convert(InputStream in, OutputStream out, int inputTabWidth, int outputTabWidth, boolean binaryException) throws IOException { if ((inputTabWidth < 1 || inputTabWidth > 20) && inputTabWidth != TABS){ throw new IllegalArgumentException(labels.getString("widtherror")); } if ((outputTabWidth < 1 || outputTabWidth > 20) && outputTabWidth != TABS){ throw new IllegalArgumentException(labels.getString("widtherror")); } int state = STATE_INIT; int spaces = 0; int tabs = 0; int tabStops = 0; int extraSpaces = 0; boolean modified = false; byte[] buffer = new byte[BUFFER_SIZE]; int read; while((read = in.read(buffer)) != -1){ for (int i=0; i<read; i++){ byte b = buffer[i]; if(binaryException && b!='\r' && b!='\n' && b!='\t' && b!='\f' && (b & 0xff)<32){ throw new BinaryDataException(labels.getString("binaryexcepion")); } switch (b){ case ' ': { if (state == STATE_INIT) { spaces++; extraSpaces++; if (extraSpaces == inputTabWidth){ tabStops++; extraSpaces = 0; } } else { out.write(b); } } break; case '\t': { if (state == STATE_INIT) { if (spaces > 0){ // put tabs before spaces modified = true; } tabs++; tabStops++; extraSpaces = 0; } else { out.write(b); } } break; case '\r': case '\n': { out.write(b); spaces = 0; tabs = 0; tabStops = 0; extraSpaces = 0; state = STATE_INIT; } break; default: { if (state == STATE_INIT){ if (outputTabWidth == TABS){ for (int j=0; j<tabStops; j++){ out.write((byte)'\t'); } } else { extraSpaces += tabStops * outputTabWidth; tabStops = 0; } for (int j=0; j<extraSpaces; j++){ out.write((byte)' '); } if (extraSpaces != spaces || tabStops != tabs) modified = true; } out.write(b); state = STATE_SOMETHING; } break; } } } return modified; } /** * Change the tabs at the beginning of each line of the file to four spaces. * Guess the tab width of the input file. * * @param f File to be converted. * @return true if the file was modified, false if it was already in the correct format * @throws BinaryDataException if non-text data is encountered. * @throws IOException if an input or output error occurs. * * @since ostermillerutils 1.00.00 */ public static boolean convert(File f) throws IOException { return convert(f, DEFAULT_INPUT_FILE_TAB_WIDTH, DEFAULT_OUTPUT_TAB_WIDTH, DEFAULT_MODIFY_BINARY); } /** * Change the tabs at the beginning of each line of the file * to the specified number of spaces. * * @param f File to be converted. * @param inputTabWidth number of spaces used instead of a tab in the input, or TAB to guess. * @return true if the output was modified from the input, false if it is exactly the same * @throws BinaryDataException if non-text data is encountered. * @throws IOException if an input or output error occurs. * @throws IllegalArgumentException if tab widths are not between 1 and 20 or TABS. * * @since ostermillerutils 1.00.00 */ public static boolean convert(File f, int inputTabWidth) throws IOException { return convert(f, inputTabWidth, DEFAULT_OUTPUT_TAB_WIDTH, DEFAULT_MODIFY_BINARY); } /** * Change the tabs at the beginning of each line of the file * to the specified number of spaces or the other way around. * * @param f File to be converted. * @param inputTabWidth number of spaces used instead of a tab in the input, or TAB to guess. * @param outputTabWidth true if tabs should be used, false if spaces should be used. * @return true if the output was modified from the input, false if it is exactly the same * @throws BinaryDataException if non-text data is encountered. * @throws IOException if an input or output error occurs. * * @since ostermillerutils 1.00.00 */ public static boolean convert(File f, int inputTabWidth, int outputTabWidth) throws IOException { return convert(f, inputTabWidth, outputTabWidth, DEFAULT_MODIFY_BINARY); } /** * Change the tabs at the beginning of each line of the file * to the specified number of spaces or the other way around. * * @param f File to be converted. * @param inputTabWidth number of spaces used instead of a tab in the input, or TABS to guess. * @param outputTabWidth true if tabs should be used, false if spaces should be used. * @param binaryException throw an exception and abort the operation if binary data is encountered and binaryExcepion is false. * @return true if the file was modified, false if it was already in the correct format * @throws BinaryDataException if non-text data is encountered. * @throws IOException if an input or output error occurs. * @throws IllegalArgumentException if tab widths are not between 1 and 20 or TABS. * * @since ostermillerutils 1.00.00 */ public static boolean convert(File f, int inputTabWidth, int outputTabWidth, boolean binaryException) throws IOException { File temp = null; InputStream in = null; OutputStream out = null; boolean modified = false; try { if (inputTabWidth == TABS){ inputTabWidth = guessTabWidth(new FileInputStream(f)); } in = new FileInputStream(f); temp = File.createTempFile("LineEnds", null, null); out = new FileOutputStream(temp); modified = convert(in, out, inputTabWidth, outputTabWidth, binaryException); in.close(); in = null; out.flush(); out.close(); out = null; if (modified){ FileHelper.move(temp, f, true); } else { if (!temp.delete()){ throw new IOException( MessageFormat.format( labels.getString("tempdeleteerror"), new String[] {temp.toString()} ) ); } } } finally { if (in != null){ in.close(); in = null; } if (out != null){ out.flush(); out.close(); out = null; } } return modified; } /** * Buffer size when reading from input stream. * * @since ostermillerutils 1.00.00 */ private final static int BUFFER_SIZE = 1024; private final static int STATE_INIT = 0; private final static int STATE_SOMETHING = 1; final private static int MAX_SPACES = 128; final private static int MAX_TABS = 16; final private static int MAX_COMBINED = 256; /** * Guess the number of spaces per tab at the beginning of each line. * * @return the least value (two or greater) which has some line that starts with n times spaces for n zero to max spaces starting a line. * * @since ostermillerutils 1.00.00 */ public static int guessTabWidth(InputStream in) throws IOException { byte[] buffer = new byte[BUFFER_SIZE]; int[][] data = new int[MAX_SPACES][MAX_TABS]; int[] spaceData = new int[MAX_SPACES*MAX_TABS]; int read; int state = STATE_INIT; int tabs = 0; int spaces = 0; int mostTabs = 0; int mostSpaces = 0; boolean spaceUsed = false; while((read = in.read(buffer)) != -1){ for (int i=0; i<read; i++){ byte b = buffer[i]; switch (b){ case ' ': { if (state == STATE_INIT) spaces++; } break; case '\t': { if (state == STATE_INIT) tabs++; } break; case '\r': case '\n': { state = STATE_INIT; if (spaces < MAX_SPACES && tabs < MAX_TABS){ data[spaces][tabs]++; if (tabs > mostTabs) mostTabs = tabs; if (spaces > mostSpaces) mostSpaces = spaces; spaces = 0; tabs = 0; } } break; default: { state = STATE_SOMETHING; } break; } } } for (int tabWidth=2; tabWidth<=20; tabWidth++){ int mostCombined=0; for (int tabInd=0; tabInd <= mostTabs; tabInd++){ for (int spaceInd=0; spaceInd <= mostSpaces; spaceInd++){ int totInd = spaceInd + (tabInd * tabWidth); if (totInd < MAX_COMBINED){ int numLines = data[spaceInd][tabInd]; if (numLines > 0){ if (mostCombined < totInd) mostCombined = totInd; spaceData[totInd] += numLines; } } } } boolean found = true; for(int combInd=0; found && combInd < mostCombined; combInd+=tabWidth){ found = spaceData[combInd] > 0; } if (found) return tabWidth; } return 2; }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?