黑马程序员技术交流社区
标题:
在文件的结尾添加回车换行符
[打印本页]
作者:
一生一世
时间:
2012-6-26 14:00
标题:
在文件的结尾添加回车换行符
/**
* 这个方法实现的功能是在文件的末尾添加回车换行符
*/
private void write(Vector<FileInputStream> v, String[] path) throws Exception{
FileInputStream fis = null;
FileOutputStream fos = null;
for(int i=0; i<path.length ;i++){
fis = new FileInputStream(path[i]);//path是一个存储路径的数组
fos = new FileOutputStream(path[i]);
int b;//记录最后一个字节的位置
while(true){
b = fis.read();
if(b==-1)
break;
}
byte[] buf = new byte[1024];
int len;
while((len=fis.read(buf))!=-1){//将换行符写入到指定的位置
if(!(buf[b-2]==13 && buf[b-1]==10)){
buf[b] = 13;
buf[b+1] = 10;
len += 2;
}
fos.write(buf, 0, len);
}
v.add(fis);
}
}
我的问题是这个方法执行以后为什么path数组中指定路径的文件为什么都大小都变为0kb了为什么没有完成指定的功能,到底哪出错了?该怎么修改呢??
作者:
李天甲
时间:
2012-6-26 14:27
本帖最后由 李天甲 于 2012-6-26 14:34 编辑
import java.io.FileInputStream;
import java.io.FileOutputStream;
/*
* 我的问题是这个方法执行以后为什么path数组中指定路径的文件为什么都大小都变为0kb了
* 为什么没有完成指定的功能,到底哪出错了?该怎么修改呢??
*/
public class test1 {
private void write(String[] path) throws Exception {
FileInputStream fis = null;
FileOutputStream fos = null;
for (int i = 0; i < path.length; i++) {
fis = new FileInputStream(path[i]);// path是一个存储路径的数组
fos = new FileOutputStream(path[i]);
int b;// 记录最后一个字节的位置
while (true) {
b = fis.read(); // 每一次read之后都往下一个方走了,你这里b已经是等于读到最后一个的位置了
if (b == -1)
break;
}
byte[] buf = new byte[1024]; // 呵呵,虽然这里用不着,但您想过1024个装的开不?
int len;// 默认是0呵呵,
while ((len = fis.read(buf)) != -1) {// 将换行符写入到指定的位置 但是这里面read恒等于-1了
// 一次读取1024个字节进去
if (!(buf[b - 2] == 13 && buf[b - 1] == 10)) { // 这块压根不会执行的
buf[b] = 13;
buf[b + 1] = 10;
len += 2;
}
fos.write(buf, 0, len); // 写的什么,您看读buf的时候已经到末尾了呵呵,然后len=-1.....
}
}
}
}
复制代码
b = fis.read(); // 每一次read之后都往下一个方走了,你这里b已经是等于读到最后一个的位置了
while ((len = fis.read(buf)) != -1) {// 将换行符写入到指定的位置 但是这里面read恒等于-1了因为已经read到了最后一个位置,读不到东西啊,
修改方法
你这样获取文件长度不是很理想,我一般通过file.length(),直接获取到文件的长度,然后直接生成一个file.length()+1的数组,先读取,再写入,当然也有问题,就是文件不能太大呵呵....
作者:
贾飞雨
时间:
2012-6-26 14:44
少了fos.flush()把数据刷新 还有功能一般不要私有化
或者或者fos.close();fis.close()
作者:
贾飞雨
时间:
2012-6-26 14:46
功能怎么能私有化,功能是给别人用,第一句话错了,下次问的时候把你调用的都打出来,这样看的费劲
作者:
周兴中
时间:
2012-6-26 16:27
本帖最后由 周兴中 于 2012-6-26 16:46 编辑
<P>import java.io.FileInputStream;
import java.io.FileOutputStream;</P>
<P>/*
* 我的问题是这个方法执行以后为什么path数组中指定路径的文件为什么都大小都变为0kb了
* 为什么没有完成指定的功能,到底哪出错了?该怎么修改呢??
*/</P>
<P>public class test1 {</P>
<P> private void write(String[] path) throws Exception {
FileInputStream fis = null;
FileOutputStream fos = null;</P>
<P> for (int i = 0; i < path.length; i++) {
fis = new FileInputStream(path);
fos = new FileOutputStream(path);</P>
<P> int b;
while (true) {
b = fis.read(); //fis.read()返回的是下一个数据字节,不是返回位置.你用这个方法无法记录最后一个字符出现的位置,仅仅得到一个-1;
if (b == -1)
break;
}</P>
<P> byte[] buf = new byte[1024];
int len;
while ((len = fis.read(buf)) != -1) {
if (!(buf[b - 2] == 13 && buf[b - 1] == 10)) {
buf [b]= 13; //此处应该会有角标越界异常,你上面b最后得的值得是-1
buf[b + 1] = 10;
len += 2;
}
fos.write(buf, 0, len); // 就算你前面方法对,你还缺少了flush()方法,刷新缓冲区,这样才能把内存中的读到的数据写如文件.在程序的最后要关闭资
//源.fos.close(),fis.close();
}
}
}
}</P>
<P>可以这么改:
byte[] buf = new byte[1024];
int len = 0;
while ((len=fis.read(buf))!=-1)
{
if(len!=1024&&b[len-2]!=13&&b[len-1]!=10)//是否为文件尾,并且最后一个字符是否为换行符. {
buf[len] = 13;
buf[len+1] = 10;
len += 2;
}
fos.write(buf,0,len);
fos.flush();//刷新缓冲区
}
fos.close();//关闭资源
fis.close();</P>
复制代码
作者:
一生一世
时间:
2012-6-26 16:44
yufeiant 发表于 2012-6-26 14:46
功能怎么能私有化,功能是给别人用,第一句话错了,下次问的时候把你调用的都打出来,这样看的费劲 ...
功能怎么不可以私有化呢?有些功能不方便
直接
对外部提供访问,就可以私有化呀,
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2