java远程读写大文件效率问题

zzy_ammy 2015-08-28 11:02:26
加精
我这边需要远程登陆一个linux服务器读取文件写入本地
所以不能用FILE类,因为File类是读本地的
代码如下

public void copyFile(String ip,String user,String pwd,String readFile,String writeFile){

try{
if(login(ip,user,pwd)){
//打开会话
Session session =conn.openSession();
String shPath = "cat ".concat(readFile);
//运行命令
session.execCommand(shPath);
//获取返回信息
stdOut=new StreamGobbler(session.getStdout());

BufferedReader br = new BufferedReader(new InputStreamReader(stdOut));
Writer out = new FileWriter(new File(writeFile));
String line;
while((line = br.readLine()) != null){
//System.out.println(line);
out.write(line.concat("\n"));
}
}catch(...){
...
}
问题是这个是日志文件,有150几兆,用readline()是读一行写一行,效率太低了,读写完成个150兆的文件需要1分多钟
求各位大神指教下有什么更好的办法提高效率么,比如几行几行扫或者几兆几兆扫的
...全文
1562 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
沸羊羊一个 2015-09-07
  • 打赏
  • 举报
回复
过来喵喵,学习学习
qq_31120973 2015-09-07
  • 打赏
  • 举报
回复
新手一枚,学习下
ting9452000 2015-09-05
  • 打赏
  • 举报
回复
learning
wasdasdfqwer 2015-09-03
  • 打赏
  • 举报
回复
Evankaka 2015-09-02
  • 打赏
  • 举报
回复
有三个方法: 1、使用NIO来做 2、使用内存映射来做 3、分块分行
jpq1991 2015-09-01
  • 打赏
  • 举报
回复
新手一起学习下
jingsan0801 2015-09-01
  • 打赏
  • 举报
回复
大概的步骤应该是分两步 1. 从服务器下载文件到本地 2. 在本地解析文件 实现第一步,方法有很多, 比如开 ftp 定时上传到本地或在本地从服务器定时下载, 或者直接共享文件夹,或者通过 nfs 同步文件 , 如果文件很大, 日志是文本文件,压缩一下再传输, 速度会快好几倍; 第二步用 java 解析日志文件, 不能一行一行的读, 可以用 buffer 成块的读, 或者使用NIO. 楼主觉得呢?
robake 2015-09-01
  • 打赏
  • 举报
回复
一行一行的读来再解析典型是傻啊,你这是相当于直接在服务器内存中把文件打开,再把内容一行一行读出来,这样多耗资源! 为何不先将文件下载到本地再来解析?像楼上有人说的ftp,或者你布署到apache里,通过url下载,不可以么?
天空趋虚 2015-08-31
  • 打赏
  • 举报
回复
毕竟,日志的增长是无限的,宽带是有限的。
天空趋虚 2015-08-31
  • 打赏
  • 举报
回复
我觉得要显示日志的话,还是不要把所有日志写一个文件比较好,不如按天写日志文件,显示的时候就显示最近几天的,需要的时候显示更多; 或者不知道有没有读取一部分文件的方法(没接触过不能确定)
铁匠梁 2015-08-31
  • 打赏
  • 举报
回复
完全可以在linux服务器上生成结果文件再下载,不用边下载,边解析。
laoer_2002 2015-08-31
  • 打赏
  • 举报
回复
学习
skgary 2015-08-31
  • 打赏
  • 举报
回复
引用 10 楼 zzy_ammy 的回复:
好的吧,虽然这个办法不实际,但也是学到了,其实我还是想用java代码去解决这个问题的,还是谢谢你了
hehe,linux有很多实用的命令和工具,套在java里,事倍功半。
zzy_ammy 2015-08-30
  • 打赏
  • 举报
回复
引用 9 楼 skgary 的回复:
[quote=引用 6 楼 skgary 的回复:] [quote=引用 4 楼 zzy_ammy 的回复:] [quote=引用 3 楼 skgary 的回复:] 我觉得你这段代码是本地写入慢吧 没有用buffer write?
做过测试,不写入光读77秒 我这样写法读写也是77秒 所以跟写入基本没什么太大关系,问题就是一行行读太慢啦![/quote] 我猜你现在应该是通过ssh之类的直接到服务器上去执行了cat 命令,那你有没有试过直接通过nfs mount上,或者直接用scp copy到本地进行读写呢? 而且从你的代码来看,似乎就是一行一行的读出,再一行一行的写入,没有对内容进行操作。 直接scp全文件copy到本地不行么?[/quote] scp是 linux下的命令啊 你现在实际上也是远程执行了一个cat的命令,改一下,直接执行scp命令不就好了。[/quote] 好的吧,虽然这个办法不实际,但也是学到了,其实我还是想用java代码去解决这个问题的,还是谢谢你了
Inhibitory 2015-08-28
  • 打赏
  • 举报
回复
FTP 文件下载
zzy_ammy 2015-08-28
  • 打赏
  • 举报
回复
引用 3 楼 skgary 的回复:
我觉得你这段代码是本地写入慢吧 没有用buffer write?
做过测试,不写入光读77秒 我这样写法读写也是77秒 所以跟写入基本没什么太大关系,问题就是一行行读太慢啦!
skgary 2015-08-28
  • 打赏
  • 举报
回复
我觉得你这段代码是本地写入慢吧 没有用buffer write?
zzy_ammy 2015-08-28
  • 打赏
  • 举报
回复
引用 1 楼 rui888 的回复:
分块,归并。
能详细说一下么
tony4geek 2015-08-28
  • 打赏
  • 举报
回复
分块,归并。
skgary 2015-08-28
  • 打赏
  • 举报
回复
引用 6 楼 skgary 的回复:
[quote=引用 4 楼 zzy_ammy 的回复:] [quote=引用 3 楼 skgary 的回复:] 我觉得你这段代码是本地写入慢吧 没有用buffer write?
做过测试,不写入光读77秒 我这样写法读写也是77秒 所以跟写入基本没什么太大关系,问题就是一行行读太慢啦![/quote] 我猜你现在应该是通过ssh之类的直接到服务器上去执行了cat 命令,那你有没有试过直接通过nfs mount上,或者直接用scp copy到本地进行读写呢? 而且从你的代码来看,似乎就是一行一行的读出,再一行一行的写入,没有对内容进行操作。 直接scp全文件copy到本地不行么?[/quote] scp是 linux下的命令啊 你现在实际上也是远程执行了一个cat的命令,改一下,直接执行scp命令不就好了。
加载更多回复(3)

50,527

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧