java - 012 - IO

作者: 离子来了 | 来源:发表于2016-04-10 16:05 被阅读51次

mark

UTF - 8 它是一种变长的字符集
表示:单字节来表示字母,双字节来表示一些希腊字母,三字节来表示汉字,当然也有四字节的  这么做当然会增加表示和识别的难度,不过,可以节省空间。这也是为什么utf-8在网络编码中流行的原因。

File

定义:表示了磁盘上的文件或者目录

  File f = new File("/Users/liyang/Documents");
  f.isDirectory();//是否是个目录
  f.isFile();//是否是个文件
  f.mkdir();//创建目录,只能创建一级目录
  f.mkdirs();//创建多级目录
  f.createNewFile();//创建文件
  f.list();//当前目录下的文件和目录名字
  f.listFiles();//返回当前目录的File对象
  f.delete();//删除File
 
 File[] files = f.listFiles(**new** FilenameFilter(){//策略模式,这里用的匿名内部类
   @Override
   public boolean accept(File dir, String name) {
    if (name.startsWith("git")){
     return true;
    }
    return false;
   }
  });
 for (File ff : files){
  System.out.println(ff.getName());
 }```

###warning
- windows平台的路径分隔符号“\”
- others平台的路径分隔符为"/"

File.separator;//解决上面的问题

#流
- 分类
1.功能上分类:输入流和输出流
2.处理数据单位不同:字节流和字符流
3.按功能的不同:节点流和处理流

| | 字节流 | 字符流|
| :----: | :----: | :-----: |
|输入流 | InputStream | Reader|
|输出流 | OutputStream | Writer|
---
#字节流
#FileInputStream

File f = new File("/Users/liyang/Documents/test.txt");
InputStream in = new FileInputStream(f);
byte[] buffer = new byte[200];
int length = 0;
while(-1 != (length = in.read(buffer))){//将文件读到buffer里面,长度每次为200,直到最后一次小于200
String str = new String(buffer,0,length);
System.out.println(str);
}
in.close();

#FileOutputStream

File f = new File("/Users/liyang/Documents/page2.jpg");
File cf = new File("/Users/liyang/Documents/copypage2.jpg");
cf.createNewFile();
InputStream in = new FileInputStream(f);
OutputStream out = new FileOutputStream(cf);
byte[] buffer = new byte[200];
int length = 0;
while(-1 != (length = in.read(buffer))){//将文件读到buffer里面,长度每次为200,直到最后一次小于200
out.write(buffer,0,length);//这里一定,最好是用这种方式,这个方法是将整个字节数组指定长度的内容都输入进去
String str = new String(buffer,0,length);
System.out.println(str);
}
out.flush();
in.close();
out.close();

#BufferedOutputStream
 File f = new File("1.txt");
 OutputStream out = new FileOutputStream(f,true);//true表示追加
 out = new BufferedOutputStream(out);//缓冲流
 out.write("http://www.baidu.com".getBytes());
 out.flush();
 out.close();
#DataOutputStream And DataInputStream

//DataOutputStream 以二进制的方式写入基本数据类型,生成的也是二进制文件
String filePath = "/Users/liyang/Documents/test.txt";
DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(filePath)));

byte b = 4;
int i =12;
char ch = 'a';
float f = 4.4f;

dos.write(b);
dos.writeInt(i);
dos.writeChar(ch);
dos.writeFloat(f);

dos.flush();
dos.close();

DataInputStream ios = new DataInputStream(new BufferedInputStream(new FileInputStream(filePath)));

System.out.println(ios.readByte());
System.out.println(ios.readInt());
System.out.println(ios.readChar());
System.out.println(ios.readFloat());

ios.close();

---
#字符流
#OutputStreamWriter And InputStreamReader 字节流和字符流的转化

String filePath= "/Users/liyang/Documents/test1.txt";
FileOutputStream f = new FileOutputStream(filePath,true);
OutputStreamWriter or= new OutputStreamWriter(f);//字符流和字节流的转换桥梁
BufferedWriter bw = new BufferedWriter(or);
bw.write("ss来了");
bw.flush();
bw.close();

InputStream in =new FileInputStream(filePath);
Reader r = new InputStreamReader(in);
BufferedReader br = new BufferedReader(r);
String rStr = br.readLine();
System.out.println(rStr);

InputStreamReader ins = new InputStreamReader(System.in);//键盘输入标准输入流
BufferedReader br = new BufferedReader(ins);
String tmpStr;
while (null != (tmpStr = br.readLine())){
System.out.println(tmpStr);
}
br.close();

#FileWriter And FileReader

String filePath= "/Users/liyang/Documents/test1.txt";
Writer w = new FileWriter(filePath,true);
BufferedWriter bw = new BufferedWriter(w);
bw.write("我颠覆流整个世界,只为摆正你的倒影");
bw.write("\n");
bw.flush();
bw.close();

Reader r = new FileReader(filePath);
BufferedReader br = new BufferedReader(r);
String str;
while (null != (str = br.readLine()) ){
System.out.println(str);
}
br.close();

#ObjectOutputStream And ObjectInputStream
###对象序列化,对象要序列化需要实现java.io.Serializable接口
定义:将对象转换为字节流保存起来,并在以后还原这个对象,这种机制叫做对象序列化
mark:将一个对象永久存储到设备上称为持久化。

warning:
1.只能序列化非静态变量,不能序列化任何静态变量
2.序列化成员变量,如果成员变量是一个对象,对象也必须可序列化,否则出错
3.当成员变量用transient修饰的时候,序列化的时候就会跳过该属性的序列化

public class test {
private static ObjectInputStream oi;
public static void main(String[] args) throws Exception {
Person p1 = new Person(20,"lilei",169);
Person p2 = new Person(21,"lilei1",180);
Person p3 = new Person(22,"lilei2",179);
//序列化
String filePath = "/Users/liyang/Documents/testSerializable.txt";
OutputStream out = new FileOutputStream(filePath);
ObjectOutputStream os = new ObjectOutputStream(out);
os.writeObject(p1);
os.writeObject(p2);
os.writeObject(p3);
os.close();

//反序列化
InputStream in = new FileInputStream(filePath);
oi = new ObjectInputStream(in);
p1 = (Person)oi.readObject();
p2 = (Person)oi.readObject();
p3 = (Person)oi.readObject();

System.out.println(p1);
System.out.println(p2);
System.out.println(p3);

}
}

//MARK:实现Serializable这个标记接口就可以将对象序列化了
class Person implements Serializable{
int age;
String name;
transient float height; // 如果transient修饰后的属性,反序列化的时候就会是默认值

Person(int age,String name,float height){
this.age = age;
this.name = name;
this.height = height;
}

public String toString(){
return "age:" + this.age + "name:" + this.name + "height:"+this.height;
}
}

相关文章

网友评论

    本文标题:java - 012 - IO

    本文链接:https://www.haomeiwen.com/subject/blwblttx.html