Java IO
2018-12-02 本文已影响8人
panzhangbao
/** 输入流冲常用方法说明:
* read() 从输入流中读取数据的下一个字节。返回 0 ~ 255 范围内的 int 字节值。
* 如果因为已经到达流末尾而没有可用的字节,则返回值为 -1
*
* read(byte[] b) 从输入流中读入一定长度的字节,并以证书的形式返回字节数
*
* mark(int readlimit) 在输入流的当前位置放置一个标记。readlimit 参数告知此输入流在标记位置
* 失效之前允许读取的字节数
*
* reset() 将输入指针返回到当前所做的标记处
*
* skip(long n) 跳过输入流上的 n 个字节并返回实际跳过的字节数
*
* markSupported() 如果当前流支持 mark() / reset() 操作就返回 true
*
* close() 关闭此输入流并释放与该流关联的所有系统资源
*/
/** 输出流常用方法
* write(int b) 将制定的字节写入此输出流
*
* write(byte[] b) 将 b 个字节从制定的 byte 数组写入此输出流
*
* write(byte[] b, int off, int len) 将制定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流
*
* flush() 彻底完成输出并清空缓存区
*
* close() 关闭输出流
*/
面向字符的输入输出流
/**
* FileReader 类读取文件
*/
public static void useFileReaderReadFile() throws IOException {
FileReader b=new FileReader("/Users/panzhangbao/Desktop/Java/JavaIO/src/pan/ReadMe.txt");
char a[]=new char[1000]; //创建可容纳 1000 个字符的数组
int num=b.read(a); //将数据读入到数组 a 中,并返回字符数
String str=new String(a,0,num); //将字符串数组转换成字符串
System.out.println("读取的字符个数为:"+num+"\n内容为:\n" + str);
}
/**
* 使用 FileWrite写入文件
* @throws IOException
*/
public static void useFileWriterWriteFile() throws IOException{
FileWriter fileWriter =new FileWriter("/Users/panzhangbao/Desktop/Java/JavaIO/src/pan/WriteMe.txt");
for(int i=0;i<10;i++){
fileWriter.write("用 FileWriter 写入文字内容\n");
}
System.out.println("FileWriter 写入文件成功");
fileWriter.close();
}
/**
* 使用 BufferedReader 类读取文件
*/
public static void useBufferedReaderReadFile() throws IOException{
String OneLine;
int count = 0;
try{
FileReader fileReader =new FileReader("/Users/panzhangbao/Desktop/Java/JavaIO/src/pan/ReadMe.txt");
BufferedReader bufferedReader =new BufferedReader(fileReader);
while((OneLine = bufferedReader.readLine())!=null){ //每次读取 1 行
count++; //计算读取的行数
System.out.println(OneLine + "\n");
}
System.out.println("\n 共读取了 "+count+" 行");
bufferedReader.close();
}
catch(IOException io){
System.out.println("出错了!"+io);
}
}
/**
* 使用 BufferedWriter 写入文件
* @throws IOException
*/
public static void useBufferedWriterWriteFile() throws IOException{
String str;
BufferedReader in = new
BufferedReader(new FileReader("/Users/panzhangbao/Desktop/Java/JavaIO/src/pan/ReadMe.txt"));
BufferedWriter out = new
BufferedWriter(new FileWriter("/Users/panzhangbao/Desktop/Java/JavaIO/src/pan/WriteMe.txt"));
while((str=in.readLine())!=null){
out.write(str); //将读取到的 1 行数据写入输出流
System.out.println(str);
}
out.flush();
in.close();
out.close();
}
面向字节的输入输出流
/**
* 使用 InputStream 读取数据
* 好处:节省空间
* @throws IOException
*/
public static void useInputStream() throws IOException{
File readFile = new File("/Users/panzhangbao/Desktop/Java/JavaIO/src/pan/ReadMe.txt");
InputStream inputStream = new FileInputStream(readFile);
byte[] b = new byte[(int)readFile.length()];
System.err.println("文档内容长度为:"+readFile.length());
// 1.1 全字节读取
inputStream.read(b);
inputStream.close();
System.err.println(new String(b));
// 1.2 逐字节读取
// int count = 0;
// int temp = 0;
// // 注意:当读到文件末尾的时候会返回-1.正常情况下是不会返回-1的。
// while((temp = inputStream.read()) != -1){
// b[count++] = (byte)temp;
// }
// inputStream.close();
// System.err.println(new String(b));
}
/**
* 使用 OutputStream 写入数据
* @throws IOException
*/
public static void useOutputStream() throws IOException{
File writeFile = new File("/Users/panzhangbao/Desktop/Java/JavaIO/src/pan/WriteMe.txt");
OutputStream outputStream = new FileOutputStream(writeFile);
// 开启添加模式
// OutputStream outputStream = new FileOutputStream(writeFile, true);
byte[] b2 = "DAXIE,xiaoxie大哥,恭喜你,终于把我给打印出来啦,我是神屌丝,继续努力哦\n".getBytes();
outputStream.write(b2);
int temp = 0;
// 下面是逐字节写入
for (int i = 0; i < b2.length; i++) {
outputStream.write(b2[i]);
// 大写转换为小写
// outputStream.write(Character.toLowerCase(b2[i]));
}
outputStream.close();
}
小测试
/**
* 通过程序创建一个文件,从键盘输入字符,
* 当遇到字符“#”时结束,在屏幕上显示该文件的所有内容
*/
public static void test1(){
char ch;
int dataIndex;
try{
/**
* FileDescriptor 是 java.io 中的一个类,该类不能实例化,
* 其中包含三个静态成员:in、out 和err,分别对应于标准输入流、标准输出流和标准错误流,
* 利用它们可以在标准输入输出流上建立文件输入输出流,实现键盘输入或屏幕输出操作。
*/
// 读取数据在控制台
FileInputStream in = new FileInputStream(FileDescriptor.in);
// 写入数据到具体文件
FileOutputStream outPath = new FileOutputStream("/Users/panzhangbao/Desktop/Java/JavaIO/src/pan/WriteMe.txt"); //创建文件输出流对象
System.out.println("请输入字符,以#号结束:");
while((ch = (char)in.read()) != '#'){
outPath.write(ch);
}
System.out.println("输入结束,文件已写入到 WriteMe.txt 中\n");
in.close();
outPath.close();
// 读取数据从具体文件
FileInputStream inPath = new FileInputStream("/Users/panzhangbao/Desktop/Java/JavaIO/src/pan/WriteMe.txt");
// 写入数据到控制台
FileOutputStream out = new FileOutputStream(FileDescriptor.out);
System.out.println("读取具体文件数据开始");
// inPath.available() 为文件的大小
while(inPath.available() > 0){
dataIndex = inPath.read();
out.write(dataIndex);
}
System.out.println("\n读取具体文件数据结束");
inPath.close();
out.close();
}
catch(FileNotFoundException e){
System.out.println("找不到该文件!");
}
catch(IOException e){}
}
/**
* 输入一串字符显示出来,并显示 System.in 和 System.out 所属的类
* @throws IOException - 此处输入中文暂时未解决
*/
public static void test2() throws IOException{
byte a[] = new byte[128]; //设置输入缓冲区
System.out.print("请输入字符串:");
// 最后是输入字符的个数
int count = System.in.read(a); //读取标准输入输出流
System.out.println("输入的 ASCII 值是:");
for(int i = 0;i < count;i++)
System.out.print(a[i]+""); //输出数组元素的 ASCII 值
System.out.println();
System.out.println("输入的字符(暂时无法处理中文字符)是:");
for(int i = 0;i < count-2;i++) { //不显示回车和换行符
System.out.print((char) a[i] + ""); //按字符方式输出元素
}
Class inClass = System.in.getClass();
Class outClass = System.out.getClass();
System.out.print("\nin 所在的类为:" + inClass.toString());
System.out.print("\nout 所在的类为:" + outClass.toString());
}
压缩
//使用java.util.zip原生ZipOutputStream与ZipEntry会中文乱码
//import java.util.zip.ZipOutputStream;
//import java.util.zip.ZipEntry;
//使用org.apache.tools.zip这个就不会中文乱码
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;
import java.io.*;
import java.util.Enumeration;
import java.util.zip.CRC32;
import java.util.zip.CheckedInputStream;
import java.util.zip.CheckedOutputStream;
//需要压缩的文件夹完整路径
static String filePath = "/Users/panzhangbao/Desktop/待压缩文件夹名/";
//需要压缩的文件夹名
static String fileName = "待压缩文件夹名";
//压缩完成后保存为小笨蛋.zip文件,名字随意
static String outPath = "/Users/panzhangbao/Desktop/压缩文件名.zip";
// 需要解压的文件(夹)完整路径
static String zipPath = "/Users/panzhangbao/Desktop/压缩文件名.zip";
// 解压后的文件(夹)完整路径
static String unzipedFilePath = "/Users/panzhangbao/Desktop/解压后文件夹名/";
public static void main(String[] args) throws Exception {
// zipFileMethod();
unzipFileMethod();
}
/**
* 压缩文件或者文件夹
* @throws Exception
*/
public static void zipFileMethod() throws Exception {
OutputStream outputStream = new FileOutputStream(outPath);//创建 压缩文件名.zip文件
CheckedOutputStream checkedOutputStream = new CheckedOutputStream(outputStream, new CRC32());//检查输出流,采用CRC32算法,保证文件的一致性
ZipOutputStream zipOutputStream = new ZipOutputStream(checkedOutputStream);//创建zip文件的输出流
zipOutputStream.setEncoding("GBK");//设置编码,防止中文乱码
File file = new File(filePath);//需要压缩的文件或文件夹对象
ZipFile(zipOutputStream,file);//压缩文件的具体实现函数
zipOutputStream.close();
checkedOutputStream.close();
outputStream.close();
System.out.println("压缩完成");
}
//递归,获取需要压缩的文件夹下面的所有子文件,然后创建对应目录与文件,对文件进行压缩
public static void ZipFile(ZipOutputStream zipOutputStream, File file) throws Exception
{
if(file.isDirectory()) {
//创建压缩文件的目录结构
zipOutputStream.putNextEntry(new ZipEntry(file.getPath().substring(file.getPath().indexOf(fileName))+File.separator));
for(File f : file.listFiles()) {
ZipFile(zipOutputStream,f);
}
}
else {
//打印输出正在压缩的文件
System.out.println("正在压缩文件:"+file.getName());
//创建压缩文件
zipOutputStream.putNextEntry(new ZipEntry(file.getPath().substring(file.getPath().indexOf(fileName))));
//用字节方式读取源文件
InputStream inputStream = new FileInputStream(file.getPath());
//创建一个缓存区
BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
//字节数组,每次读取1024个字节
byte [] bytes = new byte[1024];
//循环读取,边读边写
while(bufferedInputStream.read(bytes)!=-1)
{
zipOutputStream.write(bytes); //写入压缩文件
}
//关闭流
bufferedInputStream.close();
inputStream.close();
}
}
/**
* 解压缩文件或者文件夹
* @throws Exception
*/
public static void unzipFileMethod() throws IOException {
ZipFile zipFile = new ZipFile(zipPath,"GBK");//压缩文件的实列,并设置编码
//获取压缩文中的所有项
for(Enumeration<ZipEntry> enumeration = zipFile.getEntries(); enumeration.hasMoreElements();)
{
ZipEntry zipEntry = enumeration.nextElement();//获取元素
//排除空文件夹
if(!zipEntry.getName().endsWith(File.separator))
{
System.out.println("正在解压文件:"+zipEntry.getName());//打印输出信息
//创建解压目录
File file = new File(unzipedFilePath+zipEntry.getName().substring(0, zipEntry.getName().lastIndexOf(File.separator)));
//判断是否存在解压目录
if(!file.exists())
{
file.mkdirs();//创建解压目录
}
OutputStream outputStream = new FileOutputStream(unzipedFilePath+zipEntry.getName());//创建解压后的文件
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);//带缓的写出流
InputStream inputStream = zipFile.getInputStream(zipEntry);//读取元素
BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);//读取流的缓存流
CheckedInputStream checkedInputStream = new CheckedInputStream(bufferedInputStream, new CRC32());//检查读取流,采用CRC32算法,保证文件的一致性
byte [] bytes = new byte[1024];//字节数组,每次读取1024个字节
//循环读取压缩文件的值
while(checkedInputStream.read(bytes)!=-1)
{
bufferedOutputStream.write(bytes);//写入到新文件
}
checkedInputStream.close();
bufferedInputStream.close();
inputStream.close();
bufferedOutputStream.close();
outputStream.close();
}
else
{
//如果为空文件夹,则创建该文件夹
new File(unzipedFilePath+zipEntry.getName()).mkdirs();
}
}
System.out.println("解压完成");
zipFile.close();
}
}