一例として-csv読んでファイルを達成するための一般的な機能を備えたJavaアノテーション

入門

使用Javaアノテーションは、そこに、いくつかの仮説のcsvファイル形式ですエンコード、区切り文字は、ヘッダ行を定義し、異なっているが、我々は彼らに均一な処理をしたいのように、それは一般的に必要となるいくつかの共通の機能を実現することができます方法。

いくつかは、何のコメントも言わないことが、一つだけ共通のツールはまだラインではありませんか?しかし、ノートには、コードをよりエレガントに、そしてあなたは、このような他のcsv形式など、いくつかの追加要件を追加するとき、あなたはちょうどあなたが簡単に機能を拡張することができますいくつかのメモを追加することができます。

そして、コードを見て。

1.定義コメント

注釈は、セパレータ、コーディング情報などを含む形式のCSVファイルを定義します。ビジネスのニーズが増加した場合、我々は、このような改行などの機能を、追加していくことができます。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface FileFormat {
	// 分隔符
	char delimiter() default ',';
	// 引用符
	char encloseChar() default  Character.MIN_VALUE;
	// 编码
	String fileEncoding() default "UTF-8";
	// 头部行数
	int headerLineCount() default 0;
	// 输出文件是否覆盖
	boolean overWriteFlg() default false;
}
复制代码

2.注釈

ここでは、スケーラビリティのために空のインターフェイスを定義します。あなたは、インターフェイスを実装するためにそれを拡張する必要がある場合。

public interface CSVFormat {

}
复制代码

FreeTextCSVFormat CSVFormatは、インターフェイスを実装し、注釈FileFormatは、セパレータ、及びそのエンコーディングのデフォルト値、および特別な設定を使用します。

@Data
@FileFormat()
public class FreeTextCSVFormat implements CSVFormat {
	private String nexcoNumber;
	private String msgNumber;
	private String cmdMode;
	private String text;
}
复制代码

データ処理の3注釈の行は、ファイルを読み取ります

注釈は、データラインを読んで、提供されます。どのようなコーディングや改行は、一般的にreadDataLine()メソッドで使用されています。

@Data
public class CSVFileLineIterator {
	// 格式类
	private Class<? extends CSVFormat> format;
	// 対象文件
	private File file;
	// 分隔符
	private char delimiter;
	// 文字编码
	private String encoding;
	// 头部行数
	private int headerLineCount;
	// 总共读取行数
	private int count;
	// reader
	private BufferedReader reader;
	// msg
	private MessageSource msg;
	
	/**
	 * 构造器。把注解的数据代入成员变量。
	 */
	public CSVFileLineIterator(File file, Class<? extends CSVFormat> format) throws IllegalArgumentException, FileException {
		if (file == null && format == null) {
			throw new IllegalArgumentException(msg.getMessage("nullArgument", null, null));
		}
		if (!file.exists()) {
			throw new FileException(msg.getMessage("fileNoFound", null, null));
		}
		
		this.file = file;
		this.format = format;
		FileFormat fileformat = format.getAnnotation(FileFormat.class);
		
		if (fileformat == null) {
			throw new FileException(msg.getMessage("noFormatAnnotation", null, null));
		}
		
		this.delimiter = fileformat.delimiter();
		this.encoding = fileformat.fileEncoding();
		this.headerLineCount = fileformat.headerLineCount();
		
                if (this.delimiter == Character.MIN_VALUE) {
                    throw new FileException(msg.getMessage("illegalDelimiter", new String[] {file.getName()}, null));
                }
	}
	
	/**
	 * 用注解指定的编码打开reader
	 */
	public void open() throws UnsupportedEncodingException, FileNotFoundException {
		reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), this.encoding));
	}
	
	/**
	 * 跳过注解的头部行数,并读取一行,并按照注解的分隔符分割成字符串
	 */
	public String[] readDataLine() throws IOException {
		String line = null;

		while ((line = reader.readLine()) != null) {
			count++;
			if (count <= this.headerLineCount) {
				continue;
			}
			break;
		}

		return line == null ? null : line.split(String.valueOf(this.delimiter));

	}
	
	/**
	 * 关闭reader
	 */
	public void close() throws IOException {
		this.reader.close();
		this.count = 0;
	}
	
}
复制代码

4.拡張 - データを読み込み、そのクラスに詰め

それはちょうど、行を読んで文字列の配列を返しました。しかし、時には、私たちは、このような上記FreeTextCSVFormatクラスとしてクラスにデータをカプセル化します。私たちは、その後、文書注釈内容を定義することができます。

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface FileColumn {
	// 列index
	int columnIdex() default 0;
	// 是不是循环列
	boolean isLoop() default false;
}
复制代码

FreeTextCSVFormatは、FileColumnのコメントを追加します。

@Data
@FileFormat()
public class FreeTextCSVFormat implements CSVFormat {
	@FileColumn(columnIdex = 0)
	private String nexcoNumber;
	
	@FileColumn(columnIdex = 1, isLoop = true)
	private String msgNumber;
	
	@FileColumn(columnIdex = 2, isLoop = true)
	private String cmdMode;
	
	@FileColumn(columnIdex = 3, isLoop = true)
	private String text;
}
复制代码

最後に、あなたは反射columnIdexを取得し、パッケージに内容を読み取ることができます。実現はアウト投稿されていません。

エピローグ

使用注釈は、このような新しいCSV形式の追加など、スケーラビリティを向上させることができ、あなたはそれに注釈を使用してクラスを追加し、ファイルを読むための方法を変更する必要はありません。そうすることで、よりエレガントであることが、また、通常は、多くのコメントフレームワークの機会を、すべての後、あなたはJavaのリフレクションを理解するのに役立ちますが、めったに自分自身を書き込むことはできません。

おすすめ

転載: juejin.im/post/5de8593451882512641659d8