设为首页 加入收藏

TOP

Java断点续传(基于socket与RandomAccessFile的简单实现)(三)
2019-09-02 23:33:21 】 浏览:26
Tags:Java 断点 基于 socket RandomAccessFile 简单 实现
InputStream方法会返回一个java.io.InputStream对象
dos.writeUTF(targetPath); //发送目标路径 dos.writeUTF(file.getName()); //发送文件名 //System.out.println("客户端:发送文件名"); rad = new RandomAccessFile(file.getPath(), "r"); /* * RandomAccessFile是Java输入输出流体系中功能最丰富的文件内容访问类,既可以读取文件内容,也可以向文件输出数据。 * 与普通的输入/输出流不同的是,RandomAccessFile支持跳到文件任意位置读写数据,RandomAccessFile对象包含一个记录指针,用以标识当前读写处的位置。 * 当程序创建一个新的RandomAccessFile对象时,该对象的文件记录指针对于文件头 r代表读取 */ dos.flush(); //作用见下方介绍 dos.writeLong(file.length()); //发送文件长度 //System.out.println("客户端:发送文件长度"); dos.flush(); long size = dis.readLong(); //读取当前已发送文件长度 //System.out.println("客户端:开始传输文件 "); int length = 0; byte[] bytes = new byte[1024]; //每1kb发送一次 if (size < rad.length()) { rad.seek(size); //System.out.println("客户端:文件定位完成"); //移动文件指针 while((length = rad.read(bytes)) > 0){ dos.write(bytes, 0, length); dos.flush(); //每1kb清空一次缓冲区 //为了避免每读入一个字节都写一次,java的输流有了缓冲区,读入数据时会首先将数据读入缓冲区,等缓冲区满后或执行flush或close时一次性进行写入操作 } } //System.out.println("客户端:文件传输成功 "); } } catch (Exception e) { e.printStackTrace(); } finally { //关闭资源 if(dos != null) dos.close(); if(dis != null) dis.close(); if(rad != null) rad.close(); client.close(); } } class cancelActionListener implements ActionListener{ //关闭按钮监听器 public void actionPerformed(ActionEvent e3){ try { //System.out.println("客户端:文件传输取消"); if(dis != null) dis.close(); if(dos != null) dos.close(); if(rad != null) rad.close(); client.close(); } catch (IOException e1) { } } } }

  传输文件是一个耗时操作,若直接实例化客户端对服务器发送数据会造成UI假死的情况,直到文件传输完成后才会恢复,所以建议在实例化客户端时单独建立一个新线程。

  测试代码:

import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.ActionEvent;

public class MainFrame extends JFrame{
    public MainFrame() {
        this.setSize(1280, 768);
        getContentPane().setLayout(null);
        
        JButton btnNewButton = new JButton("传输文件");    //点击按钮进行文件传输
        btnNewButton.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                // TODO 自动生成的方法存根
                super.mouseClicked(e);
                JFileChooser fileChooser = new JFileChooser();    //fileChooser用来选择要传输的文件
                fileChooser.setDialogTitle("选择要传输的文件");
                int stFile = fileChooser.showOpenDialog(null);
                if(stFile == fileChooser.APPROVE_OPTION){    //选择了文件
                    JFileChooser targetPathChooser = new JFileChooser();    //targetPathChooser用来选择目标路径
                    targetPathChooser.setDialogTitle("选择目标路径");
                    targetPathChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);    //只能选择路径
                    int stPath = targetPathChooser.showOpenDialog(null);
                    if(stPath == targetPathChooser.APPROVE_OPTION) {    //选择了路径
                        //新建一个线程实例化客户端
                        new Thread(new NewClient( fileChooser.getSelectedFile().getPath(), targetPathChooser.getSelectedFile().getPath())).start();
                    }
                }
            }
        });
        btnNewButton.setBounds(526, 264, 237, 126);
        getContentPane().add(btnNewButton);
    }
    class NewClient implements Runnable {    //用于实例化客户端的线程
        private String fileP;    //需复制文件路径
        private String targetP;    //
首页 上一页 1 2 3 4 下一页 尾页 3/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Java基础学习-一切皆为对象 下一篇开发人员调度软件

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目