已有101人关注
关于Java入门经典中11.6实例的问题
发表在Java图书答疑 2015-08-02
是否精华
版块置顶:
public class FileInAndOut {
private static String filepath="./123.txt";
private static File file=new File(filepath);
private static int runCount=0;  //程序运行次数
private static String date=String.format("%tF%<tT",new Date());  //上次运行时间
private static String os=System.getProperty("os.name");//上次运行程序的操作系统
private static String dataStr="";
                                  
public  static void main(String[] args){
loadConfig();
if(dataStr.isEmpty()){
System.out.println("这是第一次运行,其他程序还没有初始化!");
}
else{
System.out.println("程序已经运行了"+(runCount+1)+"次了。");
System.out.println("程序上次运行的时间是:"+date);
System.out.println("上次运行的操作系统是:"+os);
}
putConfig();
}
public static void loadConfig(){
try{
if(!file.exists())
file.createNewFile();
byte[] data=new byte[64];
FileInputStream fis=new FileInputStream(file);

int rs=0;
while((rs=fis.read(data))>0){
dataStr+=new String(data,0,rs);
}
if(!dataStr.isEmpty()){
String[] sets=dataStr.split(",");
runCount=Integer.parseInt(sets[0]);

date=sets[1];
os=sets[2];
}
    fis.close();
}catch(Exception e){
e.printStackTrace();
}
}
public static void putConfig(){
String dataStr;
try{
if(!file.exists())
file.createNewFile();
dataStr=(runCount+1)+","+date+","+os;
byte[] data=dataStr.getBytes();

FileOutputStream fout=new FileOutputStream(file);
fout.write(data);
fout.flush();
fout.close(); 
}catch(Exception e){
e.printStackTrace();
}
}
}
代码如上,有两处不懂。
(1)private static String date=String.format("%tF%<tT",new Date());  //上次运行时间  这边为什么要加一个小于号。树上没有类似的介绍(也没百度到)。
(2)while((rs=fis.read(data))>0){
dataStr+=new String(data,0,rs);
}
这个代码段不理解,请求讲解一下。谢谢。

------------------------------------------分 隔 线------------------------------------------------

额外我还想问个问题,在输入输出流中,字符和字节的区别在哪里?(我查过关于字节和字符的区别了,这个我知道.我想问的是,他们原理我不是很懂)。还有,哪些用字节流输入输出要效率高,哪些用字符流输入输出效率高?

举个例子:
try{
byte[] bs=new byte[50];
int i=is.read(bs);    //i是用来干嘛的?
System.out.println("输出:"+new String(bs).trim());
System.out.println(i);
is.close();
}catch(IOException e){
e.printStackTrace();
}
在这个代码段,我们用的是字节流,我看书上(api上)写的是从当前数据流中读取一个字节。那为什么会把我所有输入的内容全部读取给byte数组呢?这边也没循环语句啊?
 
分享到:
精彩评论 1
菜鸟级精英
学分:0 LV1
TA的每日心情
开心
2020-03-23 21:05:48
2015-08-03
沙发
(1)Date是一个类,创建一个类的对象必须运行类的构造方法,所以语法必须是 new Date()

(2)while((rs=fis.read(data))>0) //这是运算符的优先级方面的知识,先计算括号里的,再计算括号外的将fis.read(data)的赋值给rs,在判断此时rs是否大于零,返回布尔值
dataStr+=new String(data,0,rs); //创建一个字符串,等于date字符串对象中,从索引0开始到索引rs之前的字符内容
//上面这句等同于 String str = new String(data,0,rs); dataStr = dataStr + str;

(3)字符是char类型的,是可以在被输出的;字节是计算机储存的基本单位,例如
字节:A
字节:01000001(二进制)

(4)InputStream是数据读取流,你给数据流添加的缓冲区的参数,就是那个字节数组,数据流就会读取一定数量的字节,并将其存储到缓冲区数组中。
首页上一页 1 下一页尾页 1 条记录 1/1页
手机同步功能介绍
友情提示:以下图书配套资源能够实现手机同步功能
明日微信公众号
明日之星 明日之星编程特训营
客服热线(每日9:00-17:00)
400 675 1066
mingrisoft@mingrisoft.com
吉林省明日科技有限公司Copyright ©2007-2022,mingrisoft.com, All Rights Reserved长春市北湖科技开发区盛北大街3333号长春北湖科技园项目一期A10号楼四、五层
吉ICP备10002740号-2吉公网安备22010202000132经营性网站备案信息 营业执照