Java如何格式化正在写入文本文件的输出
我试图通过java格式化我的sql输出,我以前从未用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
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。我的代码中有一个简单的输入错误它产生了我想要的结果。非常感谢!