tabs.java

来自「java操作excel的类」· Java 代码 · 共 613 行 · 第 1/2 页

JAVA
613
字号
/* * Adjusts tabs and spaces. * Copyright (C) 2002 Stephen Ostermiller * http://ostermiller.org/contact.pl?regarding=Java+Utilities * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * See COPYING.TXT for details. */package com.Ostermiller.util;import java.io.*;import gnu.getopt.*;import java.text.MessageFormat;import java.util.ResourceBundle;import java.util.Locale;/** * Stream editor to alter the line separators on text to match * that of a given platform. * More information about this class is available from <a target="_top" href= * "http://ostermiller.org/utils/LineEnds.html">ostermiller.org</a>. * * @author Stephen Ostermiller http://ostermiller.org/contact.pl?regarding=Java+Utilities * @since ostermillerutils 1.00.00 */public class Tabs {	/**	 * Version number of this program	 *	 * @since ostermillerutils 1.00.00	 */	public static final String version = "1.0";	/**	 * Locale specific strings displayed to the user.	 *	 * @since ostermillerutils 1.00.00	 */	 protected static ResourceBundle labels = ResourceBundle.getBundle("com.Ostermiller.util.Tabs",  Locale.getDefault());	/**	 * Can be passed instead of a spaces argument to use tabs instead.	 *	 * @since ostermillerutils 1.00.00	 */	public final static int TABS = -1;	/**	 * Converts the tabs in files, or standard input.	 * Run with --help argument for more information.	 *	 * @param args Command line arguments.	 *	 * @since ostermillerutils 1.00.00	 */	public static void main(String[] args){		// create the command line options that we are looking for		LongOpt[] longopts = {			new LongOpt(labels.getString("help.option"), LongOpt.NO_ARGUMENT, null, 1),			new LongOpt(labels.getString("version.option"), LongOpt.NO_ARGUMENT, null, 2),			new LongOpt(labels.getString("about.option"), LongOpt.NO_ARGUMENT, null, 3),			new LongOpt(labels.getString("width.option"), LongOpt.REQUIRED_ARGUMENT, null, 'w'),			new LongOpt(labels.getString("guess.option"), LongOpt.NO_ARGUMENT, null, 'g'),			new LongOpt(labels.getString("tabs.option"), LongOpt.NO_ARGUMENT, null, 't'),			new LongOpt(labels.getString("spaces.option"), LongOpt.REQUIRED_ARGUMENT, null, 's'),			new LongOpt(labels.getString("force.option"), LongOpt.NO_ARGUMENT, null, 'f'),			new LongOpt(labels.getString("quiet.option"), LongOpt.NO_ARGUMENT, null, 'q'),			new LongOpt(labels.getString("reallyquiet.option"), LongOpt.NO_ARGUMENT, null, 'Q'),			new LongOpt(labels.getString("verbose.option"), LongOpt.NO_ARGUMENT, null, 'v'),			new LongOpt(labels.getString("reallyverbose.option"), LongOpt.NO_ARGUMENT, null, 'V'),			new LongOpt(labels.getString("noforce.option"), LongOpt.NO_ARGUMENT, null, 4),		};		String oneLetterOptions = "w:gts:fVvqQ";		Getopt opts = new Getopt(labels.getString("tabs"), args, oneLetterOptions, longopts);		int inputTabWidth = TABS;		int outputTabWidth = 4;		boolean force = false;		boolean printMessages = false;		boolean printExtraMessages = false;		boolean printErrors = true;		int c;		while ((c = opts.getopt()) != -1){			switch(c){					case 1:{					// print out the help message					String[] helpFlags = new String[]{						"--" + labels.getString("help.option"),						"--" + labels.getString("version.option"),						"--" + labels.getString("about.option"),						"-w --" + labels.getString("width.option") + " <" + labels.getString("s.arg") + ">",						"-g --" + labels.getString("guess.option"),						"-t --" + labels.getString("tabs.option"),						"-s --" + labels.getString("spaces.option") + " <" + labels.getString("s.arg") + ">",						"-f --" + labels.getString("force.option"),						"--" + labels.getString("noforce.option"),						"-V --" + labels.getString("reallyverbose.option"),						"-v --" + labels.getString("verbose.option"),						"-q --" + labels.getString("quiet.option"),						"-Q --" + labels.getString("reallyquiet.option"),					};					int maxLength = 0;					for (int i=0; i<helpFlags.length; i++){						maxLength = Math.max(maxLength, helpFlags[i].length());					}					maxLength += 2;					System.out.println(						labels.getString("tabs") + " [-" + StringHelper.replace(oneLetterOptions,":","") + "] <" + labels.getString("files") +  ">" + "\n" +						labels.getString("purpose.message") + "\n" +						"  " + labels.getString("stdin.message") + "\n" +						"  " + StringHelper.postpad(helpFlags[0] ,maxLength, ' ') + labels.getString("help.message") + "\n" +						"  " + StringHelper.postpad(helpFlags[1] ,maxLength, ' ') + labels.getString("version.message") + "\n" +						"  " + StringHelper.postpad(helpFlags[2] ,maxLength, ' ') + labels.getString("about.message") + "\n" +						"  " + StringHelper.postpad(helpFlags[3] ,maxLength, ' ') + labels.getString("w.message") + "\n" +						"  " + StringHelper.postpad(helpFlags[4] ,maxLength, ' ') + labels.getString("g.message") + " (" + labels.getString("default") + ")\n" +						"  " + StringHelper.postpad(helpFlags[5] ,maxLength, ' ') + labels.getString("t.message") + "\n" +						"  " + StringHelper.postpad(helpFlags[6] ,maxLength, ' ') + labels.getString("s.message") + " (" + labels.getString("default") + "=4)\n" +						"  " + StringHelper.postpad(helpFlags[7] ,maxLength, ' ') + labels.getString("f.message") + "\n" +						"  " + StringHelper.postpad(helpFlags[8] ,maxLength, ' ') + labels.getString("noforce.message") + " (" + labels.getString("default") + ")\n" +						"  " + StringHelper.postpad(helpFlags[9] ,maxLength, ' ') + labels.getString("V.message") + "\n" +						"  " + StringHelper.postpad(helpFlags[10] ,maxLength, ' ') + labels.getString("v.message") + "\n" +						"  " + StringHelper.postpad(helpFlags[11] ,maxLength, ' ') + labels.getString("q.message") + " (" + labels.getString("default") + ")\n" +						"  " + StringHelper.postpad(helpFlags[12] ,maxLength, ' ') + labels.getString("Q.message") + "\n"					);					System.exit(0);				} break;				case 2:{					// print out the version message					System.out.println(MessageFormat.format(labels.getString("version"), new String[] {version}));					System.exit(0);				} break;				case 3:{					System.out.println(						labels.getString("tabs") + " -- " + labels.getString("purpose.message") + "\n" +						MessageFormat.format(labels.getString("copyright"), new String[] {"2002", "Stephen Ostermiller (http://ostermiller.org/contact.pl?regarding=Java+Utilities)"}) + "\n\n" +						labels.getString("license")					);					System.exit(0);				} break;				case 'w':{					try {						inputTabWidth = Integer.parseInt(opts.getOptarg());					} catch (NumberFormatException x){						inputTabWidth = -1;					}					if (inputTabWidth<1 || inputTabWidth>20){						System.err.println(labels.getString("widtherror"));						System.exit(1);					}				} break;				case 'g':{					inputTabWidth = TABS;				} break;				case 's':{					try {						outputTabWidth = Integer.parseInt(opts.getOptarg());					} catch (NumberFormatException x){						outputTabWidth = -1;					}					if (outputTabWidth<1 || outputTabWidth>20){						System.err.println("widtherror");						System.exit(1);					}				} break;				case 't':{					outputTabWidth = TABS;				} break;				case 'f':{					force = true;				} break;				case 4:{					force = false;				} break;				case 'V':{					printExtraMessages = true;					printMessages = true;					printErrors = true;				} break;				case 'v':{					printExtraMessages = false;					printMessages = true;					printErrors = true;				} break;				case 'q':{					printExtraMessages = false;					printMessages = false;					printErrors = true;				} break;				case 'Q':{					printExtraMessages = false;					printMessages = false;					printErrors = false;				} break;				default:{					System.exit(1);				}			}		}		int exitCond = 0;		boolean done = false;		for (int i=opts.getOptind(); i<args.length; i++){			boolean modified = false;			done = true;			File source = new File(args[i]);			if (!source.exists()){				if(printErrors){					System.err.println(MessageFormat.format(labels.getString("doesnotexist"), new String[] {args[i]}));				}				exitCond = 1;			} else if (!source.canRead()){				if(printErrors){					System.err.println(MessageFormat.format(labels.getString("cantread"), new String[] {args[i]}));				}				exitCond = 1;			} else if (!source.canWrite()){				if(printErrors){					System.err.println(MessageFormat.format(labels.getString("cantwrite"), new String[] {args[i]}));				}				exitCond = 1;			} else {				try {					if(convert (source, inputTabWidth, outputTabWidth, !force)){						if (printMessages){							System.out.println(MessageFormat.format(labels.getString("modified"), new String[] {args[i]}));						}					} else {						if (printExtraMessages){							System.out.println(MessageFormat.format(labels.getString("alreadycorrect"), new String[] {args[i]}));						}					}				} catch (IOException x){					if(printErrors){						System.err.println(args[i] + ": " + x.getMessage());					}					exitCond = 1;				}			}		}		if (!done){			if(inputTabWidth == TABS){				System.err.println(labels.getString("stdinguess"));				exitCond = 1;			} else {				try {					convert (System.in, System.out, inputTabWidth, outputTabWidth, !force);				} catch (IOException x){					System.err.println(x.getMessage());					exitCond = 1;				}			}		}		System.exit(exitCond);	}	private final static int DEFAULT_INPUT_TAB_WIDTH = 4;	private final static int DEFAULT_INPUT_FILE_TAB_WIDTH = TABS;	private final static int DEFAULT_OUTPUT_TAB_WIDTH = 4;	private final static boolean DEFAULT_MODIFY_BINARY = false;	/**	 * Read form the input stream, changing the tabs at the beginning of each line	 * to four spaces, write the result to the output stream.	 *	 * @param in stream that contains the text which needs line number conversion.	 * @param out stream where converted text is written.	 * @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) throws IOException {		return convert(in, out, DEFAULT_INPUT_TAB_WIDTH, DEFAULT_OUTPUT_TAB_WIDTH, DEFAULT_MODIFY_BINARY);	}	/**	 * Read form the input stream, changing the tabs at the beginning of each line	 * to the specified number of spaces, write the result to the output stream.	 *	 * @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.	 * @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(InputStream in, OutputStream out, int inputTabWidth) throws IOException {		return convert(in, out, inputTabWidth, DEFAULT_OUTPUT_TAB_WIDTH, DEFAULT_MODIFY_BINARY);	}	/**

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?