传智播客-JavaIO-day07

来源:互联网 发布:局域网文件同步软件 编辑:程序博客网 时间:2024/06/05 08:32

---------------------- android培训java培训、期待与您交流! ----------------------

------1807
字符流和字节流
字节流两个基类:inputStream outStream
FileWriter对象,该对象一被寝化就必须明确被操作的文件。
例:
记得要导入io包:
import java.io.*;
class FileWriterDemo
{
public static void main(String[] args) throws IOException//抛出IO异常
{
  FileWriter fw=new FileWriter("demo.txt");//明确文件的目的
  fw.write("ddd");//调用write方法,将字符写入IO流。
  fw.flush();//刷新流对象中的缓冲数据。将数据刷到目的地中。
  fw.write("dddDD");
  fw.flush();//可多次写入。
}
}
与fw.close();关闭流资源,但关闭之前会刷新一次缓冲中的数据,将数据刷到目的地中。
.flush()与.close()区别:flush刷新后流可以继续使用,close刷新后会将流关闭。
注:记得使用.close关闭流以释放内存空间。
------1808
\\文件目录分隔符要用两个"\\"

------1809
回车符:\r\n

------1810
.read():一次读一个字符,而且会自动往下读.读到文件尾返回-1

------1906
装饰设计模式:
当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能。那么自定义的类称为装饰类。

------1915
字符流:
FileReader
FileWriter

BufferedReader
BufferedWriter
字节流:
FileInputStream
FileOutputStream

BufferedInputStream
BufferedOutputStream

readline方法是字符流BufferedReader类中的方法
而键盘录入的read方法是字节流InputStream的方法。

 

------1916
InputStreamReader是字节流通向字符流的桥梁

------1917
OutputStreadWriter是字符流通向字节流的桥梁
键盘录入最常见写法:
BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
输出:
BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream(System.out));
------1918
流操作的基本规律:
1.明确源和目的。
 源:输入流。InputStream Reader
 目的:输出流。OutputStream Writer
2.操作的数据是否纯文本。
 是:字符流。
 不是:字节流
3.当体系明确后,在明确要使用哪个具体的对象。
 通过设备来进行区分:
 源设备:内存,硬盘,键盘。
 目的设备:内存,硬盘,控制台。


------2001
File.separator

------2002
File类
createNewFile()在指定位置创建文件,如果文件已经存在,则不创建,返回false。
  和输出流不一样,输出流对象一建立就创建文件,如果文件存在,会覆盖。

------2007
/*
列出指定目录下库文件或者文件夹,包含子目录中的内容
也就是列出指定目录下所有的内容

因为目录中还有目录,只要使用同一个列出目录功能的函数完成即可。
在列出过程中出现的还是目录的话,还可以再次调用本功能。
也就是函数自身调用自身。
这种表现形式,或者编程手法,称为递归。
递归要注意:
1.限定条件
2.要注意递归次数,尽量避免内存溢出。
*/
import java.io.*;
class FileDemo3
{
 public static void main(String[] args)
 {
  File dir=new File("d:\\java1223");
  showDir(dir);
 }
 public static void showDir(File dir)
 {
  System.out.println(dir);
  File[] files=dir.listFiles();
  for(int x=0;x<files.length;x++)
  {
   if(files[x].isDirectory())
    showDir(file[x]);
   else
    System.out.println(files[x]);

  }
 }

}

------2010

throw e;//这里抛出e,在类首就应该加入throws IOException。如果抛出RuntimeException,在类首就可以不加入throws IOException


?????????--file.getName().endsWith(".java")中的endsWith是在哪学的
答:java.long中String类中的方法

*------2012
properties在java.util.*包中

------2013
import java.util.*;
properties是hashtable的子类。
也就是说它具备map集合的特点。而且它里面存储的键值对都是字符串。
是集合中和IO技术相结合的集合容器。
该对象特点:可以用于键值对形式的配置文件。
那么在加载数据时,需要数据有固定格式:键=值

------2014
/*记录应用程序运行次数
想法:计数器,用配置文件使用键值对的形式,键值对数据是Map集合
*/
import java.io.*;
import java.util.*;
class RunCount
{
 public static void main(String[] args) throws IOException
 {
  Properties prop=new Properties();
  File file=new File("count.ini");//file单独封装是为了下面的判断
  if(!file.exists())
   file.createNewFile();//判断文件不存在则建立文件
  FileInputStream fis=new FileInputStream(file);//流与文件关联
  prop.load(fis);//将输入流中的键值对信息存入Properties中
  int count=0;//计数器
  String value=prop.getProperty("time");//获取time键对应的值信息
  if(value!=null)
  {
   count=Integer.parseInt(value);//?为什么不写成count=(int)value;
   if(count>5)//大于5次退出程序
   {
    System.out.println("使用次数已到");
    return;
   }
  }
  count++;//计数器加1
  prop.setProperty("time",count+"");//将值写入集合中
  FileOutputStream fos=new FileOutputStream(file);//写入输出流
  prop.store(fos,"");//写入文件
  fos.close();//关闭输出流
  fis.close();//关闭输入流
 }
}

------2015
/*
PrintWriter
构造函数可以接收参数类型:
1.file对象,File
2.字符串路径。String
3.字节输出流,OutputStream
4.字符输出流,Writer。

从键盘输入字符,实时写入到文件中。
*/
import java.io.*;
class PrintStreamDemo
{
 public static void main(String[] args)throws IOException
 {
  BufferedReader bufr=new BufferedReader(new InputStreamReader(system.in);
  PrintWriter out=new PrintWriter(new FileWriter("a.txt"),true);//new FileWriter("a.txt")将a.txt封装成流
       //PrintWriter out=new PrintWriter(new BufferedWriter(new FileWriter("a.txt"),true));
  String line=null;
  while((line=bufr.readLine())!=null)
  {
   if("over".equals(line))
    break;
   out.println(line.toUPperCase());
  
  }
  out.close();
  bufr.close();
 }
}

------2016
序列流SequenceInputStream
import java.io.*;
import java.util.*;
class SequenceDemo
{
 public static void main(String[] args)
 {
  Vector<FileInputStream> v=new Vector<FileImputStream();
  v.add(new FileInputStream("c:\\1.txt));
  v.add(new FileInputStream("c:\\1.txt));
  v.add(new FileInputStream("c:\\1.txt));
  Enumberation<FileInputStream> en=v.elements();
  SequenceInputStream sis=new SequenceInputStre(en));
  FileOutputStream fos=new FileOutputStream(c:\4.txt);
  byte[]buf new byte[1024]
  int len=0
  while((len=sis.read(buf))!=-1)
  {
   fos.write(buf,0,len);
  }
  fos.close;
  sis.close:
 }
}


------2101
静态成员是不能被序列化的。
非静态成员加关键字transient也可以不被序列化。  例:transient int age;
import java.io.*;
class ObjectStreamDemo
{
 public static void main(String[] args) throws Exception
 {
  //writeObj();
  readObj();
 }
 public static void readObj() throws Exception
 {
  ObjectInputStream ois=new ObjectInputStream(new FileInputStream("obj.txt"));
  Person p=(Person)iso.readObject();
  System.out.println(p);
  ois.close();
 }
 public static void writeObj() throws IOException
 {
  ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("obj.txt"));
  oos.writeObject(new Person("lisi0",399,"kr"));
  oos.close();
 }
}

没有方法的接口通常称为标记接口。java.io.Serializable
序列化也就是对象的持久化,就是将对象存在文件中。
也可以自定义序列化标记UID:static final long serialVersionUID = 42L;

 

---------------------- android培训java培训、期待与您交流! ----------------------