java IO问题求助!

damoguyan258 2012-07-14 11:27:54
源码为:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;

public class regex {
public static void main (String args[]) throws IOException{
byte bt[]=new byte[10000];
File file = new File("C:\\test.txt");
if(!file.exists()){
System.out.println("文件找不到");
}
RandomAccessFile raf = new RandomAccessFile(file, "rw");
System.out.println(file.length());
raf.seek(0);
for(int i=0;i<=raf.length();i++){
bt[i] = raf.readByte();

}

String s = new String(bt);
System.out.print("文件输出"+s);
Pattern p = Pattern.compile("Referer:(.*?)Accept",Pattern.DOTALL);
Matcher m = p.matcher(s);
if (m.find()) {
System.out.println("正则输出:"+m.group(1));
}
else System.out.println("no result");

}
}
C:\\test.txt 内容为:

op=msgcount&charset=gbk&callback=IMOld&refer=hi.baidu.com&un=damoguyan258&.stamp=h4l6m487 HTTP/1.1
Accept: */*
Referer: http://zhidao.baidu.com/question/120610720.html
Accept-Language: zh-CN
Accept-Encoding: gzip, deflate
ThreadID: 5556
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; SE 2.X MetaSr 1.0)
Host: fetch.im.baidu.com
Connection: Keep-Alive
Cookie: BDUSS=Es3RC1QWmQtVi1QUEQxdmVsWS0xan51djBOUzM4ZkJCTVUzdW5qWEZ-endPdXBRQVFBQUFBJCQAAAAAAAAAAAokNw6t8CcOZGFtb2d1eWFuMjU4AAAAAAAAAAAAAAAAAAAAAAAAAACAYIArMAAAAOD6z5YqAAAALWdCAAAAAAAxMC4zNi4xMfDs~E~w7PxPa; BDUT=gggm542C2A08A4ADD4D59B38D1C778B79F7D1386ef17c2a0; BAIDUID=C338BC4650011A75CA5A05D7D2760BB8:FG=1; IM_old=0|h4l6m47x


两个问题:1、读入文件的eofexception怎么解决 2、我想得到Referer:后面的url,可为何正则表达式貌似没有执行一样,没有输出结果

小弟很菜,纠结了很久,求大侠给点时间帮忙解决一下!!!
...全文
218 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
MiceRice 2012-07-16
  • 打赏
  • 举报
回复
关于正则,建议你尝试按我3楼的来修改。

Windows中,换行一般是“\r\n”,并不是简单的“\n”。

所以你自己用字符串测试能正常,未必读取文件就能正常。
qybao 2012-07-15
  • 打赏
  • 举报
回复
byte bt[]=new byte[10000];
File file = new File("test.txt");
if(!file.exists()){
System.out.println("文件找不到");
}

RandomAccessFile raf = new RandomAccessFile(file, "rw");
ByteArrayOutputStream bos = new ByteArrayOutputStream();
int len = 0;
while ((len=raf.read(bt)) != -1) { //用eof判断循环更好一些
bos.write(bt, 0, len);
}
raf.close();

String s = new String(bos.toByteArray());
System.out.printf("文件输出:%s\n", s);
Pattern p = Pattern.compile("Referer:(.*?)Accept",Pattern.DOTALL);
Matcher m = p.matcher(s);
if (m.find())
System.out.println("正则输出:"+m.group(1));
else
System.out.println("no result");


LZ的正则应该可以的,如果不能匹配成功,说明是文件编码的问题,如果文件本身带有编码,应该用带编码的方式读入
damoguyan258 2012-07-15
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

看了一下逻辑,没有必要使用 RandomAccessFile 读取文件啊,使用 BufferedInputStream 就可以了。
[/Quote]

是我没有表述好,现在的问题应该是如何实现对一个文本文件的遍历,并且与正则式匹配。为何能打印出来,缺不能进行匹配
damoguyan258 2012-07-15
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

看了一下逻辑,没有必要使用 RandomAccessFile 读取文件啊,使用 BufferedInputStream 就可以了。
[/Quote]

RandomAccessFile 随时读取功能是不是更加强大一点?我的文档是需要抓包随时更新的!
  • 打赏
  • 举报
回复
看了一下逻辑,没有必要使用 RandomAccessFile 读取文件啊,使用 BufferedInputStream 就可以了。
damoguyan258 2012-07-15
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

引用 4 楼 的回复:
谢谢,请问边界怎么修改?


我3楼说的 <= 修改为 <,这个试了么?
[/Quote]

囧,问题在这里!多些帮助,可是我的正则表达式没有输出是怎么回事,我用正则式单独对String流处理的时候是能够输出我想要的结果的,结果从文件读取的时候就没有结果了,这问题又处在哪里呢?
damoguyan258 2012-07-15
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

Java code
byte bt[]=new byte[10000];
File file = new File("test.txt");
if(!file.exists()){
System.out.println("文件找不到");
}

RandomAccessFile raf = new RandomAccessFile(file, "rw");
ByteArrayOutpu……
[/Quote]

嗯,按兄台的意思应该是我即使能够打印,但也无法将从txt文档中取得的字符串用正则式比较?那是不是意味着我还要进行相应的编码格式的转换?问题有点多,希望能不吝赐教!!!
damoguyan258 2012-07-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

Pattern p = Pattern.compile("^Referer:(.*?)$");
[/Quote]

这位大虾,我查询的文档时多行模式的,用的正则表达式应该是没有问题的
damoguyan258 2012-07-14
  • 打赏
  • 举报
回复
没声了啊,求解啊~~~
damoguyan258 2012-07-14
  • 打赏
  • 举报
回复
谢谢,请问边界怎么修改?另正则式我测试过了,应该是没有问题滴
MiceRice 2012-07-14
  • 打赏
  • 举报
回复
1、读入文件的eofexception怎么解决
for(int i=0; i<=raf.length(); i++){
超界了,修改下:
for(int i=0; i<raf.length(); i++){



2、我想得到Referer:后面的url
Pattern p = Pattern.compile("Referer:(.*?)Accept",Pattern.DOTALL);
修改下试试看:
Pattern p = Pattern.compile("Referer:([^\\n]*)");
_jerrytiger 2012-07-14
  • 打赏
  • 举报
回复
Pattern p = Pattern.compile("^Referer:(.*?)$");
damoguyan258 2012-07-14
  • 打赏
  • 举报
回复
自己顶一下!求助!
MiceRice 2012-07-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
谢谢,请问边界怎么修改?
[/Quote]

我3楼说的 <= 修改为 <,这个试了么?

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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