jpayne@68
|
1 package fileIO;
|
jpayne@68
|
2 import java.io.File;
|
jpayne@68
|
3 import java.io.InputStream;
|
jpayne@68
|
4 import java.util.ArrayList;
|
jpayne@68
|
5
|
jpayne@68
|
6 import shared.Shared;
|
jpayne@68
|
7 import structures.ListNum;
|
jpayne@68
|
8
|
jpayne@68
|
9
|
jpayne@68
|
10 public abstract class ByteFile {
|
jpayne@68
|
11
|
jpayne@68
|
12 // public static final ByteFile makeByteFile(String fname){
|
jpayne@68
|
13 // return makeByteFile(fname, false, true);
|
jpayne@68
|
14 // }
|
jpayne@68
|
15
|
jpayne@68
|
16 public static final ByteFile makeByteFile1(String fname, boolean allowSubprocess){
|
jpayne@68
|
17 FileFormat ff=FileFormat.testInput(fname, FileFormat.TEXT, null, allowSubprocess, false);
|
jpayne@68
|
18 return new ByteFile1(ff);
|
jpayne@68
|
19 }
|
jpayne@68
|
20
|
jpayne@68
|
21 public static final ByteFile makeByteFile(String fname, boolean allowSubprocess){
|
jpayne@68
|
22 FileFormat ff=FileFormat.testInput(fname, FileFormat.TEXT, null, allowSubprocess, false);
|
jpayne@68
|
23 return makeByteFile(ff);
|
jpayne@68
|
24 }
|
jpayne@68
|
25
|
jpayne@68
|
26 public static final ByteFile makeByteFile(FileFormat ff){
|
jpayne@68
|
27 return makeByteFile(ff, 0);
|
jpayne@68
|
28 }
|
jpayne@68
|
29
|
jpayne@68
|
30 public static final ByteFile makeByteFile(FileFormat ff, int type){
|
jpayne@68
|
31 if(type==1){return new ByteFile1(ff);}
|
jpayne@68
|
32 if(type==2){return new ByteFile2(ff);}
|
jpayne@68
|
33 if(!Shared.LOW_MEMORY && (FORCE_MODE_BF2 || (!FORCE_MODE_BF1 && Shared.threads()>4/* && (ReadWrite.isCompressed(fname) || ReadWrite.isSam(fname))*/))){
|
jpayne@68
|
34 // if(allowSubprocess && ((ReadWrite.USE_UNPIGZ || ReadWrite.USE_GUNZIP) && (fname.endsWith(".gz") || fname.endsWith(".gzip")))){}
|
jpayne@68
|
35 return new ByteFile2(ff);
|
jpayne@68
|
36 }
|
jpayne@68
|
37 // if(FORCE_MODE_BF3){return new QuickFile(ff);}
|
jpayne@68
|
38 return new ByteFile1(ff);
|
jpayne@68
|
39 }
|
jpayne@68
|
40
|
jpayne@68
|
41 protected ByteFile(FileFormat ff_){
|
jpayne@68
|
42 ff=ff_;
|
jpayne@68
|
43 assert(ff.read()) : ff;
|
jpayne@68
|
44 }
|
jpayne@68
|
45
|
jpayne@68
|
46 public final ArrayList<byte[]> toByteLines(){
|
jpayne@68
|
47
|
jpayne@68
|
48 byte[] s=null;
|
jpayne@68
|
49 ArrayList<byte[]> list=new ArrayList<byte[]>(4096);
|
jpayne@68
|
50
|
jpayne@68
|
51 for(s=nextLine(); s!=null; s=nextLine()){
|
jpayne@68
|
52 list.add(s);
|
jpayne@68
|
53 }
|
jpayne@68
|
54
|
jpayne@68
|
55 return list;
|
jpayne@68
|
56 }
|
jpayne@68
|
57
|
jpayne@68
|
58 public static final ArrayList<byte[]> toLines(FileFormat ff){
|
jpayne@68
|
59 ByteFile bf=makeByteFile(ff);
|
jpayne@68
|
60 ArrayList<byte[]> lines=bf.toByteLines();
|
jpayne@68
|
61 bf.close();
|
jpayne@68
|
62 return lines;
|
jpayne@68
|
63 }
|
jpayne@68
|
64
|
jpayne@68
|
65 public static final ArrayList<byte[]> toLines(String fname){
|
jpayne@68
|
66 FileFormat ff=FileFormat.testInput(fname, FileFormat.TEXT, null, true, false);
|
jpayne@68
|
67 return toLines(ff);
|
jpayne@68
|
68 }
|
jpayne@68
|
69
|
jpayne@68
|
70 public final long countLines(){
|
jpayne@68
|
71 byte[] s=null;
|
jpayne@68
|
72 long count=0;
|
jpayne@68
|
73 for(s=nextLine(); s!=null; s=nextLine()){count++;}
|
jpayne@68
|
74 reset();
|
jpayne@68
|
75
|
jpayne@68
|
76 return count;
|
jpayne@68
|
77 }
|
jpayne@68
|
78
|
jpayne@68
|
79 public abstract void reset();
|
jpayne@68
|
80 final void superReset(){
|
jpayne@68
|
81 nextID=0;
|
jpayne@68
|
82 }
|
jpayne@68
|
83
|
jpayne@68
|
84 public synchronized final ListNum<byte[]> nextList(){
|
jpayne@68
|
85 byte[] line=nextLine();
|
jpayne@68
|
86 if(line==null){return null;}
|
jpayne@68
|
87 ArrayList<byte[]> list=new ArrayList<byte[]>(200);
|
jpayne@68
|
88 list.add(line);
|
jpayne@68
|
89 for(int i=1; i<200; i++){
|
jpayne@68
|
90 line=nextLine();
|
jpayne@68
|
91 if(line==null){break;}
|
jpayne@68
|
92 list.add(line);
|
jpayne@68
|
93 }
|
jpayne@68
|
94 ListNum<byte[]> ln=new ListNum<byte[]>(list, nextID);
|
jpayne@68
|
95 nextID++;
|
jpayne@68
|
96 return ln;
|
jpayne@68
|
97 }
|
jpayne@68
|
98
|
jpayne@68
|
99 public final boolean exists(){
|
jpayne@68
|
100 return name().equals("stdin") || name().startsWith("stdin.") || name().startsWith("jar:") || new File(name()).exists(); //TODO Ugly and unsafe hack for files in jars
|
jpayne@68
|
101 }
|
jpayne@68
|
102
|
jpayne@68
|
103 public abstract InputStream is();
|
jpayne@68
|
104 public abstract long lineNum();
|
jpayne@68
|
105
|
jpayne@68
|
106 /** Returns true if there was an error */
|
jpayne@68
|
107 public abstract boolean close();
|
jpayne@68
|
108
|
jpayne@68
|
109 public abstract byte[] nextLine();
|
jpayne@68
|
110
|
jpayne@68
|
111 // public final void pushBack(byte[] line){
|
jpayne@68
|
112 // assert(pushBack==null);
|
jpayne@68
|
113 // pushBack=line;
|
jpayne@68
|
114 // }
|
jpayne@68
|
115
|
jpayne@68
|
116 public abstract void pushBack(byte[] line);
|
jpayne@68
|
117
|
jpayne@68
|
118 public abstract boolean isOpen();
|
jpayne@68
|
119
|
jpayne@68
|
120 public final String name(){return ff.name();}
|
jpayne@68
|
121 public final boolean allowSubprocess(){return ff.allowSubprocess();}
|
jpayne@68
|
122
|
jpayne@68
|
123 public final FileFormat ff;
|
jpayne@68
|
124
|
jpayne@68
|
125 /** Force usage of ByteFile1 */
|
jpayne@68
|
126 public static boolean FORCE_MODE_BF1=false;//!(Data.GENEPOOL || Data.DENOVO || Data.CORI || Shared.WINDOWS);
|
jpayne@68
|
127
|
jpayne@68
|
128 /** Force usage of ByteFile2 */
|
jpayne@68
|
129 public static boolean FORCE_MODE_BF2=false;
|
jpayne@68
|
130
|
jpayne@68
|
131 /** Unused */
|
jpayne@68
|
132 @Deprecated
|
jpayne@68
|
133 public static boolean FORCE_MODE_BF3=false;
|
jpayne@68
|
134
|
jpayne@68
|
135 protected final static byte slashr='\r', slashn='\n', carrot='>', plus='+', at='@';//, tab='\t';
|
jpayne@68
|
136
|
jpayne@68
|
137 // byte[] pushBack=null;
|
jpayne@68
|
138 private long nextID=0;
|
jpayne@68
|
139
|
jpayne@68
|
140 }
|