java怎样读取http文件服务器上的文件列表并下载?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java怎样读取http文件服务器上的文件列表并下载?相关的知识,希望对你有一定的参考价值。
例如:我的http文件服务器的url是:http://192.168.168.151,上面放着test1.txt;test2.txt;test3.txt三个文本文件,怎么用java写个程序来下载这三个文件呢?要求不能在代码里面写死文件名,要从服务器上查到。
把要下载的文件名存在数据库中,载入页面通过servlet或者action或者采用javaBean读取数据库数据,然后遍历出来,再通过servlet或者action的outputstream下载即可 参考技术A 要求文件名不能写死,那么只能到服务器上去遍历目录,如果服务器开了ftp权限的话到可以用apache的commons-net包,里面有ftp功能可以上传下载文件,也可以遍历文件本回答被提问者采纳 参考技术B 文件名不写死,可以用 File f = new File("存文件的目录");调用 String f_names[] = f.list()显示该目录下的所有文件
根据路径和文件名就可以得到相应的文件链接了,也就可以将其下载下来了。
怎样用Java读写二进制文件
参考技术A import java.util.*;import java.io.*;
class SmallFile
static final int HEADLEN = 24; //头总长度
byte[] fileName = new byte[16]; //列表文件名1: 长度128 想把它读到char[]里 它的编码方式不是Unicode。在不确定编码方式的时候,最好直接用byte[]来存放
int offset; //列表文件地址1: 长度32 想把它读到int里
int length = -1; //列表文件长度1: 长度32 想把它读到int里
byte[] content;
public SmallFile()
public SmallFile(byte[] fn, byte[] content)
Arrays.fill(fileName, (byte) 0);
if (fn != null)
if (fn.length <= 16)
System.arraycopy(fn, 0, fileName, 0, fn.length);
else
System.arraycopy(fn, 0, fileName, 0, 16);
this.content = content;
if (content != null)
this.length = content.length;
else
this.length = -1;
public class ReadBinary
static final int HEADLEN = 8; //头总长度
private String filename;
private byte[] filehead = new byte[4]; //文件头: 长度32 想把它读到char[]里 它的编码方式不是Unicode
private int filecount = -1; //列表长度: 长度32 想把它读到int里 假设他是3 就会有3个列表文件名
private List<SmallFile> files = null;
public void setFilehead(byte[] fh)
if (fh == null)
return;
Arrays.fill(filehead, (byte) 0);
if (fh.length <= 4)
System.arraycopy(fh, 0, filehead, 0, fh.length);
else
System.arraycopy(fh, 0, filehead, 0, 4);
public ReadBinary(String filename)
try
readFromFile(filename);
catch (Exception ex)
System.out.println(ex.getMessage());
System.out.println("在载入数据文件时失败,因此视同为新建一个数据文件!");
this.filename = filename;
Arrays.fill(filehead, (byte) 0);
filecount = 0;
files = new ArrayList<SmallFile> ();
public void readFromFile(String filename) throws Exception
BufferedInputStream bin = new BufferedInputStream(new FileInputStream(
filename));
this.filename = filename;
DataInputStream in = new DataInputStream(bin);
in.read(filehead); //文件头: 长度32 想把它读到char[]里 它的编码方式不是Unicode
filecount = in.readInt(); //列表长度: 长度32 想把它读到int里 假设他是3 就会有3个列表文件名
if (files == null)
files = new ArrayList<SmallFile> ();
else
files.clear();
for (int i = 0; i < filecount; i++)
SmallFile file = new SmallFile();
in.read(file.fileName);
file.offset = in.readInt(); //列表文件地址1: 长度32 想把它读到int里
file.length = in.readInt(); //列表文件长度1: 长度32 想把它读到int里
files.add(file);
public void writeToFile() throws Exception
String temp = filename + ".tmp"; //临时文件
boolean exists = false;
RandomAccessFile raf = null;
try
raf = new RandomAccessFile(filename, "r"); //文件存在则从文件读入
exists = true;
catch (Exception ex)
System.out.println("文件不存在,因此启用内存写入模式");
if (filecount != files.size())
throw new Exception("怪事,居然不相同??");
DataOutputStream out = new DataOutputStream(new BufferedOutputStream(new
FileOutputStream(temp)));
//1、写总文件头
out.write(filehead);
out.writeInt(filecount);
//2、写列表头
int sumlength = 0;
for (int i = 0; i < files.size(); i++)
SmallFile file = files.get(i);
out.write(file.fileName);
if (file.length < 0)
throw new Exception("怪事,文件长度怎么可能小于0?");
else
out.writeInt(ReadBinary.HEADLEN + SmallFile.HEADLEN * filecount +
sumlength);
sumlength += file.length;
out.writeInt(file.length);
//3、写文件内容
for (int i = 0; i < files.size(); i++)
SmallFile file = files.get(i);
if (file.content != null && (file.length == file.content.length))
out.write(file.content);
else if (exists)
raf.seek(file.offset);
byte[] b = new byte[file.length];
raf.read(b);
System.out.println("b:" + new String(b));
out.write(b);
else
throw new Exception("怪事,又不能从内存读,又不能从文件读。这活没法干了!");
out.close();
if (raf != null)
raf.close();
raf = null;
System.gc();
//把原先的文件删除
File f = new File(filename);
f.delete();
//再把临时文件改名到正式文件
File f2 = new File(temp);
f2.renameTo(f);
public void addFile(SmallFile file)
if (files != null)
filecount++;
files.add(file);
public static void test1()
ReadBinary rb = new ReadBinary("f:\\temp\\rb.dat");
rb.setFilehead("HEAD1234567890122222222222222222".getBytes());
SmallFile f = new SmallFile("第1个文件".getBytes(), "第1个文件的内容".getBytes());
rb.addFile(f);
try
rb.writeToFile();
catch (Exception ex)
ex.printStackTrace();
public static void test2()
ReadBinary rb = new ReadBinary("f:\\temp\\rb.dat");
rb.setFilehead("HEA".getBytes());
SmallFile f = new SmallFile("第2个文件".getBytes(), "第2个文件的内容".getBytes());
rb.addFile(f);
try
rb.writeToFile();
catch (Exception ex)
ex.printStackTrace();
public static void main(String[] args)
//test1();
test2();
本回答被提问者和网友采纳
以上是关于java怎样读取http文件服务器上的文件列表并下载?的主要内容,如果未能解决你的问题,请参考以下文章