IO流总结
/**
* 流操作的基本规律;
* 最痛苦的就是流对象有很多,不知道使用哪一个
*
* 1.明确源和目的
* 源:输入流 InputStream Reader
* 目的:输出流 OutputStream Writer
* 2.操作的数据是否是纯文本
* 是:字符流
* 不是:字节流
* 3.当体系明确后,在明确要使用哪个具体的对象
* 通过设备来进行区分
* 源设备:内存,硬盘,键盘
* 目的设备:内存,硬盘,控制台
*
* 转换流什么时间使用?
* 字符和字节之间的桥梁,通常涉及到字符编码转换时需要用到转换流
*/
字符流
public class Test1 {
public static void main(String[] args) throws IOException {
// 键盘的最常见写法
BufferedReader bfr = new BufferedReader(
new InputStreamReader(System.in));
BufferedWriter bfw = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream("aaa.txt")));
String s = null;
while ((s = bfr.readLine()) != null) {
if ("over".equals(s))
break;
bfw.write(s);
bfw.newLine();
bfw.flush();//要刷新,将写在内存中的数据写入到目的地址中去。
//这里也可以不写,等到关闭流时(close),程序会自动先执行一下刷新程序,但是最好写上flush,每次都刷新
}
bfw.close();
// System.out.println(s);
}
}
自定义时间的显示形式
Date d=new Date();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss E");
String s=sdf.format(d);
System.out.println(s);
/**
* File类常见方法:
* 1,创建、
* boolean createNewFile():在指定位置创建文件,如果该文件已经存在,则不创建,返回false。
* 和输出流不一样,输出流对象一建立创建文件,已有文件就会被覆盖。
* boolean mkdir();创建文件夹
* boolean mkdirs();创建多级文件夹
* 2,删除。
* boolean delete();删除失败返回false.
* void deleteOnExit():在程序退出时删除指定文件。
* 3,判断。
* boolean exists():文件是否存在(使用很频繁)
* isFile()是否是文件
* isDirectory()是否是文件夹
* isHidden();是否是隐藏
* isAbsolute()是否是绝对路径
*
* 4,获取信息
* getName()
* getPath()
* getParent();获取绝对路径中的父目录
* getAbsolutePath()获取绝对路径
*
*/
获取目录下的文件
有两种方式:
1: File f=new File("c:\\");
String names[]=f.list();//调用list方法的file对象必须是封装了一个目录。该目录还必须存在。
2: File[] files=f.listFiles();
for(File file:files)
{
file.getName();
}
第一种方式只是获得到文件的名字,不能对文件进行操作。如果想对文件操作,那么必须用文件名new出该文件后在对文件进行操作。
第二种方式是获得文件对象,可以直接对获得的文件进行操作。(两种方式在不同的情况下使用不同的方法)
遍历指定文件夹下面的文件,并把class文件删除
public static void showDir(File dir)
{
System.out.println(dir);
File file[]=dir.listFiles();
for(File f:file)
{
if(f.isDirectory())
showDir(f);
else{
System.out.println(f);
if(f.getName().endsWith(".class"))
f.delete();
}
}
}
删除制定文件夹
public static void removeDir(File dir) {
File files[] = dir.listFiles();
for (File f : files) {
if (f.isDirectory()) {
removeDir(f);
} else {
System.out.println(f.getName() + " file删除: " + f.delete());
}
}
System.out.println(dir.getName() + " dir删除: " + dir.delete());
}
/**
* y用于记录应用程序运行的次数
* 如果使用次数已到,那么给出注册提示
*
* 计数器,计数器定义在程序中,随着程序的运行而在内存中存在,并进行自增。
* 可是随着该应用程序的退出,该计数器也在内存中消失了,下次再启动该程序
* 又是从新开始从0计数。不是我们想要的。
*
* 所以要建立一个配置文件,用于记录该软件的使用次数。
*
* 该配置文件使用简直对的形式,这样便于阅读数据,并操作。
*
* 键值对数据时map集合。数据是以文件形式存储,是用Io技术。
* 那么map+IO-->properties
*
* 配置文件可以实现应用程序数据的共享。
*
*/
public static void runtime() throws Exception {
File file = new File("d:\\time.txt");
if (!file.exists()) {
file.createNewFile();
}
InputStream is = new FileInputStream(file);
OutputStream os = null;
Properties ppt = new Properties();
ppt.load(is);
String value = ppt.getProperty("counttime");
int count = 0;
if (value != null) {
count = Integer.parseInt(value);
if (count >= 5) {
System.out.println("使用次数已到,");
System.exit(0);
}
}
count++;
ppt.setProperty("counttime", count + "");
os = new FileOutputStream("d:\\time.txt");
ppt.store(os, null);// 将此 Properties 表中的属性列表(键和元素对)写入输出流。
}
/**day21_01;
* 用于操作字节数组的流对象。
* ByteArrayInputStream:在构造的时候,需要接受数据源。而且数据源是一个字节数组。
*
* ByreArrayOutputStream:在构造的时候,不用定义数据目的,因为该对象中已经内部封装了可变长度的字节数组。
* 这就是数据目的地。
*
* 因为这两个流对象都操作的数组,并没有使用系统资源。
* 所以,不用进行close关闭。
*
* 在流操作规律讲解时:
* 源设备
* 键盘System.in 硬盘FileStream 内存ArrayStream
* 目的设备
* 控制台System.out 硬盘FileStream 内存ArrayStream
*
* 用流的读写思想来操作数据。
*
*/
编码与解码的问题
/**
* 编码:字符串变成字节数组(默认编码是GBK)
*
* 解码:字节数组变成字符串
*
* String-->byte[]:str.getBytes(chersetName);
* byte[]-->String:new String(byte[],chersetName);
*/
package day21_02encode;
import java.util.Arrays;
public class EmcodeDem02 {
public static void main(String[] args) throws Exception {
String s="你好";
byte b1[]=s.getBytes("utf-8");//将字符串按照utf-8来编码(默认是GBK是4个字节)。按照utf-8的方式存是6个字节
System.out.println(b1.length);
System.out.println(Arrays.toString(b1));//将数组变成集合
String s1=new String(b1,"ISO8859-1");//将字节数组按照ISO8859-1来解码(由于是按照utf-8来编码的所以解码后将会是乱码)
System.out.println(s1);
//对s1进行ISO8859-1编码。
byte b2[]=s1.getBytes("ISO8859-1");//在对s1按照ISO8859—1来编码,这样获得就是之前用utf-8获得的字节码
String s2=new String(b2,"UTF-8");//在用utf-8对字节码解码
System.out.println(s2);
}
}
外加一个递归删除指定文件下下面的所有.class文件。避免每次编译java文件后产生很多的.class文件而找不到java文件
public class FileDemo3 {
public static void main(String[] args) {
File dir=new File("E:\\java shiyan\\黑马_毕向东_java例子");
showDir(dir);
}
public static void showDir(File dir)
{
System.out.println(dir);
File file[]=dir.listFiles();
for(File f:file)
{
if(f.isDirectory())
showDir(f);
else{
System.out.println(f);
if(f.getName().endsWith(".class"))
f.delete();
}
}
}
}