文件传输基础——Java IO流

时间:2023-02-16 13:54:41

第一章 文件的编码

String s = "我的博客";

byte[] bytes1 = s.getBytes();

for(byte b: bytes1) {

    //把字节(转换成了int)以16进制的方式显示

    System.out.print(Integer.toHexString(b & 0xff) + " ");

}

gbk编码中文占用2个字节,英文占用1个字节。

utf-8编码中文占用3个字节,英文占用1个字节。

java是双字节编码utf-16be,中文占用2个字节,英文占用1个字节。


当你的字节序列是某种编码时,想把字节序列变成字符串,也需要用这种编码方式。

文本文件就是字节序列。如果在中文机器上直接创建文本文件,那么该文本文件只认识ansi编码。


第二章 File类的使用

2-1 File类常用API

File类只用于表示文件(目录)的信息(名称、大小等),不能用于文件内容的访问。

File file = new File(“E:\\javaio”); //分隔符使用\\或/,或File.separator

if(!file.exists())

file.makedir();//若有多级目录file.mkdirs()

else

file.delete();

file.isDirectory(); //是否是一个目录,如果不是目录或目录不存在返回false

file.isFile(); //是否是一个文件

File file2 = new File(“e:\\javaio”,”1.txt”);

if(!file2.exists())

file2.createNewFile();

else

   file2.delete();

file.getAbsolutePath();

file.getName();

file.getParent();

 

 

2-2 遍历目录

//列出指定目录下(包括其子目录)的所有文件

public static void listDirectory(File dir)throws IOException {

if(!dir.exists())throw new IllegalArgumentException(“目录不存在”);

if(!dir.isDirectory())throw new IllegalArgumentException(“不是目录”);

String[]filenames = dir.list(); //返回字符串数组,不包含子目录下内容

for(Stringstring : filenames) {

    System.out.println(string);

}

File[] files =dir.listFiles(); //返回的是直接子目录(文件)的抽象

//如果要遍历子目录下的内容就需要构成File对象做递归操作

}

 

第三章 RandomAccessFile类的使用

RandomAccessFile java提供对文件内容的访问,读、写。支持随机访问文件,可以访问文件的任意位置。

(1)在硬盘上的文件是byte存储的,是数据的集合。

(2)打开文件两种模式”rw”(读写),”r”(只读)。

RandomAccessFile raf = new RandomAccessFile(file, “rw”);

文件指针,打开文件时指针在开头pointer = 0;

(3)写方法

raf.write(int); //只写一个字节(后8位),同时指针指向下一个位置,准备再次写入。

(4)读方法

int b = raf.read(); //读一个字节

(5)文件读写完成以后一定要关闭。

 

raf.write(‘A’); //只写了一个字节

System.out.println(raf.getFilePointer());

 

String s = “中”;

byte[] gbk = s.getBytes(“gbk”);

raf.write(gbk);

 

//读文件,必须把指针移到头部

raf.seek(0);

//一次性读取,把文件中的内容都读到字节数组中

byte[] buf = new byte[(int)raf.length()];

System.out.println(Arrays.toString(buf));

 

 

第四章 字节流

InputStream、OutputStream抽象了应用程序读、写数据的方式。

int b = in.read(); //读取一个字节无符号填充到int低八位,-1是EOF

in.read(byte[] buf);

in.read(byte[] buf, int start, int size);

int b = in.read(byte[] buf, int start, intsize);

FileInputStream具体实现了在文件上读取数据

//如果该文件不存在,则直接创建,如果存在,删除后创建。

FileOutputSteram out = new FileOutputStream(“demo/out.dat”);

DataOutputStream /DataIutputStream

writeInt()/writeDouble/writeUTF()

BufferedOutputStream

 

第五章 字符流

Java的文本(char)是16位无符号整数,是字符的unicode编码。文件是byte byte…的数据序列。

文本文件是文本(char)须留按照某种编码方法序列化为byte的存储结果。

字符流(ReaderWriter),自负的处理,一次处理一个字符,自负的底层仍然是基本的字节序列。InputStreamReader完成byte流解析为char流,按照编码解析。

 

第六章 对象的序列化和反序列化

对象的序列化,就是将Object转换成byte序列。

序列化流(ObjectOutputStream),是过滤流-------writeObject。

序列化接口(Serializable)对象必须实现序列化接口,才能进行序列化。这个接口没有任何方法,只是一个标准。

ObjectInputStream ois = new ObjectInputStrea(newFileInputStream(fle));

Student stu = (Student)ois.readObject();

 

Transient修饰的元素不会进行jvm默认的序列化。

 

private voidreadObject(java.io.ObjectInputStream s) throws java.io.IOException,ClassNotFoundException{

s.defaultReadObject();

this.age =s.readInt();

}

 

一个类实现了序列化接口,那么其子类可以进行序列化。

 

对子类对象进行反序列化操作时,如果父类没有实现序列化接口,那么父类的构造函数会被调用。