JAVA 中文件的读写 I/O 输入输出流
JAVA 中文件的读写 I/O 输入输出流
阅读 19
收藏 0
2018-02-17
主要内容
1. 编码问题
2.File 类的使用
3.RandomAccessFile 的使用
4.I/O 输入输出流
编码问题:
import java.io.UnsupportedEncodingException;
public class 编码问题 {publicstaticvoidmain(String[]args){
// 我们项目的默认编码是 GBK
Strings="测试 ABC";
byte[]byte1=s.getBytes();// 转换成的字节序列用的是项目默认的编码 gbk
for(byteb:byte1){
// 1 byte = 8 位 //toHexString 这个函数是把字节 (转换成了 Int) 以 16 进制的方式显示
System.out.print(Integer.toHexString(b&0xff)+" ");// &
// 0xff 是为了把前面的 24 个 0 去掉只留下后八位
}
try{
// 也可以转换成指定的编码
byte[]bytes1=s.getBytes("gbk");
System.out.println(newString(bytes1));
}catch(UnsupportedEncodingExceptione){
// TODO Auto-generated catch block
e.printStackTrace();
}
/**
* gbk 编码: 中文占用两个字节, 英文占用一个字节 utf-8 编码: 中文占用三个字节, 英文占用一个字节
* java 是双字节编码, 是 utf-16be 编码 utf-16be 编码: 中文占用两个字节, 英文占用两个字节
* 当你的字节序列是某种编码时, 这个时候想把字节序列变成字符串, 也需要用这种编码方式, 否则会出现乱码
*/
try{
byte[]byte2=s.getBytes("utf-16be");
Strings2=newString(byte2,"utf-16be");
System.out.println(s2);
}catch(UnsupportedEncodingExceptione){
// TODO Auto-generated catch block
e.printStackTrace();
}
/**
* 文本文件就是字节序列, 可以是任意编码的字节序列
* 如果我们在中文机器上直接创建文本文件, 那么该文件只认识 ANSI 编码(例如直接在电脑中创建文本文件)
*/
/**
* byte 转 int 的时候为什么非要先 & 0xff 计算出来才是正确答案?
* 首先, java 中的二进制采用的是补码形式, 并非原码或反码, 这 3 个概念要搞清楚;
* 其次, byte 占 8 位, int 占 32 位, 将 byte 强制转换为 int 型时, 如果没有做 &
* 0xff 运算, 且 byte 对应的值为负数的话, 就会对高位 3 个字节进行补位, 这样就有可能出现补位误差的错误
* 举例来说, byte 型的 - 1, 其二进制 (补码) 为 11111111(即 0xff), 转换成 int 型, 值也应该为 - 1, 但经过补位后,
* 得到的二进制为 11111111111111111111111111111111(即 0xffffffff), 这就不是 - 1 了, 对吧?
* 而 0xff 默认是 int 型, 所以, 一个 byte 跟 0xff 相与, 会先将那个 byte 转化成 int 型运算, 这样, 结果中的高位 3 个字节就总会被清 0,
* 于是结果就是我们想要的了~
*/
}
}
ViewCode
File 类的使用:
JAVA.io.File 类用于表示文件 (目录) File 类只用于表示文件( 目录) 的信息 (名称大小等), 不能用于文件内容的访问 File 类的常用 API: 1. 创建 File 对象: File file=new File(String path); 注意: File.seperater(); 获取系统分隔符, 如:\. 2.boolean file.exists(); 是否存在. 3.file.mkdir(); 或者 file.mkdirs(); 创建目录或多级目录 4.file.isDirectory() 或者 file.isFile()判断是否是目录或者是否是文件 5.file.delete(); 删除文件或目录 6.file.createNewFile(); 创建新文件 7.file.getName()获取文件名称或目录绝对路径 8.file.getAbsolutePath()获取绝对路径 9.file.getParent(); 获取父级绝对路径 10.file.getSize(); 获取文件大小 11.file.getFormat(); 获取文件格式名
importjava.io.File;
importjava.io.IOException;
publicclassFileDemo{
/**
* @param args
*/
publicstaticvoidmain(String[]args){
// 了解构造函数的情况 查帮助 ALT+/
Filefile=newFile("E:\\javaio\\imooc");
// 判断文件 / 文件夹是否存在
// System.out.println(file.exists());
if(!file.exists())
file.mkdir();// file.mkdirs()如果文件不存在, 直接创建文件夹
// mkdir 创建的一级目录, 如果需要创建多级目录可以使用 mkdirs()
else
file.delete();
// 是否是一个目录 如果是目录返回 true, 如果不是目录 or 目录不存在返回的是 false
System.out.println(file.isDirectory());
// 是否是一个文件
System.out.println(file.isFile());
// File file2 = new File("e:\\javaio\\ 日记 1.txt");
Filefile2=newFile("e:\\javaio","日记 1.txt");
if(!file2.exists())
try{
file2.createNewFile();
}catch(IOExceptione){
// 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());
}
}
FileDemo
遍历目录importjava.io.File;
importjava.io.IOException;
// 列出 File 的一些常用操作比如过滤, 遍历等操作
publicclassFileUtils{
/**
* 列出指定指定目录下 (包括其子目录) 的所有文件
*
* @param dir
* @throws IOException
*/
publicstaticvoidlistDirectory(Filedir)throwsIOException{
if(!dir.exists()){
thrownewIllegalArgumentException("目录:"+dir+"不存在");
}
if(!dir.isDirectory()){
thrownewIllegalArgumentException(dir+"不是目录");
}
// String[] fileNames =
// dir.list();// 返回的是字符串数组, list()方法用于列出当前目录下的子目录和文件, 直接子的名称, 不包含子目录下的内容
// for (String string : fileNames) {
// System.out.println(dir+"\\"+string);
// }
//
// 如果要遍历子目录下的内容就需要构造成 File 对象做递归操作, File 提供了直接返回 File 对象的 API
File[]files=dir.listFiles();// 返回的是直接子目录 (文件) 的抽象
if(files!=null&&files.length>0){// 确定存在子目录
for(Filefile:files){
if(file.isDirectory()){
// 递归
listDirectory(file);
}else{
System.out.println(file);
}
}
}
}
}
FileUtils
RandomAccessFile 的使用
RandomAccessFile JAVA 提供的对文件内容的访问, 既可以读文件, 也可以写文件 RandomAccessFile 支持随机访问文件, 可以访问文件的任意位置 (1)JAVA 文件模型 在硬盘上的文件是 byte byte byte 存储的, 是数据的集合 (2)打开文件 有两种模式 "rw"(读写) "r"(只读) RandomAccessFile raf = new RandomeAccessFile(file,"rw") 文件指针, 打开文件时指针在开头 pointer = 0; (3) 写方法 raf.write(int)--->只写一个字节 (后 8 位), 同时指针指向下一个位置, 准备再次写入 提供和很多方法能够一次读写一个基本类型的数据 (4) 读方法 int b = raf.read()--->读一个字节 (5)文件读写完成以后一定要关闭(Oracle 官方说明)
importjava.io.File;
importjava.io.IOException;
importjava.io.RandomAccessFile;
importjava.util.Arrays;
publicclassRafDemo{
/**
* @param args
*/
publicstaticvoidmain(String[]args)throwsIOException{
Filedemo=newFile("demo");
if(!demo.exists())demo.mkdir();
Filefile=newFile(demo,"raf.dat");
if(!file.exists())file.createNewFile();
RandomAccessFileraf=newRandomAccessFile(file,"rw");
// 指针的位置
System.out.println(raf.getFilePointer());
raf.write('A');// 只写了一个字节
System.out.println(raf.getFilePointer());
raf.write('B');
inti=0x7fffffff;
// 用 write 方法每次只能写一个字节, 如果要把 i 写进去就得写 4 次
raf.write(i>>>24);// 高 8 位
raf.write(i>>>16);
raf.write(i>>>8);
raf.write(i);
System.out.println(raf.getFilePointer());
// 可以直接写一个 int
raf.writeInt(i);
Strings="中";
byte[]gbk=s.getBytes("gbk");
raf.write(gbk);
System.out.println(raf.length());
// 读文件, 必须把指针移到头部
raf.seek(0);
// 一次性读取, 把文件中的内容都读到字节数组中
byte[]buf=newbyte[(int)raf.length()];
raf.read(buf);
System.out.println(Arrays.toString(buf));
for(byteb:buf){
System.out.println(Integer.toHexString(b&0xff)+" ");
}
raf.close();
}
}
RafDemo