文件读写问题。谢谢啦!

qabp 2003-02-02 10:38:12
在某文件中查找某单词,找到就在该行的开头打上“*”号。我下面的程序怎么不行呀:
//: FindWord.java
import java.io.*;
public class FindWord {
public static void main(String[] args) throws java.io.IOException {
long pos = 0;
long len;
int i;
String s;
RandomAccessFile rafInput = new RandomAccessFile("in.txt","rw");
s = rafInput.readLine();
while(s != null) {
//System.out.println(s);
if (s.regionMatches(0,"see",0,3)) {
len = s.length();
pos = rafInput.getFilePointer();
//System.out.println(s+": "+len+",pos:"+pos);
rafInput.seek(pos - len);
rafInput.writeChar('*');
rafInput.seek(pos);
}
s = rafInput.readLine();
}
}
}///:~
--------------------------------------------------------------------------
运行程序前的in.txt 内容:

hello
happy new year
good luck
gtg
see u
take care
lol
--------------------------------------------------------------------------
运行程序后的 in.txt内容:

hello
happy new year
good luck
gtg
se *u
take care
lol
--------------------------------------------------------------------------
文件寻位不对呀;而且我是想插入一个符号,而不是覆盖呀
s.regionMatches(0,"see",0,3) 可以用吗?为什么我改了个词(new)就查找不到了呢?

谢谢!!!!!!!!
...全文
59 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
telenths 2003-02-21
  • 打赏
  • 举报
回复
没什么 大家在这里 互相学习 共同进步
没有你的问题 我也不会去想到计算一个 String 的最大长度啊 呵呵
每一个问题对 提问者 和 回答者 都是有帮助的
提问者 可以学到他原来不知道的
回答者 也可能是遇到了一个自己曾经没想到过的问题
这样大家都学到了东西 :)
qabp 2003-02-21
  • 打赏
  • 举报
回复
呵呵。你真的帮了我很多!
接分吧
qabp 2003-02-18
  • 打赏
  • 举报
回复
其实我还有问题,不过不好意思再在这里问了
我另外发贴
谢谢你啊 ,telenths(. 非法操作 .),你总是那么热情

准备结贴咯 :P
telenths 2003-02-14
  • 打赏
  • 举报
回复
你的问题还真不少啊 不过都挺经典的 :)
telenths 2003-02-14
  • 打赏
  • 举报
回复
regionMatches(boolean, int, String, int, int) 虽然有一个 boolean 参数可以设置 ignorecase ,但是它地限制也太多 比如要规定的起始位置,要规定查找长度 这样要用循环才能比较一个 String 很不方便
我想 这个函数应该是用在某些特殊的地方的

其实 ignorecase 实现起来并不困难 ,只要把两个 String 都先转换成同样的 case 就可以了
所以可以先用 toLowerCase() 把两个 String 都转为 LowerCase 在用 indexOf 来查找
qabp 2003-02-13
  • 打赏
  • 举报
回复
String.indexOf(String s) seems case-sensitive(not ignore case)...
if i wanna ignore case,what shall i do?
is the best solution String.regionMatches(boolean, int, String, int, int)? (the program will be longer...:( )

qabp 2003-02-13
  • 打赏
  • 举报
回复
teleths,thank u very much.
telenths 2003-02-10
  • 打赏
  • 举报
回复
This is because you are using Windows .
It may appear differently if you use some other Operation Systems .
qabp 2003-02-08
  • 打赏
  • 举报
回复
可是往屏幕输出又不需要 "\r" :
public class aa {
public static void main(String[] args) throws IOException{
String s;
DataInputStream dis = new DataInputStream(System.in);
s = dis.readLine();
s += "\n";
System.out.print(s);
System.out.println("*******************");
}
}
qabp 2003-02-08
  • 打赏
  • 举报
回复
谢谢各位!!!

发现如果把 Data += str+"\n"; 改成:Data += str+"\r\n";
重写出来的文件 就是一行行的啦
\r是回车 \n是换行

这和我的in.txt文件每行都回车了有关吗?
telenths 2003-02-07
  • 打赏
  • 举报
回复
是不是有很多的黑方块?
那些就是 "\n" 是 Unicode 控制符
看上去是连在一起的 不过你用 IE 打开就能看清楚了 其实他们就是换行符

还有一种写文件的方法
try{
PrintWriter printwriter = new PrintWriter(new BufferedWriter(new FileWriter(Path/file.txt)));
printwriter.println("String Data");

printwriter.flush();
printwriter.close();
}catch(Exception e){
System.out.println(e);
}

这样文件就是一行一行的了
但是这样你要一行一行的写,不能把文件一次性写入

但是你的问题中需要逐行读入再比较
所以如果要边读边写 可以先建一个临时文件 把结果写到临时文件里
在把原来的文件 Del 掉,再该文件名
总之 对一个文件同时读写会出现一些问题
最好把读写工作分开作
qabp 2003-02-06
  • 打赏
  • 举报
回复
FileWriter writer = new FileWriter("in.txt");
writer.write(Data + "\n");

这里是把整个文件(一个字符串)一次写入啊
Mai_520 2003-02-06
  • 打赏
  • 举报
回复
你用write写一行后,再用newLine就不会所有行连在一起了。
qabp 2003-02-06
  • 打赏
  • 举报
回复
我用write方法写文件后,打开文件 所有的行(原来的行)都连在一起(两行间只有一个空格)。 可是我用readLine再读这个文件,发现其实行之间是有换行符的。为什么会这样?
helpall 2003-02-06
  • 打赏
  • 举报
回复
对啊.是有影响. 但根据你的程序,对RandomAccessFile,在文件中的写都是覆盖的,只有在文件尾的是追加.
qabp 2003-02-05
  • 打赏
  • 举报
回复
helpall(): write是覆盖的,多了个'*'不会有影响吗?
我运行后 结果很奇怪 有时和下一行连起来 有时和前一行连起来 当然也有没问题的

再次谢谢 telenths(. 非法操作 .)!
telenths 2003-02-05
  • 打赏
  • 举报
回复
这我倒还没有考虑过 不过可以查一下 String 和 StringBuffer 获得长度的方法

public int length()
Returns the length of this string. The length is equal to the number of 16-bit Unicode characters in the string.

获得 String 和 StringBuffer 的长度的方法都是 int length()
下面就可以计算出他们的最大长度了
int 是一个 32 位变量类型 取正数部分来算的话 他们最长可以有 2^31-1 = 2147483647 个 16-bit Unicode character

共 2147483647 * 16 = 34359738352 位
34359738352 / 8 = 4294967294 (Byte)
4294967294 / 1024 = 4194303.998046875 (KB)
4194303.998046875 / 1024 = 4095.9999980926513671875 (MB)
4095.9999980926513671875 / 1024 = 3.99999999813735485076904296875 (GB)

有近 4G 的容量,够你用的了吧 ^_^
不过,如果实在太长的话 OutOfMemery 也说不定哦
helpall 2003-02-05
  • 打赏
  • 举报
回复
应该可以。运行试试啊。
qabp 2003-02-05
  • 打赏
  • 举报
回复
helpall() : rafInput.writeBytes("*"+line);这句是不是有点问题呢?

regionMatches的用法,看书时候没仔细,犯了这种错误,真是见笑了~

谢谢各位的帮助!正如simonjava所说,受益非浅啊,呵呵
qabp 2003-02-05
  • 打赏
  • 举报
回复
telenths(. 非法操作 .) : 不知String类和StringBuffer类可以存储多少字符?若文件较怎么办呢?谢谢啦!!!
加载更多回复(5)

62,614

社区成员

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

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