Java学习——blog 7

目录

输入输出流

File类

File对象构造方法:

文件的属性

目录

文件的创建与删除

运行可执行文件

文件字节输入流

文件字节输出流

文件字符输入、输出流

扫描二维码关注公众号,回复: 15260548 查看本文章

缓冲流

随机流

相关构造器与方法:

读写方法:

相关方法:

数组流

数据流

对象流

序列化与对象克隆

使用Scanner解析文件

文件对话框

带进度条的输入流

文件锁

知识点小结

参考


输入输出流

File类

用来获取文件本身的一些信息,不涉及对文件的读写操作。

File对象构造方法:

  • File(String filename);//文件名
  • File(String directoryPath,String filename);//文件路径
  • File(File dir,String filename); //目录

文件的属性

获取文件信息常用方法:

public String getName()获取文件的名字
public boolean canRead()判断文件是否可读
public boolean canWrite()判断文件是否可被写入
public boolean exists()
public long length()
public String getAbsolutePath()
public String getParent()获取文件的父目录
public Boolean isFile()判断文件是否是一个普通文件,而不是目录。
public boolean isDirectory()
public boolean isHidden()
public long lastModified()获取文件最后修改的时间

目录

创建目录

public boolean mkdir()

创建成功返回true,否则返回false(若目录已存在返回false)

列出目录中的文件

public String[] list()返回文件名(字符串形式)
public File[]listFiles()用File对象形式返回目录下指定类型的全部文件


public String[] list(FilenameFilter obj)                        字符串形式返回
public File [] listFiles(FilenameFilter obj)                   File对象形式返回

FilenameFilter接口

public boolean accept(File dir,String name);

辨析

"."当前目录
"…"上一级目录

文件的创建与删除

File file=new File(“C:\myletter”,“letter.txt”);
public boolean createNewFile();
file.delete();

运行可执行文件

Runtime ec;
ec=Runtime.getRuntime();//创建一个进程

文件字节输入流

源->创建输入流->读取->关闭输入流

​ ① 建立一个文件输入流in:File f = new File("Hi.java"); InputStream in = new InputStream(f);

​ ② 使用输入流读取字节:in.read(byte b[],in off,int len);//读取len字节存到数组off开始的位置

 //read方法返回一个值:实际读取的字节数目

​ ③ 关闭流:in.close();

构造方法:

FileInputSteam(String name);//有看不见的文件列表
FileInputStream(File file);

使用输入流读取字节

int read()
int read(byte)
int read(byte b[ ],int off,int len)
//off偏移量

关闭流

close()

覆盖式vs追加式

覆盖式 清空
追加式 在文件尾写
类比C语言w/a

import java.io.*;
public class Solution{undefined
public static void main(String arg[]){undefined
int n=1;
byte[] a=new byte[100];
try{undefined
File f=new File(“Solution.java”);//建立输入流
InputStream in= new FileInputStream(f);//in对象文件与输入流关联
while(n=in.read(a,0,100))!=-1{undefined
String s=new String(a,0,n);//利用循环读取
}
in.close();//关闭输入流
catch(IOException e){undefined
System.out.println(“File read Error”+e);
        }
    }
}

文件字节输出流

① 创建文件字节输出流:File f = new File("a.txt"); OutputStream out = new OutputStream(f);

​ ② 使用输出流输出字节:out.write(int n);//向目的地写入单个字节 out.write(byte b[]);//写入一个字节数组

​ out.write(byte b[],int off,int len);//从数组b下标off处取len个字节写到目的地

​ ③ out.close()//关闭输出流

Tips:如果在关闭流后还想继续在此文件输出,则继续创建OutputStream对象,只不过(f)变为(f,true)//不刷新

文件字符输入、输出流

① 创建流:File f1 = new File("a.txt"); File f2 = new File("b.txt");

​ Writer out = new FileWriter(f2,true); Reader in = new FileReader(f1);

​ ② 操作read()和write()方法进行操作

​ ③ 刷新缓存并关闭流:out.flush(); out.close();
 

out.flush();

强制刷新
数据在流中(内存中),还未保存到文件中,直接关闭可能会导致问价写入不完全。而flush这个操作读文件时不用。
flush()强制把流中的数据输入到文件中,保证文件写入操作绝对完成。

缓冲流

相关构造器与方法:

  • 输入流:BufferedReader(Reader in);
  • 读取方法:readLine(); 读取文本行
  • 相关方法:newLine(); 向文件写入一个回行符
  • 关闭流:close();
  • 输出流:BufferedWriter(Writer out);
  • 写入方法:write(String s,int off,int len); 把字符串s写到文件中
  • 关闭流:close();

流中嵌套流,简化操作
readline()
一个字节一个字节地读,直到换行为止
BufferedReader(Reader in);
BufferedWriter(Reader out);

随机流

相关构造器与方法:

**随机流:**RandomAccessFile(File file,String mode);

读写方法:

(1)八种基本类型数据对应的读/写方法

  • boolean readBoolean() void writeBoolean(boolean b)
  • byte readByte() void writeByte(int n)
  • char readChar() void writeChar(int n)
  • short readShort() void writeShort(int n)
  • int readInt() void writeInt(int n)
  • long readLong() void writeLong(long l)
  • float readFloat() void writeDouble(double d)
  • double readDouble() void writeFloat(float f)
  • int read() void write(int n)
  • int readUnsignedByte() int readUnsignedShort()

(2)字节数组、字符串及其他方式的读写方式

  • int read(byte[] b) / void write(byte[] b) 读/写一个字节数组。
  • int read(byte[] b,int off,int len) / void write(byte[] b,int off,int len) 从数组的off位置开始,读/写len个字节。
  • String readUTF() / void writeUTF(String s) 以与机器无关的UTF-8编码方式把str写入文件。
  • String readLine() 从文本文件中读入一行。
  • void writeChars(String s) 以字符方式写入一个字符串。
  • void writeBytes(String s) 以字节方式写入一个字符串。

相关方法:

(3)有关文件位置方法

  • long getFilePointer() 获得文件的当前位置。
  • void seek(long pos) 定位文件到pos位置。
  • int skipBytes(int n) 从当前位置跳过n个字节。

(4)其他方法

  • void setLength(long newLength) 设置文件长度。
  • long length() 获得文件的长度。
  • void close() 关闭文件。
  • FileChannel getChannel() 获得与该流连接的文件通道对象。
  • FileDescriptor getFD() 获得与该流连接的文件描述符对象。

数组流

输入的数据为字节型
读取数据为一个字节一个字节地读

流的源和目的地除了可以是文件外,还可以是计算机内存;

字节数组流:

 字节数组输入流ByteArrayInputStream和字节数组输出流ByteArrayOuputStream 分别使用字节数组作为流的源和目的地,构造方法如下:

  • ByteArrayInputStream(byte [] buf);
  • ByteArrayInputStream(byte [] buf,int offest,int length);

第一个构造方法的构造的字节数组的源是参数buf指定的数组的全部字节单元;第二个构造方法构造的字节数组的源是buf指定的数组从offset 处按顺序取得length个字节单元。

其常用的方法有:

  • public int read(); 顺序地从源中读出一个字节;
  • public int read(byte [] b,int off,int len)顺序地从源中读出参数len指定的字节数;

字节数组输出流的构造方法及常用方法:

ByteArrayOuputStream();
ByteArrayOuputStream(int size);
public void write(int b);  //顺序向缓冲区写入一个字节
public void write(byte[] b,int off,int len);  //将参数b中指定的len个字节顺序写入缓冲区
public byte[] toByteArray(); //返回输出流写入到缓冲区的全部字节

第一个构造方法构造的字节数组输出流指向一个默认大小为32字节的缓冲区,如果输出流向缓冲区写入的字节个数大于缓冲区时,缓冲区的容量会自动增加;第二个构造方法构造的字节数组输出流指向的缓冲区的初始大小由参数size决定,如果输出流向缓冲区写入的字节个数大于缓冲区时,缓冲区容量会自动增加。

字符数组流:

与字节数组流对应的字符数组流CharArrayReader 和CharArrayWriter 类,字符数组流分别使用字符数组作为流的源和目标。

数据流

DataInputStream和DataOutputStream类创建的对象称为数据输入流和数据输出流

构造方法:

  • DataInputStream(InputStream in)创建的数据输入流指向一个由参数in指定的底层输入流
  • DataOutputStream(OutputStream out)创建的数据输出流指向一个由参数out指定的底层输出流

对象流

构造方法

  • ObjectInputStream(InputStream in);对象的输入流
  • ObjectOutputStream(OutputStream out) 对象的输出流

相关方法

  • writeObject(Object obj) 将一个对象obj写入到一个文件;
  • readObject() 读取一个对象到程序中

序列化与对象克隆

一个类如果实现了Serializable接口,那么这个类创建的对象就是所谓序列化的对象

一个对象调用clone()方法就可以获取该对象的克隆对象

对象输入流通过对象的序列化信息来得到当前对象的一个克隆

使用Scanner解析文件

使用Scanner类和正则表达式来解析文件

基本使用框架:

File file = new File("hello.java");
Scanner sc = new Scanner(file);
sc.useDelimiter(正则表达式);

文件对话框

文件对话框是一个选择文件的界面,javax.swing包中的JFileChooser 类可以创建文件对话框,使用该类的构造方法JFileChooser() 创建初始不可见的有模式文件对话框

文件对话框调用下述2个方法:

  • showSaveDialog(Component a);

  • showOpenDialog(Component a);

二者皆可以让对话框可见,不过外观有所不同;showSaveDialog方法提供保存文件的界面,showOpenDialog方法提供打开文件的界面。上述两个方法中的参数a指定对话框可见时的位置,当a是null时,文件对话框出现在屏幕的中央;如果组件a不空,文件对话框在组件a的正前面居中显示。

带进度条的输入流

如果读取文件时希望看见文件的读取进度可以使用javax.swing包提供的输入流类:

ProgressMonitorInputStream。

构造方法:

  • ProgressMonitorInputStream(Conmponent c,String s,InputStream);

/*该类创建的输入流在读取文件时会弹出一个显示读取速度的进度条,进度条在参数c指定的组件的正前方显示,若参数c取null,则在屏幕正前方显示。*/

文件锁

文件锁是为了解决由几个程序处理同一个文件时可能出现的混乱。

FileLock、FileChannel类处理Java提供的文件锁功能。它们分别在java.nio和java.nio.channels包中。

输入、输出流读写文件时可以使用文件锁。 如果创建的流在读写文件时使用了文件锁,那么只要不解除文件锁,其他程序无法操作被锁定的文件。
 

知识点小结

1、BufferedWriter流可以指向FileWriter流。

2、FileOutputStream输出流按字节写出数据。

3、如果程序要写入一个文件,可以创建指向文件的FileWriter输出流。

4、创建FileInputStream 对象,即文件字节输入流可能触发FileNotFoundException异常。

5、FileNotFoundException类是IOException类的子类。

6、FileInputStream流的int read(byte b[]) 方法从源中试图读取b.length个字节到字节数组b中,返回实际读取的字节数目。如果到达文件的末尾,则返回-1。

7、BufferedReader流的源必须是字符输入流(FileReader)。

8、FileOutputStream流顺序地写文件,只要不关闭流,每次调用write方法就顺序地向目的地写入内容,直到流被关闭。

9、FileInputStream流顺序地读取文件,只要不关闭流,每次调用read方法就顺序地读取源中其余的内容,直到源的末尾或流被关闭。

参考

《Java 2实用教程(第5版)》

猜你喜欢

转载自blog.csdn.net/K_savo/article/details/123032390
今日推荐