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 + -
显示快捷键?