文件断点续传
最近因为开发任务,涉及到一个文件断点续传,看了一下重点就是RandomAccessFile类
RandomAccessFile :
随机存取文件。一个随机访问文件的行为就像一个大的存储在文件系统中的字节数组。有一种光标,或索引进入隐含数组,称为文件指针;输入操作从文件指针开始读取字节并前进文件指针超过读取的字节。如果随机访问文件是以读/写模式创建,输出操作也可用;输出操作从文件指针开始写入字节并前进文件指针超过所写的字节。输出操作写超过隐含数组的当前末尾导致数组为扩展
我用GUI搞了个界面,看着更直观一点,不多说上代码,一个简单的Demo
发送文件:
/**
* 断点续传 ----发送方
*/
public class DDXCSendFile extends Thread {
private Socket socket = null;
//输入输出字节流
private DataOutputStream dataOutputStream;
private DataInputStream dataInputStream;
//随意读取文件类
private RandomAccessFile randomAccessFile;
//搞一个GUI界面
private JFrame jFrame;
private Container container;
private JLabel jLabel;
private JProgressBar jProgressBar;
public DDXCSendFile() {
jFrame = new JFrame("oO=断点续传=Oo");
try {
socket = new Socket("localhost", 8080);
} catch (IOException e) {
e.printStackTrace();
}
}
//上传方法
public void run() {
//文件选择器
JFileChooser jFileChooser = new JFileChooser();
int dialog = jFileChooser.showOpenDialog(null);
if (dialog == JFileChooser.APPROVE_OPTION) {
String path = jFileChooser.getSelectedFile().getPath();
try {
dataOutputStream = new DataOutputStream(socket.getOutputStream());
dataInputStream = new DataInputStream(socket.getInputStream());
dataOutputStream.writeUTF("ok");
//读取这个文件,权限只是读取
randomAccessFile = new RandomAccessFile(path, "r");
File file = new File(path);
byte[] bytes = new byte[1024];
dataOutputStream.writeUTF(file.getName());
dataOutputStream.flush();
String readUTF = dataInputStream.readUTF();
if (readUTF.equals("ok")) {
//已发送大小
long readLong = dataInputStream.readLong();
dataOutputStream.writeLong(randomAccessFile.length());
dataOutputStream.writeUTF("ok");
dataOutputStream.flush();
//偏移量--及发送了多少
long offset = readLong;
int sendSize = (int) (randomAccessFile.length() / 1024);
int sendOffset = (int) (offset / 1024);
//发送窗口
jFrame.setSize(300, 300);