2013-04-24 102 views
0

Output Looks LikeBuffered Reader只读取文本文件中的第一行?

这里我想使用缓冲读取器来读取文本文件并在数据库中创建表,但缓冲读取器只读取我的文本文件中的名字。我可以知道我的代码有什么问题吗?它工作正常在MySQL中,但在SQL Server中它只读取名字。

文本文件:http://textuploader.com/?p=6&id=vrQs9

整个代码:

import com.mysql.jdbc.Connection; 
import com.mysql.jdbc.DatabaseMetaData; 
import com.mysql.jdbc.Statement; 
import java.io.*; 
import java.awt.*; 
import java.util.*; 
import javax.swing.*; 
import java.awt.event.*; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.swing.table.*; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 

public class Stackq extends AbstractTableModel { 

Vector<String> data; 
Vector columns; 

public Stackq() { 






    String line; 
    data = new Vector<String>(); 
    columns = new Vector(); 
    int count = 0; 


    try { 
     FileInputStream fis = new FileInputStream("D:/joy/text/registration.txt"); 
     BufferedReader br = new BufferedReader(new InputStreamReader(fis)); 
     StringTokenizer st1 = new StringTokenizer(br.readLine(), "\t"); 
     while (st1.hasMoreTokens()) { 
      columns.addElement(st1.nextToken()); 
      count++; 
     } 
     while ((line = br.readLine()) != null) { 
      StringTokenizer st2 = new StringTokenizer(line, "\t"); 
      for (int i = 0; i < count; i++) { 
       if (st2.hasMoreTokens()) { 
        data.addElement(st2.nextToken()); 
       } else { 
        data.addElement(""); 
       } 
      } 
     } 
     br.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

public void setValueAt(Object value, int row, int col) { 
    data.setElementAt((String) value, col); 
    fireTableCellUpdated(row, col); 
} 

public boolean isCellEditable(int row, int col) { 
    //if (4 == col){ 

    return true; 
} 
//else { 
// return false; 
// } 
//} 

//public void insertData(Object[] values){ 
// data.add(new Vector()); 
//for(int i =0; i<values.length; i++){ 
//((Vector) data.get(data.size()-1)).add(values[i]); 
//} 
//fireTableDataChanged(); 
// } 
public void removeRow(int row) { 
    data.removeElementAt(row); 
    fireTableDataChanged(); 
} 

public int getRowCount() { 
    return data.size()/getColumnCount(); 
} 

public int getColumnCount() { 
    return columns.size(); 
} 

public Object getValueAt(int rowIndex, int columnIndex) { 
    return (String) data.elementAt((rowIndex * getColumnCount()) 
      + columnIndex); 
} 

public String getColumnName(int i) { 
    return (String) columns.get(i); 
} 

public static void main(String args[]) { 


    Stackq model = new Stackq(); 

    JTable table = new JTable(); 

    table.setModel(model); 
    JScrollPane scrollpane = new JScrollPane(table); 
    JPanel panel = new JPanel(); 
    panel.add(scrollpane); 
    JFrame frame = new JFrame(); 
    frame.add(panel, "Center"); 
    frame.pack(); 
    frame.setVisible(true); 

    StringBuffer sbTableData = new StringBuffer(); 
    for (int row = 0; row < table.getRowCount(); row++) { 
     for (int column = 0; column < table.getColumnCount(); column++) { 
      sbTableData.append(table.getValueAt(row, column)).append("\t"); 
     } 
     sbTableData.append("\n"); 

    } 
    System.out.println(sbTableData); 

    try { 

    PrintWriter f = new PrintWriter(new BufferedWriter(new FileWriter("D:/joy/text/registration6.txt", true))); 

     //f.println(sbTableData+"\t"+"n"); 

     f.close(); 


    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    String readstr1 = null; 

    int row = table.getRowCount(); 

    int column = table.getColumnCount(); 

    for (int j = 0; j < row; j++) { 

     for (int i = 0; i < column; i++) { 

    //System.out.println(table.getValueAt(j, i)); 
      readstr1 = (String) table.getValueAt(j, i); 
//System.out.println(readstr); 

     } 

    } 

    try { 
     // FILE READ AND TABLE CREATE 
     String tname = "example11199"; 
     String dbname = "DB"; 
     Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 
     java.sql.Connection conn = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;user=SOFTWARE\joy;databaseName=DB;integratedSecurity=true;"); 
     java.sql.Statement stmt = conn.createStatement(); 
     // stmt=conn.createStatement(); 
    //System.out.println("connect"); 
    //System.out.println(readstr1); 
     FileInputStream fstr = new FileInputStream("D:/joy/text/registration6.txt"); 
     // Get the object of DataInputStream 
     DataInputStream inn = new DataInputStream(fstr); 
     BufferedReader brr = new BufferedReader(new InputStreamReader(inn)); 

     String readstr; 
     java.sql.DatabaseMetaData dmd = conn.getMetaData(); 
     while ((readstr = brr.readLine()) != null) //DatabaseMetaData dmd = (DatabaseMetaData) conn.getMetaData(); 
     //while(readstr!=null) 
     { 
      ResultSet rs = dmd.getTables(null, "DB", "example11199", null); 
      //set not null column 
      if (String.valueOf(readstr).contains("NO")) { 
       readstr = readstr.replaceAll("NO", "not null"); 
      } else if (String.valueOf(readstr).contains("YES")) { 
       readstr = readstr.replaceAll("YES", ""); 
      } 
      if (String.valueOf(readstr).contains("PRIMARY")) { 
       readstr = readstr.replaceFirst("PRIMARY", "primary key"); 
      } 
      System.out.println("replace string " + readstr); 

      int k = 1; 
      if (!rs.next()) { 
       stmt.executeUpdate("CREATE TABLE " + tname + "(" + readstr + ")"); 

      } else { 
       //System.out.println(readstr); 
       stmt.executeUpdate("ALTER TABLE " + tname + " ADD(" + readstr + ")"); 
       System.out.println("altered"); 

      } 

     } 
     brr.close(); 
     inn.close(); 
    } catch (Exception e) { 
    } 

    } 
    } 

编辑,现在文本文件的全部内容被打印,但在这里给空终于内容:System.out.println(“替换字符串” + readstr);所以我不能用空值创建表。 谢谢。

+4

停止阅读后,我看到了可怕的代码格式...修复它,我会试着去了解这是怎么回事... – jlordo 2013-04-24 06:46:08

+0

看起来你是在记事本写! – 2013-04-24 06:53:56

+0

@tim你在用什么IDE? – jlordo 2013-04-24 06:58:03

回答

1

您正在重新创建您读取一行的表格。我认为这只能工作一次,所以它只是读第一行。

你似乎有文字传递的混乱和改变,让你尝试创建表之前只有文件行被读取的表。我怀疑你想在你尝试修改/创建表之前阅读整个文件。

顺便说一句,格式化所有的地方很可能使检查你的代码更困难。我建议你在你的IDE中使用格式化程序,你应该能够看到你的代码将如何循环。

+0

嗨,正如你所说我已经在NetBeans中使用ALT + SHIFT + F格式代码格式化了代码,并在后期提供了整个代码,请问我现在知道什么是错误 – stom 2013-04-24 07:23:35

+1

再次阅读前两段。如果你不明白,你总是可以问我一个关于我的答案的问题。 – 2013-04-24 07:25:32

+0

其实我是新来的Java和我不明白你说什么,你能给我一个例子改变 – stom 2013-04-24 07:29:22

0
while ((readstr = brr.readLine()) != null) //DatabaseMetaData dmd = (DatabaseMetaData) conn.getMetaData(); 
    //while(readstr!=null) 
    { 
     ResultSet rs = dmd.getTables(null, "DB", "example11199", null); 
     //set not null column 
     if (String.valueOf(readstr).contains("NO")) { 
      readstr = readstr.replaceAll("NO", "not null"); 
     } else if (String.valueOf(readstr).contains("YES")) { 
      readstr = readstr.replaceAll("YES", ""); 
     }else if (String.valueOf(readstr).contains("PRIMARY")) { 
      readstr = readstr.replaceFirst("PRIMARY", "primary key"); 
     } 
     System.out.println("replace string " + readstr); 

试着修复最后一条if语句再次检查它,它会工作。