0%

java用文件实现类似数据库的增删改查

2017年7月7日 下午6:17

分为三部分:

  1. FileImpl.class 接口类,说明了其中各个方法的作用
  2. MyFile.class 是接口FileImpl.class的具体实现
  3. Test.class是一个测试类
    FileImpl.class
    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
    package cn.chenzhiheng.file.impl;

    import java.util.ArrayList;

    /**
    * 文件的接口,用来定义文件的功能
    * @author czh
    *
    */
    public interface FileImpl {
    /**
    * 获取一行数据
    * @param name 文件名
    * @param len 长度
    * @return String
    */
    String getLine(String name,int len);
    /**
    * 取一行数据,分割到数组
    * @param name 文件名
    * @param len 长度
    * @return String[]
    */
    String[] getLineArray(String name,int len);
    /**
    * 获取整个文件的内容
    * @param name
    * @return String[]
    */
    ArrayList<String> getTotalArray(String name);
    /**
    * 重写整个文件
    * @param strings
    * @param name
    */
    void insertTotal(ArrayList<String> list,String name);
    /**
    * 插入表头
    * @param name 文件名
    * @param len 长度
    * @param strings
    */
    void insertHead(String[] strings,String name);
    /**
    * 插入一条数据
    * @param name 文件名
    * @param len 长度
    */
    void insertLineArray(String[] strings,String name);
    /**
    * 插入一条数据
    * @param string 插入字符串
    * @param name 文件名
    */
    void insertLine(String string,String name,boolean flag);
    /**
    * 新建一个文件
    * @param name 文件名
    */
    void newFile(String name);
    /**
    * 分割一个字符串为String[]
    * @param string
    * @return String[]
    */
    String[] mySplit(String string);
    /**
    * 数据的更新
    * @param name 文件名
    * @param param1 用于定位
    * @param param2 用于更新
    * @param column1 param1列数
    * @param column2 param2列数
    */
    void updateLine(String name,String param1,String param2,int column1,int column2);
    /**
    * 获取此文件的总行数
    * @param name 文件名
    * @return int 数据的总行数
    */
    int getLineNum(String name);

    /**
    * 数据的删除
    * @param name 文件名
    * @param param1 用于定位
    * @param param2 用于更新
    * @param column1 param1列数
    * @param column2 param2列数
    */
    void deleteLine(String name,String param1,String param2,int column1,int column2);


    }

MyFile.class

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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
package cn.chenzhiheng.file;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;

import cn.chenzhiheng.file.impl.FileImpl;
/**
* 实现FileImpl接口的File类
* @author czh
*
*/
public class MyFile implements FileImpl{

@Override
public String getLine(String name,int len) {
try {
FileReader fr;
fr = new FileReader(name);
BufferedReader br = new BufferedReader(fr);

String string = new String();
string = br.readLine();
//循环找到第len行数据
for(int i = 1 ; i <= len && string !=null;i++){
string = br.readLine();
}

br.close();
fr.close();

return string;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}

@Override
public String[] getLineArray(String name,int len) {

try {
FileReader fr;
fr = new FileReader(name);
BufferedReader br = new BufferedReader(fr);

String string = new String();
string = br.readLine();
//循环找到第len行数据
for(int i = 1 ; i <= len && string !=null;i++){
string = br.readLine();
}

br.close();
fr.close();

return mySplit(string);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;

}


@Override
public void insertHead(String[] strings,String name) {
try {
FileWriter fw;
//这里是覆盖,小心使用
fw = new FileWriter(name);
BufferedWriter bw = new BufferedWriter(fw);

String string = new String();
for(int i = 0;i < strings.length;i++){
string +="\t"+strings[i];
}

bw.write(string);
bw.flush();
bw.newLine();

bw.close();
fw.close();

} catch (IOException e) {
e.printStackTrace();
}

}

@Override
public void insertLineArray(String[] strings,String name) {

try {
FileWriter fw;
//这里是追加
fw = new FileWriter(name,true);
BufferedWriter bw = new BufferedWriter(fw);

String string = new String();
for(int i = 0;i < strings.length;i++){
string +="\t"+strings[i];
}

bw.write(string);
bw.flush();
bw.newLine();

bw.close();
fw.close();

} catch (IOException e) {
e.printStackTrace();
}

}


@Override
public void insertLine(String string, String name,boolean flag) {
try {
FileWriter fw;
//这里是追加
fw = new FileWriter(name,flag);
BufferedWriter bw = new BufferedWriter(fw);

bw.write(string);
bw.flush();
bw.newLine();

bw.close();
fw.close();

} catch (IOException e) {
e.printStackTrace();
}

}


@Override
public void newFile(String name) {
File file = new File(name);
if(file.exists()){
System.out.println("文件已存在");
}
else{
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("已经创建文件");
}

}

@Override
public String[] mySplit(String string) {
//将取出的数据分解到rstr
String rstr[] = new String[2];
rstr = string.split("\t");

return rstr;
}

@Override
public void updateLine(String name, String param1, String param2,int column1,int column2) {
String string;//取出来的一行
String[] strings;//取出来的一行

//得到整个文件内容+数据头
ArrayList<String> list =getTotalArray(name);
System.out.println(list);

//取出来一行判断一行+出去数据头
for(int i = 1;i < list.size();i++){
string = list.get(i);

strings = mySplit(string);
if(strings[column1].equals(param1)){
//将字符串进行替换
strings[column2]=param2;

string = "";
for(int j = 0;j < strings.length;j++){
string += strings[j]+"\t";
}
//改变list中的内容
list.remove(i);
list.add(i,string);
System.out.println(string);
break;
}

}
System.out.println(list);
//再次写入到文件中
insertTotal(list, name);


}

@Override
public int getLineNum(String name) {
String string=getLine(name,1);
int i = 1;
while(string != null){
string=getLine(name,++i);
}
//数据的行数
return i-1;

}

@Override
public ArrayList<String> getTotalArray(String name) {
ArrayList<String> list = new ArrayList();
int num = getLineNum(name);
//这里特殊,从0行开始,要把表头也算上
for(int i = 0;i <= num ;i++){
list.add(getLine(name,i));
}
return list;
}

@Override
public void insertTotal(ArrayList<String> list, String name) {
//0要覆盖原来的内容
insertLine(list.get(0), name,false);
//从1开始
for(int i = 1; i < list.size();i++ ){
insertLine(list.get(i), name,true);

}

}

@Override
public void deleteLine(String name, String param1, String param2, int column1, int column2) {
String string;//取出来的一行
String[] strings;//取出来的一行

//得到整个文件内容+数据头
ArrayList<String> list =getTotalArray(name);
System.out.println(list);

//取出来一行判断一行+出去数据头
for(int i = 1;i < list.size();i++){
string = list.get(i);

strings = mySplit(string);
if(strings[column1].equals(param1)){

//改变list中的内容
list.remove(i);

System.out.println(string);
break;
}

}
System.out.println(list);
//再次写入到文件中
insertTotal(list, name);

}



}

测试类

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
package cn.chenzhiheng.test;

import cn.chenzhiheng.file.MyFile;

public class Test {

public static void main(String[] args) {
//文件功能测试-成功
MyFile file = new MyFile();
file.newFile("hello.txt");
String[] strings ={"1","2","3"};
String[] strings1 ={"11","21","31"};
String[] strings2 ={"cc","cc","cc"};
file.insertHead(strings, "hello.txt");
file.insertLineArray(strings1, "hello.txt");
file.insertLineArray(strings2, "hello.txt");
System.out.println(file.getLine("hello.txt", 1));
String[] strings3=file.getLineArray("hello.txt", 1);
for(int i =0;i<strings3.length;i++){
System.out.println(strings3[i]);
}

System.out.println(file.getLineNum("hello.txt"));
file.updateLine("hello.txt", "21", "55", 2, 3);
file.deleteLine("hello.txt", "21", "55", 2, 3);
}

}