1 文件的编码
1.1 文件的编码
public static void main(String[] args) {
// TODO Auto-generated method stub
String s = "慕课ABC";
/**
* 转换成字节序列利用的是项目默认的编码,
* eclipse查看项目默认编码的方式:点击项目->右击Properties->Resource->Text file encoding
* 项目编码也可以显示的指定:byte[] bytes = s.getBytes("gbk");
*/
byte[] bytes1 = s.getBytes();
for(byte b:bytes1) {
// 把字节转换为int,以16进制的方式显示
System.out.print(Integer.toHexString(b & 0xff) + " ");
}
System.out.println();
try {
byte[] bytes2 = s.getBytes("gbk");
/**
* gbk编码中文占2个字节,英文占1个字节
*/
for(byte b:bytes2) {
System.out.print(Integer.toHexString(b & 0xff) + " ");
}
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println();
try {
byte[] bytes3 = s.getBytes("utf-8");
/**
* 在utf-8编码中,中文占用3个字节,英文占用1个字节
*/
for(byte b:bytes3) {
System.out.print(Integer.toHexString(b & 0xff)+" ");
}
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println();
byte[] bytes4 = null;
try {
/**
* 在utf-16be中,中文和英文都占用2个字节
*/
bytes4 = s.getBytes("utf-16be");
for(byte b:bytes4) {
System.out.print(Integer.toHexString(b & 0xff)+" ");
}
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println();
/**
* 字节序列转化为字符串时,当你的字节序列的编码方式与项目默认编码方式不同时,
* 这个时候需要手动添加编码方式进行转换,
* 否则会出现乱码
*
*/
String str1 = new String(bytes4);
System.out.println(str1);
try {
String str2 = new String(bytes4,"utf-16be");
System.out.println(str2);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
/**
* eclipse中什么编码的项目只认识什么编码的文件,
* 将一个项目的文件拷贝到另一个编码方式不同的项目中,就会出现乱码,
* 这就是直接拷贝别人项目文件出现乱码的原因
*/
/**
* 文本文件 就是字节序列
* 可以是任意编码的字节序列
* 如果我们在中文机器上直接创建文本文件,那么该文本文件只认识ansi编码
*/
}
2 File 类的使用
2.1 File 类常用 API 介绍
java.io.File 类用于表示文件(目录)
File类只用于表示文件(目录)的信息(名称、大小等),不能用于文件内容的访问
public static void main(String[] args) {
// TODO Auto-generated method stub
/**
* eclipse中用 Alt+/ 来查看File的构造函数,
* 文件分割符可以用 \\ 或者 / 或者 File.separator,
* File.separator不论win系统还是linux系统,都表示分割符
*/
File file = new File("D:\\javaio");
System.out.println(file.exists()); // 判断文件是否存在
if(!file.exists()) {
file.mkdir(); // 创建一级目录
file.mkdirs(); // 如果文件不存在,创建多级目录
}else {
file.delete(); // 如果文件存在,删除目录
}
/**
* 判断是否是一个目录 ,
* 如果是目录返回true,如果不是目录或者不存在返回false
*/
System.out.println(file.isDirectory());
// 判断是否是一个文件
System.out.println(file.isFile());
/**
* 创建文件
*/
File file2 = new File("d:\\javaio\\日记1.txt");
File file3 = new File("d:\\javaio","日记2.txt");
if(!file2.exists()) {
try {
file2.createNewFile(); // 文件不存在,创建这个文件
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else {
file2.delete(); // 文件存在删除文件
}
// 常用的File对象的API
System.out.println(file); // 打印file.toString()的内容
System.out.println(file.getAbsolutePath()); // 打印路径
System.out.println(file.getName()); // 打印目录名
System.out.println(file2.getName()); // 打印文件名
System.out.println(file.getParent()); // 返回父目录路径
System.out.println(file2.getParent()); // 返回父目录路径
System.out.println(file.getParentFile().getAbsolutePath()); // 返回父目录路径
}
2.2 遍历目录
package com.amoscxy;
import java.io.File;
import java.io.IOException;
/**
* 列出File的一些常用操作比如过滤、遍历等操作
* @author BG235144
*
*/
public class FileUtils {
/**
* 列出指定目录下(包括其子目录)的所有文件
* @param dir
* @throws IOException
*/
public static void listDirectory(File dir) throws IOException{
if(!dir.exists()) {
throw new IllegalArgumentException("目录:"+dir+"不存在");
}
if(!dir.isDirectory()) {
throw new IllegalArgumentException(dir+"不是目录");
}
/**
* 返回的是字符串数组,
* 不包含子目录下的内容
*/
// String[] filenames = dir.list();
// for(String filename:filenames) {
// System.out.println(dir+"\\"+filename);
// }
/**
* 如果要遍历子目录下的内容就要构造成File对象做递归操作,
* File提供了直接返回File对象的api,
* 返回的是直接子目录(文件)的对象
*/
File[] files = dir.listFiles();
// for(File file:files) {
// System.out.println(file);
// }
if(files!=null && files.length>0) {
for(File file:files) {
if(file.isDirectory()) {
/**
* 递归
*/
listDirectory(file);
}else {
System.out.println(file);
}
}
}
}
}
3 RandomAccessFile类的使用
3.1 RandomAccessFile基本操作
RandomAccessFile java提供的对文件内容的访问,既可以读文件,也可以写文件。
RandomAccessFile支持随机访问文件,可以访问文件的任意位置
RandomAccessFile 读写过程:
1. Java文件模型:
在硬盘上的文件是byte byte byte存储,是数据的集合
2. 打开文件:
有两种模式”rw”(读写)”r”(只读)
RandomAccessFile raf = new RandomAccessFile(file,”rw”);
文件指针,pointer = raf.getFilePointer(),
打开文件时指针在开头 pointer = 0;
3. 写方法:
raf.write(int)—>只写一个字节(后8位),同时指针指向下一个位置,准备再次写入
4. 读方法:
文件读写完成以后一定要关闭(oracle官方说明)
public static void main(String[] args) throws IOException{
File demo = new File("D:\\javaio");
if(!demo.exists()) {
demo.mkdir();
}
File file = new File(demo,"raf.dat");