黑马程序员技术交流社区

标题: 如果文本中的数据没有换行,如何在整合中的文件中自动... [打印本页]

作者: 张立江    时间: 2012-6-26 08:38
标题: 如果文本中的数据没有换行,如何在整合中的文件中自动...
本帖最后由 小张童鞋 于 2012-6-26 20:18 编辑

/*
合并流
SequenceInputStream

视频在day20-16合并流
*/
import java.io.*;
import java.util.*;
class SequenceStreamDemo
{
        public static void main(String[] args) throws IOException
        {
                method_2();
        }

        public static void method_2()throws IOException
        {
                Vector<FileInputStream> v = new Vector<FileInputStream>();
               
                /*这里我的3个文件,写到最后一行比如"111"的时候,
                光标停留在1后面,而没有停留在111的下面,也就是说在文本中没有将光标换行
                结果输出的时候,请看结果1
                而将光标换行的话,请看结果2,这个和毕老师的视频中是一样的
                我的问题就是,如何让每个文本"1.txt","2.txt","3.txt"在读完最后一行时进行判断,
                如果换行了就不操作,没有换行,就给他换行
                */

                v.add(new FileInputStream("E:\\Edit\\day20\\1.txt"));
                v.add(new FileInputStream("E:\\Edit\\day20\\2.txt"));
                v.add(new FileInputStream("E:\\Edit\\day20\\3.txt"));

                Enumeration<FileInputStream> en = v.elements();

                SequenceInputStream sis = new SequenceInputStream(en);
                FileOutputStream fos = new FileOutputStream("E:\\Edit\\day20\\4.txt");
               
                byte[] b = new byte[1024];
                int len = 0;
                while ((len=sis.read(b))!=-1)
                {
                        fos.write(b,0,len);
                }
                sis.close();
                fos.close();

               
        }
}

1.png (3.73 KB, 下载次数: 33)

结果1

结果1

2.png (3.97 KB, 下载次数: 30)

2.png

作者: 薄炳鑫    时间: 2012-6-26 09:08
你可以建一个5.txt的文本文件,然后里面放的回车符。添加这个文件,如下面的代码。
  1. /*
  2. 合并流
  3. SequenceInputStream

  4. 视频在day20-16合并流
  5. */
  6. import java.io.*;
  7. import java.util.*;
  8. class SequenceStreamDemo
  9. {
  10.         public static void main(String[] args) throws IOException
  11.         {
  12.                 method_2();
  13.         }

  14.         public static void method_2()throws IOException
  15.         {
  16.                 Vector<FileInputStream> v = new Vector<FileInputStream>();
  17.                
  18.                 /*这里我的3个文件,写到最后一行比如"111"的时候,
  19.                 光标停留在1后面,而没有停留在111的下面,也就是说在文本中没有将光标换行
  20.                 结果输出的时候,请看结果1
  21.                 而将光标换行的话,请看结果2,这个和毕老师的视频中是一样的
  22.                 我的问题就是,如何让每个文本"1.txt","2.txt","3.txt"在读完最后一行时进行判断,
  23.                 如果换行了就不操作,没有换行,就给他换行
  24.                 */
  25.                 v.add(new FileInputStream("E:\\Edit\\day20\\1.txt"));
  26.                 v.add(new FileInputStream("E:\\Edit\\day20\\5.txt"));
  27.                 v.add(new FileInputStream("E:\\Edit\\day20\\2.txt"));
  28.                 v.add(new FileInputStream("E:\\Edit\\day20\\5.txt"));
  29.                 v.add(new FileInputStream("E:\\Edit\\day20\\3.txt"));

  30.                 Enumeration<FileInputStream> en = v.elements();

  31.                 SequenceInputStream sis = new SequenceInputStream(en);
  32.                 FileOutputStream fos = new FileOutputStream("E:\\Edit\\day20\\4.txt");
  33.                
  34.                 byte[] b = new byte[1024];
  35.                 int len = 0;
  36.                 while ((len=sis.read(b))!=-1)
  37.                 {
  38.                         fos.write(b,0,len);
  39.                 }
  40.                 sis.close();
  41.                 fos.close();

  42.                
  43.         }
  44. }
复制代码

作者: 张立江    时间: 2012-6-26 09:27
薄炳鑫 发表于 2012-6-26 09:08
你可以建一个5.txt的文本文件,然后里面放的回车符。添加这个文件,如下面的代码。 ...

你的回答不是很符合我提出的问题,如果3个文件中换行的和没有换行的都有(比如1.txt和3.txt没换行,2.txt换行了),我们又不知道具体哪个有换行,哪个没换行,依照你的方法那打印出的结果就是2.txt和3.txt之间有一个空行了.所以最好是有一个判断语句,能够比较智能的帮我们做这些事
作者: 陆强强    时间: 2012-6-26 10:05
也许毕老师在文本文件的最后一行末尾按了回车{:soso_e120:}
作者: 周兴中    时间: 2012-6-26 12:13
本帖最后由 周兴中 于 2012-6-26 12:14 编辑

研究了下,貌似只能在合并之前,对每个文件进行检查,如果文件尾没有回车符,自己添加,再写回文件.之后再进行合并.
用的是字符缓冲流.
char[] b = new char[1024];
                        int len = 0;
while ((len=bufr.read(b))!=-1)
                        {
                                bufw.write(b,0,len);
                                if(len!=1024&&b[len-1]!='\n') //是否为文件尾,并且最后一个字符是否为换行符. 不过这个判断不是特别准,当出现刚好1024字符是文件结尾处时就错了,暂时没找到什么好的判断方法,请大神指点.
                                {
                                       
                                        bufw.newLine();
                                }
                        }
作者: 一生一世    时间: 2012-6-26 12:35
我也正在考虑这个问题,怎么样在文件的指定文字写入特定的内容
作者: 一生一世    时间: 2012-6-26 12:35
本帖最后由 一生一世 于 2012-6-26 12:37 编辑

/*
合并流
SequenceInputStream

视频在day20-16合并流
*/
import java.io.*;
import java.util.*;
class SequenceStreamDemo1
{
    public static void main(String[] args) throws Exception
    {
            SequenceStreamDemo1 ss = new SequenceStreamDemo1();
            ss.mergeFile();
    }

        public void mergeFile() throws Exception{
                Vector<FileInputStream> v = new Vector<FileInputStream>();
        
        /*这里我的3个文件,写到最后一行比如"111"的时候,
        光标停留在1后面,而没有停留在111的下面,也就是说在文本中没有将光标换行
        结果输出的时候,请看结果1
        而将光标换行的话,请看结果2,这个和毕老师的视频中是一样的
        我的问题就是,如何让每个文本"1.txt","2.txt","3.txt"在读完最后一行时进行判断,
        如果换行了就不操作,没有换行,就给他换行
        */
       /* v.add(new FileInputStream("E:\\1.txt"));
        v.add(new FileInputStream("E:\\2.txt"));
        v.add(new FileInputStream("E:\\3.txt"));*/
//                FileInputStream read1 = new FileInputStream("E:\\1.txt");
//                FileOutputStream fos1 = new FileOutputStream("E:\\1.txt");
                String[] path = {"E:\\1.txt","E:\\2.txt","E:\\3.txt"};
               
                write(v,path);

        Enumeration<FileInputStream> en = v.elements();

        SequenceInputStream sis = new SequenceInputStream(en);
        FileOutputStream fos = new FileOutputStream("E:\\4.txt");
        
        byte[] b = new byte[1024];
        int len = 0;
        while ((len=sis.read(b))!=-1)
        {
                fos.write(b,0,len);
        }
       // fos.write(13);
        //fos.write(10);
        sis.close();
        fos.close();

        
        }

        private void write(Vector<FileInputStream> v, String[] path) throws Exception{
                FileInputStream fis = null;
                FileOutputStream fos = null;
               
                for(int i=0; i<v.size() ;i++){
                        fis = new FileInputStream(path);
                        fos = new FileOutputStream(path);
                        
                        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=13;//这是在添加换行符/r/n
                                        buf[b+1]=10;
                                }
                                fos.write(buf, 0, len);
                        }
                }
        }
}





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2