适合java初学者的项目求解,关于java程序输出语句的疑惑

博客分类:
最近在重构自己的小Demo 想把自己的下Demo 变成可以配置的程序。但是遇到了一些困难,走了不少的弯路,最终还是解决了。 如果你是个牛人,你不用看了,写这些东西是给和我一样的菜鸟看的。先说说我的Demo吧,我写的是一个简单新闻管理系统,很简陋的那种,不过麻雀虽小,但是五脏俱全。基本的增、删、查、改,都有,用到了FCKeditor。一开始我连接数据库用的是最原始的方法,把数据库的连接信息全写在代码里,写完以后就没去管他了,十一放假这几天,看了看自己的代码,觉得代码结果不好,于是就开始重构自己的代码,首先就是重写数据库的连接管理我把连接数据库的一些基本信息写到了database.properties 文件里,然后从程序中读取连接数据库所需要的信息。但是看似简单的东西,比且很容易的完成的工作,我却遇到了不少麻烦。首先就是路径的问题,其次是该以何种方式读取;就这两个问题困扰了两天。(呵呵,见笑了)java读取propterties文件有三种方法:
&!--&br /&
Code highlighting produced by Actipro CodeHighlighter (freeware)&br /&
http://www.CodeHighlighter.com/&br /&
ClassLoader.getResourceAsStream ("some/pkg/resource.properties");
Class.getResourceAsStream ("/some/pkg/resource.properties");
ResourceBundle.getBundle ("some.pkg.resource");
注意括号中代码的不同。
先让大家看一段代码吧:DataSource.java 文件:
&!--&br /&
Code highlighting produced by Actipro CodeHighlighter (freeware)&br /&
http://www.CodeHighlighter.com/&br /&
--&import java.io.IOEimport java.io.InputSimport java.sql.Cimport java.sql.DriverMimport java.sql.SQLEimport java.util.Pimport java.util.logging.Limport java.util.logging.L/** *一个单子设计模式数据库连接 * @author guanminglin */public class DataSource {
public static C
public DataSource() throws IOException {
Properties props = new Properties();
//一定要用DataSource
InputStream in = DataSource.class.getResourceAsStream("/org/news/comm/database.properties");
//原先试过这下面两种方法,但是都不行
//FileInputStream in = new FileInputStream("database.properties");
//InputStream in = Object.class.getResourceAsStream("/org/news/comm/database.properties")
//下面两行是用来测试的
String s = in.toString();
System.out.println("s=="+s);
props.load(in);
in.close();
String drivers = props.getProperty("jdbc.drivers");
String url = props.getProperty("jdbc.url");
String username = props.getProperty("jdbc.username");
String password = props.getProperty("jdbc.password");
Class.forName(drivers);
conn = DriverManager.getConnection(url, username, password);
in.close();
} catch (SQLException ex) {
Logger.getLogger(DataSource.class.getName()).log(Level.SEVERE, null, ex);
} catch (ClassNotFoundException ex) {
Logger.getLogger(DataSource.class.getName()).log(Level.SEVERE, null, ex);
*如果连接为空则建立一个新连接
public static Connection getConnection() throws IOException {
if (conn == null) {
new DataSource();
public void test(){
String str = new String();
public static void main(String[] args) throws IOException {
// TODO code application logic here
//用于测试
new DataSource();
System.out.print(conn);
我的文件包结构:第一个要说的是:FileInputStream in = new FileInputStream("database.properties");网上有很多人说这条语句是从当前目录中加载database.properties文件的,但是我得出的结果是:它是从classpath 中加载database.properties文件的。因为我用的是IDE 是NetBeans 我以为直接放在当前包内就可以了,但是我发现这样不行。具体放哪里我也不知道,后来用了另一种方法:InputStream in = Object.class.getResourceAsStream("/org/news/comm/database.properties")基本上是可以用了,一开始测试的时候还挺开心的。很顺利的就通过了,但是当我真正运行项目的时候问题又来了,程序报了 空指针引用 错误。我就很纳闷了为什么在单个文件里测试可以很容易的通过,一运行项目就会报错呢?于是开始Debug,不Debug 不知道,一用吓一跳:InputStream in = Object.class.getResourceAsStream("/org/news/comm/database.properties")in的值竟然是空的,难怪会报空指针错误了。单独测试DataSource.java文件的时候运行正常啊,没有报错,in 也有值,但是为什么运行项目的时候又没有值了呢?很是不解。于是我google 了一把,最后看现了几篇好文章 说的是如何读取 propterties 文件。最终我发现用第二种方法是有弊端的,关键就在Object 上,它所有类的父类,在单个文件中用他来读取propterties文件还可以但是一运行项目,他就不起作用了,也不知道为什么。难道是java 的bug??或者说是NetBeans的bug??我同样的Eclipse 下测试过,结果是一样的。最后我将输入流语句稍微改了一下,变成下面的样子:InputStream in = DataSource.class.getResourceAsStream("/org/news/comm/database.properties")其实就是改个类名而已,让他自身去定位propterties文件,就解决问题了。(注意括号中红色的部分,org前面的 "/" 绝对不能少,要不然会报错的。)无论是测试单文件还是,测试整个项目都没问题了。(那个高兴啊)database.propterties 文件很简单:
&!--&br /&
Code highlighting produced by Actipro CodeHighlighter (freeware)&br /&
http://www.CodeHighlighter.com/&br /&
--&jdbc.drivers = com.mysql.jdbc.Driverjdbc.url = jdbc:mysql://localhost:3306/newsjdbc.username = rootjdbc.password = root
总结一下读取propterties文件方法的不同:(JavaWorld里的内容,呵呵拿来用一下)
Behavioral differences
Parameter format
Lookup failure behavior
Usage example
ClassLoader.getResourceAsStream()
"/"- no leading "/" (all names are absolute)
Silent (returns null)
this.getClass().getClassLoader().getResourceAsStream("some/pkg/resource.properties")
Class.getResourceAsStream()
"/"- leading "/" indi all other names are relative to the class's package
Silent (returns null)
this.getClass().getResourceAsStream("resource.properties")
ResourceBundle.getBundle()
"."- al .properties suffix is implied
Throws uncheckedjava.util.MissingResourceException
ResourceBundle.getBundle("some.pkg.resource")
推荐给大家一篇JavaWorld里面好的文章,里面讲述使用不同方式读出propterties文件的方式,以及他们之间的不同:
helloworlda
浏览: 394795 次
来自: 北京
校验特殊字符中的&再校验到 含有字符mda ...
谢谢分享 学习ing
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'求教java代码,为什么这个程序的输出结果都是no呢?使用java Test this 输出的不该是yes吗?很疑惑。_百度知道
求教java代码,为什么这个程序的输出结果都是no呢?使用java Test this 输出的不该是yes吗?很疑惑。
public class Test
public static void main(String[] args)
String[] str={&this&,&is&,&absolutely&,&impossible&,
&maybe&,&you&,&are&,&a&,&good&,&man&};
for(int i=0;i&10;i++)
if(args[0]==str[i])
System.out....
我有更好的答案
if(args[0]==str[i])改成if(args[0].equals(str[i]))==和 equals 的区别
好好看一下基础的东西吧。
采纳率:4%
一个是最好用equals()比较值,在一个就是args参数你传对了吗,这个参数我记得是运行时用命令行敲进去的。
if(args[0]==str[i]),==是比较两者的内存地址,应该改为equals();
System.out.println(&yes&);
else if(i==9)
System.out.println(&no&);
args 不是 str集合中的任意一个字符串地址。字符串比较用String.equal()方法。args可以自己传递,但是直接调用main方法是不可知的。
字符串比较用equals()
其他3条回答
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
本人第一次设计供给移动端的API,中间遇到些困惑,想咨询下各位有经验的前辈,目前服务端使用的是Java:
1.返回的参数对所有接口都统一化还是各个接口区分对待?我理解的统一化:{message:"XXX", code:"XXX", data:"不同接口的数据集"}我理解的区分化:{message:"XXX", code:"XXX", users:"用户结果数据集"}、{message:"XXX", code:"XXX", reposities:"资源库数据集"}
2.看了github的API接口,较长的参数一般使用下划线拼接,如:following_url,html_url字段。现在服务端是Java语言,Java语言对参数的命名都是驼峰风格,那么我返回的参数是按照驼峰设计呢还是类似于github的方式?
3.以前是做Java支付交易系统的,时间都是YYYYMMDD、HHMMSS格式的,现在在做社交类型的系统,朋友推荐说使用时间戳或者格式化好的YYYYMMDD类型,所以请教下大家对返回的时间戳一般是怎么设计的?
4.Token一般是放在后台在Head里面返回客户端,客户端在请求时也是在放在Head里面吧?对于Token的设计,我想的是保存在数据库里面,每次请求时通过查询数据库校验是否正常,但这样每次都查询数据库是很慢的,有没有把token放在缓存里面(memcached或者redis)的做法?
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
首先回答一下第一个第二个,如果你参照的风格是restful的话,那么你这套接口应该是通用的,json只是一个字符串,因此,采用什么风格就看你们约定好的,通常我们都是用下划线,另外你说的统一化这个也是根据需求设定的,根据需要设置字段,但是通常code msg status这种在每一个api都应该要有,data字段应该是一个json对象,里边的对象属性就要根据你的接口作用设置了,这就是区别化(个人风格,仅代表个人观点),第三个问题为了通用化,你可以把时间戳弄成long类型的,根据客户端的语言再转化成yyyyMMdd这种,建议不要先转再发。第四个问题,token是为了安全而设定的,那么你可以采用客户端先请求token,每一次都不一样,然后在后端弄成一个映射,当客户端请求api的时候携带token,根据token直接映射到对应的用户。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
我觉得区分开来比较好。前端都用js解析json字符串,解析完之后,不存在的属性就是undefined,前端用户可以判断是否为undefined进行区分处理。我见过的一些接口就是成功的时候没有error属性,只在失败的时候才有。这样可以节省一些字节传输。
命名我觉得比较随便了,你跟前端同学沟通一下就行。只要保证统一即可,不要一会儿是下划线一会又是驼峰
同意楼上意见,返回一个long类型的即可。这样你获取方便,下游的同学也方便转换。要不然还得一直记着你的字符串格式。一旦出现其他同学接手就可能出现混乱。
token可以放到内存里,这种用法比较多。定一个过期时间,一旦过期从内存消除即可。当请求较多,实时性要求较高而内存也充裕的时候建议这样。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
1、统一,减少与前端的沟通成本,也方便前端统一处理;2、可以驼峰,也可以下划线,只要内部统一一种风格就好了,记忆中Jackson序列化时有个设置可以让驼峰格式转换成下划线格式的(反序列化时同理);3、用时间戳,由前端格式化时间显示,方便同一接口在不同地方调用时可以显示不同的时间格式;4、Token一般有时效性,没有必要放到数据库里,一般用Memcached或Redis存储并设置过期时间。
更新:Jackson的驼峰转下划线配置:
objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
1.必须统一,要是每个接口都不一样,客户端写代码要疯了,到时候调试你们都要疯了大部分通用的规则是{code:'',msg:'',data:{}}code:当前状态码,这个后台配置不同响应不同状态码msg:正常返回或者发生异常返回的提示信息data:data可以是对象或者数组,返回数据2.java的话一般驼峰3.时间这个要看每个界面不同,你不可能所有界面返回的时间都一种格式吧,这个没必要弄的那么一样吧我觉得4.token放head body都行,业务够大了可以放内存,redis memcached什么的 nosql的都行,量小就查库,没必要那么复杂了
同步到新浪微博
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。 上传我的文档
 上传文档
 下载
 收藏
粉丝量:568
该文档贡献者很忙,什么也没留下。
 下载此文档
求职意向:软件工程师、JAVA程序员。
下载积分:1000
内容提示:求职意向:软件工程师、JAVA程序员。
文档格式:DOC|
浏览次数:551|
上传日期: 08:18:32|
文档星级:
全文阅读已结束,如果下载本文需要使用
 1000 积分
下载此文档
该用户还上传了这些文档
求职意向:软件工程师、JAVA程序员。
关注微信公众号java初学者对一个简单java语句的疑惑_百度知道
java初学者对一个简单java语句的疑惑
代码如下:
class DayCounter {
public static void main(String[] arguements) {
int yearIn = 2012;
int moothIn = 1;
if (arguements.length & 0 )
moothIn = Integer.parseInt(arguements[0]);
我有更好的答案
第一个if,判断arguements数组是否有值,有值才执行if语句第二个if,判断arguements数组是否有两个或两个以上的值,有的话,就取数组中第二个的值
采纳率:31%
来自团队:
第一个if判断是否有入参,如果有则把第一个入参转化成int第二个if判断入参是否一个以上的入参,如果有,则把第二个入参也转化成int,因为第一个入参在上一个if判断中已经被转化了,这里就不需要再转化了。
判断arguements中是否有值,防止报 java.lang.ArrayIndexOutOfBoundsException异常
第一个if判断输入的字符串数组的长度、要是大于0、就转化为Int类型的数据赋值给moothln,要是等于0的话arguements[0]会出错第二个if同样的道理、就是防止内存溢出、
第一个if表示arguements的数组是否为空,第二个则判断arguements的数组有两个或两个以上时的情况
其他2条回答
为您推荐:
其他类似问题
您可能关注的内容
java的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 java初学者书籍 的文章

 

随机推荐