一个用来对文件、文件夹(目录)创建、删除、遍历等操作的类
- public class BaseTest {
- public static void main(String[] args) {
- //==================File 四个静态属性==================
- //字符串形式的名称分隔符win是\ linux是/
- String separator = File.separator;
- //字符形式的名称分隔符win是\ linux是/
- char separatorChar = File.separatorChar;
-
- //字符串形式的路径分隔符win是; linux是:
- String pathSeparator = File.pathSeparator;
- //字符形式的路径分隔符win是; linux是:
- char pathSeparatorChar = File.pathSeparatorChar;
-
- //=================File 四个构造方法=======================
- File file = new File("D"+ File.pathSeparator +File.separator+"jks");
- File file1 = new File(file,"test.txt");
- File file2 = new File("D:","jsk");
-
- //================file 常用成员方法=======================
- //创建文件
- boolean newFile = file.createNewFile();
- //创建文件夹(mkdirs递归创建)
- file.mkdir();
- file.mkdirs();
- boolean exists = file.exists();
- //删除
- file.delete();
- //目录递归遍历
- readFile(file);
- }
- public static void readFile(File file){
- File[] files = file.listFiles();
- for (int i = 0; i < files.length; i++) {
- if(files[i].isDirectory()){
- readFile(files[i]);
- }else {
- System.out.println(files[i].getPath());
- }
- }
- }
- }
pathSeparator、separator区别:
File.pathSeparator指的是分隔连续多个路径字符串的分隔符,例如:
java -cp test.jar;abc.jar HelloWorld
就是指“;”
File.separator才是用来分隔同一个路径字符串中的目录的,例如:
C:\Program Files\Common Files
就是指“\”
java中的数据是以流的方式传递,也就是二进制方式传递,有字节和字符流;分为输出输入流两种,出入(写读)都是相对内存而言的,即输出指的是吧数据从内存写到磁盘,输入指的是把数据从磁盘读入内存
代码区分
- public static void main(String[] args) throws IOException {
- File file= new File("d:"+File.separator+"test.txt");
- String str = "hello world";
-
- //=====================字节流使用=====================
- FileOutputStream outputStream = new FileOutputStream(file);
- outputStream.write(str.getBytes());//字节流只能操作字节,将数据从内存输出(写入)磁盘
- outputStream.close();
-
- //=====================字符流使用=====================
- FileWriter writer = new FileWriter(file);
- writer.write(str);//字符流直接对字符操作 将数据从内存输出(写入)磁盘
- /**关闭之后才会将数据写入,没有这句文件没有内容,因为字符流内容还在缓冲区,
- * 只有调用close会强制刷新缓冲区数据进行输出,如果想在不关闭时也可以将
- * 字符流的内容全部输出,则可以使用Writer类中的flush()方法完成*/
- writer.close();
- }
字节流的两个顶层inputStream、 outputStream 都是抽象类,不能直接new,由其子类实现各种文件输出输入
字符流的两个顶层父类Reader和Writer都是抽象类,不能直接new
备注:flush()和close()区别
flush()将缓冲区的数据刷新到目的地,刷新后流还可以继续使用
close()关闭资源,但在关闭前会将缓冲区的数据先刷先到目的地,然后关闭,关闭之后不可使用,如果写入数据过多,一定要一边写一边刷新 最后一次可以不用刷新,由close完成刷新并关闭
只有writer的子类才使用flush()
OutputStreamWriter(Outputstream in)//给一个字节输出流的子类 FileOutputStream
OutputStreamWriter(Outputstream in ,charset s)//给一个字节输出流的子类,并且指定编码集 如果不给出 默认是gbk
InputStreamReader(inputstream out)//给一个字节输入流子类 如FileInputStream
InputStreamReader(inputstream out ,charset s)//给一个字节输入流子类,并且指定编码集 如果不给出 默认是gbk
总结
缓冲流是为了提高java中io流的传输效率,有字节缓冲流 字符缓冲流,字节缓冲流本身没有传输流的能力,而是依靠一起流,对其提高效率,
如果将一个对象写入到本地文件中,被称为对象的序列化
如果将一个本地文本中的对象读取出来,被称为对象反序列化
注意:
1.要实现类的对象的序列化,首先本来要实现implements Serializable
2.一个对象流只能操作一个对象,如果试图采用一个对象流操作多个对象的话,会出现EOFException【文件意外达到了文件末尾】。如果向将多个对象序列化到本地,可以借助于集合,【思路:将多个对象添加到集合中,将集合的对象写入到本地文件中,再次读出来,获取到的仍然是集合对象,遍历集合】
3.对象序列化和反序列化的时候需要注意,序列化的时候有一个
private static final long serialVersionUID = 1L;
其中serialVersionUID的值是一个任意的整数,序列化和反序列化的时候这个数必须一致,否则将不能反序列化。会报错:
java.io.InvalidClassException: demo_0806.Student; local class incompatible: stream classdesc serialVersionUID = 1, local class serialVersionUID = 2
向内存写数据
ByteArrayInputStream bis = new ByteArrayInputStream(t.getBytes());
读取内存里面的数据
ByteArrayOutputStream bos = new ByteArrayOutputStream();
案列:
String t = "大家好!"; //通过ByteArrayInputStream的构造方法向内存中写入数据 ByteArrayInputStream bis = new ByteArrayInputStream(t.getBytes()); //创建读内存的流 ByteArrayOutputStream bos = new ByteArrayOutputStream(); int temp=0; while((temp=bis.read())!=-1){//注意这里是bis不是bos char c=(char)temp; bos.write(Character.toUpperCase(c));// toUpperCase(c)转成大写 } System.out.print(bos.toString()); bis.close(); bos.close();
平时我们在控制台打印输出,是调用 print 方法和 println 方法完成的,这两个方法都来自于java.io.PrintStream 类,该类能够方便地打印各种数据类型的值,是一种便捷的输出方式。
public static void main(String[] args) throws FileNotFoundException { //系统默认流向是控制台 System.out.println("hello"); PrintStream printStream = new PrintStream("d:"+File.separator+"test.txt"); //改变默认流向输出 System.setOut(printStream); System.out.println("hello ..."); }
1、首先决定要操作的是字符还是字节
2、其次决定要不要转字符
3、然后决定用不用转换字符提高速率
4、操作对象使用ObjectInputStream和ObjectOutputStream