首先写一个函数来获取Scanner对象。
Scanner reader = null;
try {
reader = new Scanner(new File(filepath));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return reader;
然后在读取文件时,将文件路径传入,获得Scanner对象reader,之后使用reader.nextLine()方法来进行逐行的读入,如果需要建图操作,再调用相应类型的图的构建指令进行对图的操作。
在读取文件时我们首先写一个函数来获取BufferReader对象。
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader(filepath));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return reader;
然后在读取文件时,将文件路径传入,获得BufferReader对象reader,之后使用reader.readLine()方法来进行逐行的读入,如果需要建图操作,再调用相应类型的图的构建指令进行对图的操作。
在写入文件时我们首先写一个函数来获取BufferWriter对象。
BufferedWriter writer = null;
try {
writer = new BufferedWriter(new FileWriter(filepath));
} catch (IOException e) {
e.printStackTrace();
}
return writer;
然后在读取文件时,将文件路径传入,获得BufferWriter对象writer,之后使用writer.write(String string)方法来进行逐行的写入,我们修改每个顶点和边的toString方法,使得符合文件的语法要求,然后我们使用遍历图g中的顶点集合和边集合,调用其toString方法写入文件。我们也要将GraphName,GraphType,VertexType,EdgeType等参数根据图的类型进行写入文件操作。
在进行文件的读取时,首先获得文件的通道:
FileChannel.open(Paths.get(filepath), StandardOpenOption.READ);
之后我们使用ByteBuffer作为字符的缓冲区,使用temp字节数组用于存储不完整的行的内容,判断是否出现了换行符,注意这要区分LF-\n,CR-\r,CRLF-\r\n,这里判断\n。如果出现了换行符,将temp中的内容与换行符之前的内容拼接,将换行符之后的内容(去除换行符)存到temp中。如果没出现换行符,则将内容保存到temp中。
如果需要建图操作,我们在读取到一行的内容以后,使用相应类型的图的构建指令进行对图的操作。
在进行文件的写入时,同样先获得文件的通道:
FileChannel.open(Paths.get(filepath), StandardOpenOption.WRITE);
我们使用ByteBuffer作为字符的缓冲区,要将String写入文件,我们需要先将这个字符串放入字符缓冲区,然后必须要调用buffer的flip方法,(使缓冲区为一系列新的通道写入或相对获取操作做好准备:它将限制设置为当前位置,然后将位置设置为0。)再将buffer的内容使用channel.write(buffer)写入文件。在进行下一次写入时,需要使用buffer.clear()清空buffer,否则可能因为缓冲区大小不够而报错。
读文件的代码示例:
File file = new File("file1.txt");
FileChannel fileChannel = new RandomAccessFile(file,"r").getChannel();
ByteBuffer byteBuffer = ByteBuffer.allocate(10);
//使用temp字节数组用于存储不完整的行的内容
byte[] temp = new byte[0];
while(fileChannel.read(byteBuffer) != -1) {
byte[] bs = new byte[byteBuffer.position()];
byteBuffer.flip();
byteBuffer.get(bs);
byteBuffer.clear();
int startNum=0;
//判断是否出现了换行符,注意这要区分LF-\n,CR-\r,CRLF-\r\n,这里判断\n
boolean isNewLine = false;
for(int i=0;i < bs.length;i++) {
if(bs[i] == 10) {
isNewLine = true;
startNum = i;
}
}
if(isNewLine) {
//如果出现了换行符,将temp中的内容与换行符之前的内容拼接
byte[] toTemp = new byte[temp.length+startNum];
System.arraycopy(temp,0,toTemp,0,temp.length);
System.arraycopy(bs,0,toTemp,temp.length,startNum);
//将换行符之后的内容(去除换行符)存到temp中
temp = new byte[bs.length-startNum-1];
System.arraycopy(bs,startNum+1,temp,0,bs.length-startNum-1);
//使用return即为单行读取,不打开即为全部读取
//此时Totemp中已经为读好的一行。可用System.out.println(new String(toTemp)); 打印出来
// return;
} else {
//如果没出现换行符,则将内容保存到temp中
byte[] toTemp = new byte[temp.length + bs.length];
System.arraycopy(temp, 0, toTemp, 0, temp.length);
System.arraycopy(bs, 0, toTemp, temp.length, bs.length);
temp = toTemp;
}
}
写文件的代码示例:
GraphPoet g;
FileOutputStream fos = null;
fos = new FileOutputStream(new File(filepath));
FileChannel channel = fos.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(2048);
String string = "GraphType = \"GraphPoet\"\n";
buffer.put(string.getBytes());
buffer.flip(); // 此处必须要调用buffer的flip方法
channel.write(buffer);
buffer.clear();
string = "GraphName = \"" + g.getName() + "\"\n";
buffer.put(string.getBytes());
buffer.flip();
channel.write(buffer);
buffer.clear();
另一种较为简单的方式为使用Files.readAllLines()函数。返回值为String数组。
GraphPoet g = new GraphPoet();
Path path = Paths.get(filepath);
for (String line : Files.readAllLines(path)) {
FileStrategy.creatGraphPoet(line, g);
}
在读入文件时使用FileReader进行读入。
FileReader fr = new FileReader ("file1.txt");
BufferedReader br = new BufferedReader (fr);
String s;
while ((s = br.readLine() )!=null) {
System.out.prinln (s);
}
fr.close();
在写入文件时我们首先写一个函数来获取FileWriter对象。
FileWriter writer = null;
try {
writer = new FileWriter(filepath);
} catch (IOException e) {
e.printStackTrace();
}
return writer;
然后在读取文件时,将文件路径传入,获得FileWriter对象writer,之后使用writer.write(String string)方法来进行逐行的写入,我们修改每个顶点和边的toString方法,使得符合文件的语法要求,然后我们使用遍历图g中的顶点集合和边集合,调用其toString方法写入文件。我们也要将GraphName,GraphType,VertexType,EdgeType等参数根据图的类型进行写入文件操作。
Java NIO 读取文件、写入文件、读取写入混合
https://blog.csdn.net/z69183787/article/details/77101184
使用FileReader和FileWriter读取写入文件内容
https://blog.csdn.net/miyuki0424/article/details/307904
Java NIO 按行读取超大文件
https://blog.csdn.net/strawberrynick/article/details/54949599
Java nio 文件操作 Path,Files类详解一
https://blog.csdn.net/LuoZheng4698729/article/details/51697648