黑马程序员技术交流社区
标题:
关于IO流文件复制问题
[打印本页]
作者:
崔政
时间:
2012-11-18 21:00
标题:
关于IO流文件复制问题
在毕老师的视频中,我们学会了复制文件,但是,文件的后缀名都是起好的。
有的用的是ip地址,有的则是重新起的名字。
我想知道如何获取文件的名字,并且也能同时获取文件的数据。
我自己试了不可行, 有没有高手来解答下
以下是我的代码
class UploadFileClient{
public static void main(String[] args){
try{
File file=new File("exercise.txt");
if(!(file.exists()||file.isDirectory())){
System.out.println("上传文件不存在或不是文件");
return ;
}
Socket s=new Socket("192.168.1.3",9000);
BufferedInputStream bis=new BufferedInputStream(new FileInputStream(file));
PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
String filename=file.getName();
pw.println(filename);
BufferedOutputStream bos=new BufferedOutputStream(s.getOutputStream());
byte[]buf=new byte[1024];
int len=0;
while((len=bis.read(buf))!=-1){
bos.write(buf,0,len);
bos.flush();
}
s.shutdownOutput();//定义结束标记
BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
String line=br.readLine();
System.out.println(line);
}catch(Exception e){
throw new RuntimeException("客户端上传异常");
}
}
}
class UploadThread implements Runnable{
private Socket s;
public UploadThread(Socket s){
this.s=s;
}
public void run() {
String ip=s.getInetAddress().getHostAddress();
BufferedInputStream bis=null;
FileOutputStream fos=null;
BufferedOutputStream bos=null;
BufferedReader br=null;
PrintWriter pw=null;
try{
br=new BufferedReader(new InputStreamReader(s.getInputStream()));
String filename=br.readLine();
fos=new FileOutputStream(new File(ip+filename));
bis=new BufferedInputStream(s.getInputStream());
int len=0;
byte[]buf=new byte[1024];
len=bis.read(buf);
while((len=bis.read(buf))!=-1){
fos.write(buf,0,len);
fos.flush();
System.out.println(new String(buf,0,len ));
}
pw=new PrintWriter(s.getOutputStream(),true);
pw.println("文件上传成功!");
s.close();
}catch(Exception e){
throw new RuntimeException("服务器上传文件失败!");
}finally{
try{
if(bis!=null)
bis.close();
}catch(IOException io1){
throw new RuntimeException("服务器读取流关闭失败");
}
if(pw!=null)
pw.close();
try{
if(fos!=null)
fos.close();
}catch(IOException io1){
throw new RuntimeException("服务器文件输出流关闭失败");
}
}
}
}
class UploadServer{
public static void main(String[] args){
try{
ServerSocket ss=new ServerSocket(9000);
Socket s=ss.accept();
new Thread(new UploadThread(s)).start();
}catch(Exception e){
throw new RuntimeException("服务器上传异常");
}
}
}
复制代码
作者:
ssx0101
时间:
2012-11-18 22:03
本帖最后由 曹自祥 于 2012-11-18 22:06 编辑
使用文件类File进行操作:
File file=new File("F:\\a.txt");//file是F盘里文件名为“a.txt”的文件。
File file_1=new File("D:\\"+file.getName);//getName返回的是文件名“a.txt”,而不是绝对路径“F:\\a.txt”
这样file_1就是在D盘里与file同名的文件了。
再把file和file_1封装进数据流里面。
作者:
王阳
时间:
2012-11-18 22:15
标红色的代码你看下,你都已经封装成字符流去读取了,下面的字节流当然读取不出来的,这一点上个人认为是这样的Socket输出的时候可以,但是输入的时候就不行了。
蓝色的代码是我加的,你打印看看。
class UploadThread implements Runnable{
private Socket s;
public UploadThread(Socket s){
this.s=s;
}
public void run() {
String ip=s.getInetAddress().getHostAddress();
BufferedInputStream bis=null;
FileOutputStream fos=null;
BufferedOutputStream bos=null;
BufferedReader br=null;
PrintWriter pw=null;
try{
br=new BufferedReader(new InputStreamReader(s.getInputStream()));
String filename=br.readLine();
String line = null;
while((line = br.readLine)!= null){
System.out.println(line);
}
fos=new FileOutputStream(new File(ip+filename));
bis=new BufferedInputStream(s.getInputStream());
int len=0;
byte[]buf=new byte[1024];
len=bis.read(buf);
while((len=bis.read(buf))!=-1){
fos.write(buf,0,len);
fos.flush();
System.out.println(new String(buf,0,len ));
}
pw=new PrintWriter(s.getOutputStream(),true);
pw.println("文件上传成功!");
s.close();
}catch(Exception e){
throw new RuntimeException("服务器上传文件失败!");
}finally{
try{
if(bis!=null)
bis.close();
}catch(IOException io1){
throw new RuntimeException("服务器读取流关闭失败");
}
if(pw!=null)
pw.close();
try{
if(fos!=null)
fos.close();
}catch(IOException io1){
throw new RuntimeException("服务器文件输出流关闭失败");
}
}
}
}
作者:
陈军
时间:
2012-11-19 11:36
我给你个建议: 你可以设计一个简单协议。 在文件传输之前发送。
协议用来封装你要在文件传输之前要发送的信息(比如文件名,大小,验证信息等等)。
这样就可以实现网络传输文件。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2