Fasta文件是生物信息领域储存核酸和氨基酸序列最常用的文件格式之一。其基本形式由带“>”的序列注释标签和单个字母表示的核酸或者氨基酸组成。
在利用Rosalind学习java生物信息编程时,经常需要读取fasta文件。之前读取此类文件,采用的是读取后转化为字符串形式进行输出和后继处理,读取fasta文件的原代码如下:
//定义方法,输入文本文件路径,以字符串类型返回文本内容
public static String readFileContent(String fileName) {
File file = new File(fileName);
BufferedReader reader = null;
StringBuffer sbf = new StringBuffer();
try {
reader = new BufferedReader(new FileReader(file));
String tempStr;
while ((tempStr = reader.readLine()) != null) {
sbf.append(tempStr);
}
reader.close();
return sbf.toString();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
return sbf.toString();
}
调用上述子方法后fasta文件能够变为字符串变量并存储于内存中,但是开头的注释信息和序列信息都会变成统一的字符串形式,难舍难分。还需要额外创建子方法来去掉注释信息,相当麻烦。因此代码需要进一步改进:
此处我们采用ArrayList集合,调用BufferedReader对fasta进行逐行读取。读取之后利用正则表达式匹配">"开头的注释标签行,存储到ArrayList fasta中。而注释标签行存储到ArrayList tag中。
//改进后读取fasta文件代码
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
public class readline_txt_method {
public static void main(String[] args) {
ArrayList<String> fasta = BufferedReader("C:/Users/Administrator/Desktop/sequence.fasta","tag");//设置返回值是标签名称还是碱基序列。
for (int i = 0; i < fasta.size(); i++) {
System.out.println(fasta.get(i));//按照索引输出集合元素,从0位开始。
}
}
public static ArrayList<String> BufferedReader(String path,String choose) {//返回值类型是新建集合大类,此处是Set而非哈希。
BufferedReader reader;
ArrayList<String> tag = new java.util.ArrayList<String>();
ArrayList<String> fasta = new java.util.ArrayList<String>();
try {
reader = new BufferedReader(new FileReader(path));
String line = reader.readLine();
while (line != null) {//多次匹配带有“>”的行,\w代表0—9A—Z_a—z,需要转义。\W代表非0—9A—Z_a—z。
if (line.matches(">[\\w*|\\W*]*")){
tag.add(line);
}else{
fasta.add(line);
}
// read next line
line = reader.readLine();
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
if (choose.equals("tag")){
return tag;
}
return fasta;
}
}