-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathFileListIterator.java
123 lines (109 loc) · 2.66 KB
/
FileListIterator.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.ListIterator;
public class FileListIterator<T extends IContact> implements ListIterator<T> {
private long currentPosition;
private RandomAccessFile raf;
public FileListIterator(String fileName) throws IOException {
raf = new RandomAccessFile(fileName, "rw");
currentPosition = 0;
}
@SuppressWarnings("unchecked")
private T initContactWorkaround() {
return (T) new Contact();
}
@Override
public void add(T con) {
try {
raf.seek(raf.length());
con.writeObject(raf);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public boolean hasNext() {
try {
return currentPosition < raf.length();
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
@Override
public boolean hasPrevious() {
T con = initContactWorkaround();
return currentPosition > con.getObjectSize();
}
@Override
public T next() {
if (!hasNext()) {
throw new IndexOutOfBoundsException();
}
T con = initContactWorkaround();
try {
con.readObject(currentPosition, raf);
} catch (IOException e) {
e.printStackTrace();
return null;
}
currentPosition += con.getObjectSize();
return con;
}
@Override
public int nextIndex() {
T con = initContactWorkaround();
return (int)(currentPosition / con.getObjectSize());
}
@Override
public T previous() {
if (!hasPrevious()) {
throw new IndexOutOfBoundsException();
}
T con = initContactWorkaround();
currentPosition -= con.getObjectSize();
long previousPosition = currentPosition - con.getObjectSize();
try {
con.readObject(previousPosition, raf);
} catch (IOException e) {
e.printStackTrace();
return null;
}
return con;
}
@Override
public int previousIndex() {
T con = initContactWorkaround();
return (int)(currentPosition / con.getObjectSize()) - 1;
}
@Override
public void remove() {
T con = initContactWorkaround();
// i first thing read the one i want to remove
long removePosition = currentPosition;
try {
while (raf.length() - con.getObjectSize() >= raf.getFilePointer()) {
con.readObject(removePosition, raf);
raf.seek(removePosition - con.getObjectSize());
con.writeObject(raf);
removePosition += con.getObjectSize();
raf.seek(removePosition);
}
raf.setLength(raf.getFilePointer() - con.getObjectSize());
if (currentPosition > raf.length()) {
currentPosition = raf.length();
}
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void set(T con) {
try {
raf.seek(currentPosition - con.getObjectSize());
con.writeObject(raf);
} catch (IOException e) {
e.printStackTrace();
}
}
}