【无标题】

java文件操作和字节流

字节流适用于:二进制文件的读取,或者用于读取图像数据之类的原始字节流
  在java程序开发中,我们往往会遇到很多文件上传,文件写入等对于文件的操作业务需要开发,java中提供了封装类java.io.File用于操作硬盘上的文件目录,因此文件操作File如何运用也是比较重要的。
 1.文件操作
  文件—把数据持久化到磁盘的载体
  文件的组成:1.文件的基本属性【文件命名,文件类型,文件的创建时间,文件的大小…】
 2.文件中的数据
  我们要想通过java提供的输入输出流读写文件中的内容就得先学会操作文件。
  Java中为我们提供了一个专门操作文件的java类–java.io.File类
 3.File类的对象创建和常用方法?
  File类的定义 public class File
  File类的静态成员变量:
  static String pathSeparator 与系统相关的路径分隔符字符,为方便起见,表示为字符串。
  static char pathSeparatorChar 与系统相关的路径分隔符。
  static String separator 与系统相关的默认名称 - 分隔符字符,以方便的方式表示为字符串。
  static char separatorChar 与系统相关的默认名称分隔符。
例如:

package com.wangxing.zyb1;
import java.io.File;
public class FileTest1 {
	public static void main(String[] args) {
		System.out.println("static String pathSearator=="+File.pathSeparator);
		System.out.println("static Char pathSearator=="+File.pathSeparatorChar);
		System.out.println("static String pathSearator=="+File.separator);
		System.out.println("static Char pathSearator=="+File.pathSeparatorChar);
		//separator/separatorChar表示的是文件的路径分割符号
		//这里出现的路径分割符号的静态常量就是让我们在编写文件路径的时候来使用
		//System.out.println("D:\Java学习\JAVA文件\test.txt"); \\错误
		//这里出现的路径分割符号的静态常量就是让我们在编写文件路径的时候来使用
		System.out.println("D:\\Java学习\\JAVA文件\\test.txt");
		//上面的错误也可以通过File类中的表示文件的路径分割符号的静态常量
		System.out.println("D:"+File.separator+"Java学习"+File.separator+"JAVA文件"+File.separator+"test.txt");
	}
}

在这里插入图片描述
 File类的构造方法
  File(String pathname) 通过给定的文件路径字符串创建新的 File实例。
  File(String parent, String child) 通过给定的文件位置字符串和给定的文件名称字符串创建新的 File实例。
  File(File parent, String child) 通过给定的文件位置File对象和给定的文件名称字符串创建新的 File实例。
例如:

package com.wangxing.zyb1;
import java.io.File;
public class FileTest2 {
	public static void main(String[] args)throws Exception {
		//File(String pathname) 通过字符串类型的文件/文件夹路径创建File对象
		String pathname="D:"+File.separator+"Java学习"+File.separator+"JAVA文件"+File.separator+"Test.txt";
		File file1=new File(pathname);
		//File(String parent, String child) 通过String的父目录,String的子文件创建File对象
		String parent="D:"+File.separator+"Java学习";
		String child="Test.txt";
		File file2=new File(parent,child);
		//File(File parent, String child) 通过File的父目录,String的子文件创建File对象
		String parent2="D:"+File.separator+"Java学习";
		File parentFile=new File(parent2);
		String child2="Test.txt";
		File file3=new File(parentFile,child2);
		//文件File类的对象创建以后,不会生成实际的文件/文件夹
	}
}
File类的实例方法
boolean	exists() 判断路径名表示的文件或目录是否存在。 
boolean	createNewFile() 创建新文件
boolean	mkdirs()  创建新的文件夹
boolean	delete()  删除文件/文件夹 删除文件夹的时候要将该文件夹下的文件和子文件夹全部删除
boolean	canRead() 判断文件是否可读
boolean	canWrite() 判断文件是否可写 
boolean	isHidden() 判断文件是否为隐藏文件。 
boolean	isFile() 判断文件对象是否为普通文件。 
boolean	isDirectory() 判断文件对象是否为目录。
String	getPath() 得到文件对象的路径名字符串。 
String	getName() 得到文件对象所表示的文件或目录的名称。 
String	getParent() 得到文件对象所表示的路径的父目录路径 
long	length() 得到文件对象所表示的文件的长度。 
long	lastModified() 得到文件对象所表示的文件上次修改的时间。 
String[]	list() 得到文件对象代表的文件夹中的所有文件和文件夹名称返回一个字符串数组
File[]	listFiles() 得到文件对象代表的文件夹中的所有文件和文件夹的文件对象,返回一个文件对象数组

例如:

package com.wangxing.zyb1;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
public class FileTest3 {
	public static void main(String[] args)throws Exception {
		String filepathname="D:"+File.separator+"Java学习"+File.separator+"JAVA文件"+File.separator+"Test.txt";
		File file=new File(filepathname);
		String dirpathname="D:"+File.separator+"Java学习"+File.separator+"JAVA文件"+File.separator+"Test";
		File dir=new File(dirpathname);
		//boolean	exists() 判断路径名表示的文件或目录是否存在
		//System.out.println("file--exists=="+file.exists());
		//System.out.println("file--exists=="+dir.exists());
		//boolean	createNewFile() 创建新文件
		System.out.println("createNewFile=="+file.createNewFile());
		//boolean	mkdirs()  创建新的文件夹
		System.out.println("mkdirs=="+dir.mkdir());
		//boolean	delete()  删除文件/文件夹[删除文件夹的时候要将该文件夹下的文件和子文件夹全部删除]
		//System.out.println("file--delete=="+file.delete());
		//System.out.println("dir--delete=="+dir.delete());
		//boolean	canRead() 判断文件是否可读
		//System.out.println("canRead=="+file.canRead());
		//boolean	canWrite() 判断文件是否可写 
		//System.out.println("canWrite=="+file.canWrite());
		//boolean	isHidden() 判断文件是否为隐藏文件。 
		//System.out.println("isHidden=="+file.isHidden());
		//boolean	isFile() 判断文件对象是否为普通文件。 
		//System.out.println("isFile=="+file.isFile());
		//System.out.println("isFile=="+dir.isFile());
		//boolean	isDirectory() 判断文件对象是否为目录
		//System.out.println("isDirectory=="+file.isDirectory());
		//System.out.println("isDirectory=="+dir.isDirectory());
		//String	getPath() 得到文件对象的路径名字符串。 
		//System.out.println("getPath=="+file.getPath());
		//String	getName() 得到文件对象所表示的文件或目录的名称。
		//System.out.println("getName=="+file.getName());
		//String	getParent() 得到文件对象所表示的路径的父目录路径 
		//System.out.println("getParent=="+file.getParent());
		//long	length() 得到文件对象所表示的文件的长度。
		//System.out.println("length=="+file.length()+"字符");
		//long	lastModified() 得到文件对象所表示的文件上次修改的时间。 
		//System.out.println("lastModified=="+file.lastModified());
		//Date date1=new Date(file.lastModified());
		//SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd E");
		//String  stringdate=sdf.format(date1);
		//System.out.println("stringdate=="+stringdate);
		//String[]	list() 得到文件对象代表的文件夹中的所有文件和文件夹名称返回一个字符串数组
		String dirpathname2="D:"+File.separator+"Java学习"+File.separator+"JAVA文件";
		File dir2=new File(dirpathname2);
		String filenames[]=dir2.list();
		for(String name:filenames) {
			System.out.println(name);
		}
		//File[] listFiles() 得到文件对象代表的文件夹中的所有文件和文件夹的文件对象,返回一个文件对象数组
		File files[]=dir.listFiles();
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd E hh:mm");
		for(File file2:files) {
			String name=file2.getName();
			Date date=new Date(file2.lastModified());
			String strdate=sdf.format(date);
			String filetype="";
			long len=0;
			if(file2.isDirectory()) {
				filetype="文件夹";
			}else {
				filetype="文本文档";
			}
		System.out.println(name+"\t"+strdate+"\t"+filetype+"\t"+len+"字符");
		}
	}
}

在这里插入图片描述
 1.输入输出流
  输入输出流–读写文件
  输入–从文件中获取数据到自己的程序中接受处理【读】
  输出–将自己的程序中处理好的数据保存到文件中【写】
  流----数据的移动轨迹
 2.流的分类
  按照数据的移动轨迹将流分为:输入流 输出流
  按照每一次读/写数据量的大小将流分为:字节流 字符流
  字节流:每一次可以读写一个字节的数据量,一个字节就是8位2进制,可以处理任何类型的文件【文本,图片,视频…】
  字符流: 每一次可以读写一个字符的数据量,一个字符就是16位2进制,只能处理文本类型的数据。
  详细划分: 字节输入流 字节输出流 字符输入流 字符输出流
 3.字节流相关类的使用
  字节输出流—OutputStream—抽象类—不能new—子类
  1.FileOutputStream类
  FileOutputStream类构造方法:
  FileOutputStream(File file) 通过File对象创建一个不可追加的字节输出流。
  FileOutputStream(File file, boolean append) 通过File对象创建一个是否追加的字节输出流。
  FileOutputStream(String name) 通过String 对象创建一个不可追加的字节输出流。
  FileOutputStream(String name, boolean append)通过String对象创建一个是否追加的字节输出流。
例如:

package com.wangxing.zyb2;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
public class FileOutputSteamTest1 {
	public static void main(String[] args)throws Exception {
		//FileOutputStream(File file)通过File对象创建一个字节输入流
		File file1=new File("D:"+File.separator+"Java学习"+File.separator+"JAVA文件"+File.separator+"Test.txt");
		FileOutputStream out1=new FileOutputStream(file1);
		OutputStream out11=new FileOutputStream(file1);
		//FileInputStream(String name) 通过String对象创建一个字节输入流
		FileOutputStream out2=new FileOutputStream(file1,true);
		OutputStream out22=new FileOutputStream(file1,true);
		//FileOutputStream(String name) 通过String 对象创建一个不可追加的字节输出流
		String filepath="D:"+File.separator+"Java学习"+File.separator+"JAVA文件"+File.separator+"Test.txt";
		FileOutputStream out3=new FileOutputStream(filepath);
		OutputStream out33=new FileOutputStream(filepath);
		//创建输入输出流对象的时候,会自动创建出实体文件
	}
}
FileOutputStream类实例方法:
void	write(byte[] b) 将 b.length个字节从指定的字节数组写入此文件输出流。 
void	write(byte[] b, int off, int len) 将 len字节从位于偏移量 off的指定字节数组写入此		文件输出流。 
void	write(int b) 将指定的字节写入此文件输出流。 
void	close() 关闭此文件输出流并释放与此流相关联的任何系统资源。

例如:

package com.wangxing.zyb2;
import java.io.File;
import java.io.FileOutputStream;
public class FileOutputSteamTest2 {
	public static void main(String[] args)throws Exception {
		File filepath=new File("D:"+File.separator+"Java学习"+File.separator+"JAVA文件"+File.separator+"Test.txt");
		FileOutputStream out1=new FileOutputStream(filepath,true);
		String info="hello,world";
		//void write(byte[] b) 将b.length个字节从指定的字节数组写入此文件输出流
		//byte infobyte[]=info.getBytes();
		//out1.write(infobyte);
		//out1.close();
		//void	write(byte[] b, int off, int len) 将 len字节从位于偏移量 off的指定字节数组写入此文件输出流。 
		//byte[] b--被写出的字节数组
		//int off---被写出的字节数组数据的起始位置
		//int len---被写出的字节数组数据的个数
		//byte infobyte[]=info.getBytes();
		//out1.write(infobyte,0,5);
		//out1.close();
		//void	write(int b) 将指定的字节写入此文件输出流。
		byte infobyte[]=info.getBytes();
		for(byte by:infobyte) {
			out1.write(by);
		}
		out1.close();
	}
}

2.DataOutputStream类
  DataOutputStream类的构造方法
  DataOutputStream(OutputStream out) 创建一个新的数据输出流,以将数据写入指定的底层输出流。
例如:

package com.wangxing.zyb2;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
public class DateOutputStreamTest1 {
	public static void main(String[] args)throws Exception {
		//DataOutputStream(OutputStream out) 创建一个新的数据输出流,以将数据写入指定的底层输出流
		File file=new File("D:"+File.separator+"Java学习"+File.separator+"JAVA文件"+File.separator+"Test.txt");
		OutputStream out=new FileOutputStream(file,true);
		DataOutputStream dataout1=new DataOutputStream(out);
		FileOutputStream fileout=new FileOutputStream(file,true);
		DataOutputStream dataout2=new DataOutputStream(fileout);
		DataOutputStream dataout3=new DataOutputStream(new FileOutputStream(new File("D:"+File.separator+"Java学习"+File.separator+"JAVA文件"+File.separator+"Test.txt")));	
	}
}
DataOutputStream类的实例方法
void	writeBoolean(boolean v) 将 boolean写入底层输出流作为1字节值。 
void	writeByte(int v) 将 byte作为1字节值写入底层输出流。 
void	writeChar(int v) 将 char写入底层输出流作为2字节值,高字节优先。 
void	writeDouble(double v) 双参数传递给转换 long使用 doubleToLongBits方法在类 Double ,		然后写入该 long值基础输出流作为8字节的数量,高字节。 
void	writeFloat(float v) 浮子参数的转换 int使用 floatToIntBits方法在类 Float ,然后写入		该 int值基础输出流作为一个4字节的数量,高字节。 
void	writeInt(int v) 将底层输出流写入 int作为四字节,高位字节。 
void	writeLong(long v) 将 long写入底层输出流,为8字节,高字节为首。 
void	writeShort(int v) 将 short写入底层输出流作为两个字节,高字节优先。 
void	writeUTF(String str) 使用 modified UTF-8编码以机器无关的方式将字符串写入基础输出流
void	flush() 刷新此数据输出流。 
void	close() 关闭此输出流并释放与此流相关联的任何系统资源。 

例如:

package com.wangxing.zyb2;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
public class DateOutputStreamTest2 {
	public static void main(String[] args)throws Exception {
		/*
		void	writeBoolean(boolean v) 将 boolean写入底层输出流作为1字节值。 
		void	writeByte(int v) 将 byte作为1字节值写入底层输出流。 
		void	writeChar(int v) 将 char写入底层输出流作为2字节值,高字节优先。 
		void	writeDouble(double v) 双参数传递给转换 long使用 doubleToLongBits方法在类 Double ,然后写入该 long值基础输出流作为8字节的数量,高字节。 
		void	writeFloat(float v) 浮子参数的转换 int使用 floatToIntBits方法在类 Float ,然后写入	该 int值基础输出流作为一个4字节的数量,高字节。 
		void	writeInt(int v) 将底层输出流写入 int作为四字节,高位字节。 
		void	writeLong(long v) 将 long写入底层输出流,为8字节,高字节为首。 
		void	writeShort(int v) 将 short写入底层输出流作为两个字节,高字节优先。 
		void	writeUTF(String str) 使用 modified UTF-8编码以机器无关的方式将字符串写入基础输出流
		void	flush() 刷新此数据输出流。 
		void	close() 关闭此输出流并释放与此流相关联的任何系统资源。
		*/
		File file=new File("D:"+File.separator+"Java学习"+File.separator+"JAVA文件"+File.separator+"Test.txt");
		OutputStream out=new FileOutputStream(file,true);
		DataOutputStream dataout=new DataOutputStream(out);
		int id=1001;
		String name="zhangsan";
		boolean sex=true;
		double hei=175.5;
		dataout.writeUTF(name);
		dataout.writeBoolean(sex);
		dataout.writeDouble(hei);
		dataout.flush();
		dataout.close();
	}
}

优点:可以直接写出基本数据类型的数据和String,且不需要转换成字节数组
缺点:保存到文件中的数据是乱码
字节输入流—InputStream—抽象类—不能new—子类
 1.FileInputStream类
  FileInputStream类构造方法:
  FileInputStream(File file) 通过File对象创建一个字节输入流
  FileInputStream(String name) 通过String对象创建一个字节输入流
例如:

package com.wangxing.zyb2;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
public class FileInputStreamTest1 {
	public static void main(String[] args)throws Exception {
		//FileInputStream(File file) 通过File对象创建一个字节输入流
		File file=new File("D:"+File.separator+"Java学习"+File.separator+"JAVA文件"+File.separator+"Test.txt");
		FileInputStream in1=new FileInputStream(file);
		InputStream in11=new FileInputStream(file); 
		//FileInputStream(String name) 通过String对象创建一个字节输入流
		String filepath="D:"+File.separator+"Java学习"+File.separator+"JAVA文件"+File.separator+"Test.txt";
		FileInputStream in2=new FileInputStream(filepath);
		InputStream in22=new FileInputStream(filepath);
	}
}

FileInputStream类实例方法
  int read() 从该输入流读取一个字节的数据。
  返回值:读取到的具体字节数据的int型,如果到达文件末尾返回-1
  int read(byte[] b) 从该输入流读取最多 b.length个字节的数据为字节数组。
  返回值:读取的总字节数, 如果到达文件末尾返回-1
  void close() 关闭此文件输入流并释放与流相关联的任何系统资源。
例如:

package com.wangxing.zyb2;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
public class FileInputStreamTest2 {
	public static void main(String[] args)throws Exception {
		File file=new File("D:"+File.separator+"Java学习"+File.separator+"JAVA文件"+File.separator+"Test.txt");
		FileInputStream in1=new FileInputStream(file);
		//int	read() 从该输入流读取一个字节的数据。 
		//返回值:读取到的具体字节数据的int型,如果到达文件末尾返回-1
		//int val=in1.read();
		//byte by=(byte)val;
		//String strval=String.valueOf(by);
		//System.out.println("strval=="+strval);
		//in1.close();
		//保存读取以后的数据的字节数组
		//byte bytearray[]=new byte[(int)file.length()];
		//数组下标
		//int index=0;
		//保存读取的单个数据
		//int temp=0;
		//while((temp=in1.read())!=-1) {
		//	bytearray[index]=(byte)temp;
		//	index++;
		//}
		//String info=new String(bytearray,0,index);
		//System.out.println(info);
		//in1.close();
		//int	read(byte[] b) 从该输入流读取最多 b.length个字节的数据为字节数组。
		//返回值:读取的总字节数, 如果到达文件末尾返回-1
		//保存读取以后的数据的字节数组
		byte bytearray[]=new byte[(int)file.length()];
		int length=in1.read(bytearray);
		String info=new String(bytearray,0,length);
		System.out.println(info);
		in1.close();
	}
}

在这里插入图片描述
 2.DataInputStream类
  DataInputStream类构造方法
  DataInputStream(InputStream in)创建使用指定的底层InputStream的DataInputStream。

例如:

package com.wangxing.zyb2;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
public class DateInputStreamTest1 {
	public static void main(String[] args)throws Exception {
		//DateInputStream(InputStream out) 创建使用指定的底层InputStream的DataInputStream
		File file=new File("D:"+File.separator+"Java学习"+File.separator+"JAVA文件"+File.separator+"Test.txt");
		InputStream in=new FileInputStream(file);
		DataInputStream datain1=new DataInputStream(in);
		FileInputStream filen=new FileInputStream(file);
		DataInputStream datain2=new DataInputStream(filen);
		DataInputStream datain3=new DataInputStream(new FileInputStream(new File("D:"+File.separator+"Java学习"+File.separator+"JAVA文件"+File.separator+"Test.txt")));	
	}
}

DataInputStream类实例方法
  boolean readBoolean()
  byte readByte()
  char readChar()
  double readDouble()
  float readFloat()
  int readInt()
  long readLong()
  short readShort()
  String readUTF()
  void close()
例如:

package com.wangxing.zyb2;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
public class DateInputStreamTest2 {
	public static void main(String[] args)throws Exception {
		File file=new File("D:"+File.separator+"Java学习"+File.separator+"JAVA文件"+File.separator+"Test.txt");
		InputStream in=new FileInputStream(file);
		DataInputStream datain1=new DataInputStream(in);
		int id=datain1.readInt();
		//String name=datain1.readUTF();
		boolean sex=datain1.readBoolean();
		double hei=datain1.readDouble();
		System.out.println(id+"\t"+sex+"\t"+hei);
		datain1.close();
		in.close();
	}
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值