因为工作需要经常要把记事本里这种格式的
13861322723 13861322733 13861322760 13861322782 13861322800 13861322840 13861322856 13861322857 13861322888 13861322926 13861322962 13861322982 13861322985 13861322986 
转换成如以下格式的
13861322723
13861322733
13861322760
13861322782
13861322800
13861322840
13861322856
13861322857
13861322888
由于数据量非常大,经常可能有几十万号码,.txt文件达到2,3M,小弟写的程序只能处理几千号码,上万就不行了,请问怎么修改一下package cmn.oms.region;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;public class Division
{
    protected static Division div;
    static String filevalue = "";
public static Division getInstance()
{
if (div != null)
return div;
div = new Division();
return div;
}
public Division()
{
String filename = "D:\\vip.txt";
File mobile_file = new File(filename);
System.out.println("Start....");
if (mobile_file.exists())
filevalue = readFile(mobile_file);
else
System.err.println("[Division] [file-missing] []");
}
public String readFile(File mobile_file)//把文件读出并按要求格式化文字
{
    int length_file = (int) mobile_file.length();
byte[] file_byte = new byte[length_file];
java.io.BufferedInputStream in_stream = null;
String value = "";
try
{
in_stream =
new java.io.BufferedInputStream(
new java.io.FileInputStream(mobile_file));
in_stream.read(file_byte);
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
try
{
in_stream.close();
}
catch (Exception e)
{
}
}
try
{
    String str_file = new String(file_byte);
String[] str_arr = str_file.split(" ");
for(int i = 0;i < str_arr.length;i++)
{
    if (str_arr[i].endsWith("\r"))
        str_arr[i] =
            str_arr[i].substring(0, str_arr[i].length() - 1);
    value += str_arr[i] + "\r\n";
}
return value;

}
catch(Exception e)
{
    e.printStackTrace();
    return "";
}
}
public void writefile()//写入的方法
{
    String filename2 = "D:\\vip2.txt";
    File mobile_file2 = new File(filename2);
    BufferedWriter bWriter;
    try
    {
        bWriter = new BufferedWriter(new FileWriter(mobile_file2);         bWriter.write(filevalue);
        bWriter.newLine();
        bWriter.flush();
    }
    catch (Exception ex)
    {
        ex.printStackTrace();
    }
    
}
public static void main(String args[]) throws Exception
{
    Division ds = new Division();
    ds.writefile();
    System.out.println("Done");

}
}

解决方案 »

  1.   

    你这种全部读出来, 全部转, 再写入的办法对大文件来讲有问题(内存方面)
    建议
    while(){
      读1行->转换->写入新文件
    }
      

  2.   

    用 java.util.StringTokenizer 来处理,百试百灵,如果你也是做sp的,或者别的短信业务的,可以互相探讨技术问题[email protected]
      

  3.   

    效率的问题比较容易解决,最简单的办法就是直接使用BufferedInputStream来装饰输入和输出流,这样就可以为输入和输出提供缓存来解决效率问题。对号码的分解可以使用StringTokenizer进行,不过由于数据量很大,使用不断StringTokenizer可能对内存产生很大压力,从而影响整个程序的效率,最好控制内存分配和新对象的产生,所有的数据操作都在同一个内存缓冲区中进行。
      

  4.   

    不用自己写工具这么麻烦吧, 调用一下系统命令用正则表达式不就OK了
    http://matrix.foresee.cn/blogs/neo/books/tao_regexps_zh.html#Regular_Expressions_In_Various_Tools
      

  5.   

    如果只是做这么个事,不如用EDITPLUS :P
      

  6.   

    楼上的,几十万个号,用Editplus手动修改?
      

  7.   

    java.util.StringTokenizer做效果会比较好
      

  8.   

    是用StringTokenizer会造成大量的临时对象(StringTokenizer和String),加重垃圾收集器的负担。几十万已经不算少了。不过如果到上百上千万恐怕会更严重
      

  9.   

    import java.io.*;public class Division {
        public Division() throws IOException {
            BufferedReader r = new BufferedReader(new FileReader("D:\\vip.txt"));
            BufferedWriter w = new BufferedWriter(new FileWriter("D:\\vip2.txt"));
            for (int a = r.read(); a != -1; a = r.read()) {
                if (a == ' ') {
                    w.write("\r\n");
                } else {
                    w.write(a);
                }
            }
        }
    }
      

  10.   

    for (int a = r.read(); a != -1; a = r.read()) {
                if (a == ' ') {
                    w.write("\r\n");
                } else {
                    w.write(a);
                }使用BufferedReader和BufferedWriter 关键是那个FOR子句当然如果是有规律的话,也可以改改步长,比如11位的号码,那用12位步长,每次写完加个换行
      

  11.   

    soft_2008(冬天到了,春天还远吗?)修正一点,这个文档应该是ASCII码格式的,所以应该用InputStream/OutputStream而不是Reader/Writer
      

  12.   

    回复人: Polarislee(北极星)(北京那么大,何处是我家) ( ) 信誉:110  2005-08-23 17:04:00  得分: 0  
     
     
       楼上的,几十万个号,用Editplus手动修改?
      
     EDITPLUS如此强大的替换功能,竟然要手动? 呵
      

  13.   

    Polarislee(北极星)(北京那么大,何处是我家)哦,谢谢指正。使用字符提取转换是不是能比得上文件改写来的快?!而且觉得,这样的转换没意思 -_-#
      

  14.   

    zjq1980(阿易)你打开EDITPLUS的替换功能不是手动吗?难道是写代码批量转换?顺带说些新想法:
    文件的总位数一定能被12整除,那么引入多线程进行切割并行转换,再进行合并,不就解决了楼主的问题了吗?其实写成CMD会更实用点。
      

  15.   

    呵呵,也是做SP的,我们通常都用Editplus解决,空格替换成换行