Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java如何格式化正在写入文本文件的输出_Java - Fatal编程技术网

Java如何格式化正在写入文本文件的输出

Java如何格式化正在写入文本文件的输出,java,Java,我试图通过java格式化我的sql输出,我以前从未用java格式化过。我查阅了一些教程,但似乎找不到任何能帮助我解决问题的东西。我打算删掉大部分代码,这样就不会太多了,但我得到的是 File file = new File("WO_SECURITY.doc"); FileWriter fw = new FileWriter(file, false); BufferedWriter bw = new BufferedWriter(fw); try { C

我试图通过java格式化我的sql输出,我以前从未用java格式化过。我查阅了一些教程,但似乎找不到任何能帮助我解决问题的东西。我打算删掉大部分代码,这样就不会太多了,但我得到的是

    File file = new File("WO_SECURITY.doc");
    FileWriter fw = new FileWriter(file, false);  
    BufferedWriter bw = new BufferedWriter(fw);
    try {
    Class.forName("com.ibm.as400.access.AS400JDBCDriver");
    con = DriverManager.getConnection(url,username1,password);

    stmt = con.createStatement();
    rs = stmt.executeQuery("select usname as Name,                                   \r\n" + 
            "ususer as Username,                                      \r\n" + 
            "uswosecl as WO_SecurityLevel,                            \r\n" + 
            " aoOpid as Operation_ID,aoseclevel as Operation_Security,\r\n" + 
            "aomenu as Menu, aomenuitem as Tab, aoText as Description \r\n" + 
            "from cudtatet.xxpuser                                    \r\n" + 
            "join fmsusrfua.xxpAuOps on uswosecl >= aoseclevel        \r\n" + 
            "and aoseclevel >=0                                       \r\n" + 
            "WHERE ususer NOT IN ('*ALL','daffron')                   \r\n" + 
            "and aoAuOpID>=70000 and aoAuOpID < 80000                 \r\n" + 
            "order by usname,ususer                                   ");
  while (rs.next()) {   

      String name = rs.getString(1);
      String username = rs.getString(2);
      String woSeclevel = rs.getString(3);
      String menu = rs.getString(6);
      String tab = rs.getString(7);
      String Desc = rs.getString(8);

            if(!file.exists()) {
                file.createNewFile();
            }


            bw.write("Employee Name: " + name);             
            bw.newLine();
            bw.write("Employee username: " + username);
            bw.newLine();
            bw.write("WO Security Level:  " + woSeclevel);
            bw.newLine();
            bw.write("Menu: " + menu + " > ");
            bw.write(tab + " > ");
            bw.write(Desc);
            bw.newLine();
            bw.newLine();
  }
我知道它是多余的,而不是我想要写在文本文件中的输出。 我在文本文件上收到的当前输出是。

如果可以的话,我希望格式化它,将员工姓名、用户名和安全级别作为列标题显示一次,并在下面显示菜单、菜单选项卡和菜单描述。 我的期望输出:


如果我能得到一些关于如何格式化输出以获得所需输出的指导,那就太好了

我认为解决方案的一部分是:

将输出移动到不同的方法,使读取更容易 跟踪正在使用的名称。 因此,对于输出,您可以考虑:

private void outputHeader(Writer out, String name, String username, String woSeclevel)
  throws IOException
{
    String hdr = String.format("Employee Name: %s  Username: %s  "
            + "WO Security Level %s%n",
            name, 
            username,
            woSeclevel);

    out.write(hdr);
}

private void ouputLine(Writer out, String menu, String tab, String desc)
    throws IOException
{
    String line = String.format("Menu: %s > %s > %s%n",
                                menu,
                                tab,
                                desc);
    out.write(line);
}
然后你可以这样称呼它:

String lastUsername = null;

while (rs.next) {
        String name = rs.getString(1);
        String username = rs.getString(2);
        String woSeclevel = rs.getString(3);
        String menu = rs.getString(6);
        String tab = rs.getString(7);
        String Desc = rs.getString(8);

        // when we change users (or if we haven't seen any user yet)
        // then output the header
        // if we have processed at least one user, then put space between
        // the last output and the new header
        if (lastUsername == null || ! lastUsername.equals(username)) {
            if (lastUsername != null) {
                bw.write("\n\n");
            }

            outputHeader(bw, name, username, woSeclevel);
        }
        outputLine(bw, menu, tab, Desc);

        // EDIT: this was wrong originally
        // we want to update the last seen username to be the username
        // of the current record; when the next record is retrieved, then
        // the comparison will output a new header if we have moved to
        // a different username. NOTE: assumes the records are properly
        // ordered
        lastUsername = username;
}
这样,每次更改用户名时都会发出用户的标题,我认为用户名本身更独特,用户的菜单信息将位于标题下方


请注意,您可能需要先按用户名下单。

谢谢。这对我帮助很大,看起来也干净多了。返回我想要的输出,因为它仍在重复员工姓名、用户名和WO安全级别。我会继续调整它,希望我能得到我想要的输出;应该是lastUsername=username。我已经做了编辑。我看到了打字错误,我想纠正它。当我改变!lastUsername.equalsusername到lastUsername.equalsusername将返回我想要的结果,但每次循环后都无法更改用户名。这意味着它只打印一次员工姓名、用户名、安全级别,然后打印所有菜单、选项卡和描述,而不打印下一个用户。我认为如果lastUsername==null | | |,应该是这样的!lastUsername.equalUserName{,因为我们想要的是在我们移动到一个新用户时输出标题,正如我想我注意到的,下一个用户是由一个新用户名定义的。输入错误是在循环结束时分配变量lastUsername-它应该设置为lastUsername=username,而不是lastUsername=name。你是对的Kevin。我的代码中有一个简单的输入错误它产生了我想要的结果。非常感谢!