JAVA IO操作

在程序IO操作时,最常用的输出操作为:PrintWriter/PrintStream;最常用的输入操作是Scanner
在文件操作中,主要使用的类有:

  • 文件操作类:File
  • 流操作类:InputStream,OutputStream,Writer,Reader
  • 接口:Serializable
    IO类结构为:
    在这里插入图片描述

File类

File本身不是抽象类,它是唯一一个与文件本身操作有关的类(文件的创建,删除,目录的创建与删除)与文件内容本身无关。

构造方法:

1、设置操作完成路径:public File(String pathname)
2、设置福路经与子文件:public File(File parent ,String child)(通常用于android中)

注:文件路径用“/”或“\”都可

一般方法:

1、创建新文件:public boolean createNewFile()throws IOException[如果创建成功,则返回true,若文件已存在,则返回false]
2、public boolean exists():判断文件是否存在
3、public boolean delete():删除文件
4、取得路径的父目录:public File getParentFile()
5、创建父目录:public Boolean mkdirs()[创建多级父目录] /public Boolean mkdir()[创建一级父目录]
6、public Boolean isFile();判断是否为文件(不仅为txt)
7、Public Boolean isDirectory():判断是否为目录
8、Public long lastModified():获取最后一次修改日期
9、Public long length():获取文件的大小(以字节)

注:在java中,若没有目录,问价就无法创建,必须先存在目录后,才能创建文件

eg:

public static void main(String args[]) throws Exception{ 
		
		File f=new File("D:/hello1/hello2/hello.txt");
		if(!f.getParentFile().exists()) { //判断父目录是否存在,不存在则进行创建
			f.mkdirs();
			System.out.println("父目录被创建");
		}else {
			System.out.println("父目录已存在");
		}
		if(f.exists()) { //判断为念是否存在,存在则进行删除,不存在则进行创建
			f.delete();
			System.out.println("文件被删除");
		}else {
			f.createNewFile();
			System.out.println("文件被创建");

字节流(Byte)与字符流(Char)

字节流:InputStream(字节输入流),outputStream(字节输出流)
字符流:Reader(字符输入流),Writer(字符输出流)

OutputStream

OutputStream是一个抽象类,在使用时,需要FileOutputStream进行实例化,所以,写文件是以 字符数组 加载到文件中,其同时继承了flushable与closable接口

构造方法:

1、FileOutputStream(String name) 创建文件输出流以指定的名称写入文件。
2、FileOutputStream(String name, boolean append):创建文件输出流以指定的名称写入文件.(追加文件)
3、FileOutputStream(File file)(覆盖文件)
4、FileOutputStream(File file,Boolean append)(追加文件)

一般方法:

1、close()
2、flush()
3、输出操作 (输出的数组必须为字节数组的形式, “\r\n”表示换行)
Public abstract void write(int b)throws IOException:输出单个字节
Public void write(byte[] b)throws IOException:输出全部字节数组
Public void write(byte[] b,int off,int len)throws Exception:输出部分字节数组

InputStream

InputStream同样为一个抽象类,其实现需要实例化FileInputStream,

构造方法:(在本质上并未有所不同,File只是可以进行文件的操作)

1、FileInputStream(File file):通过打开与实际文件的连接创建一个 FileInputStream ,该文件由文件系统中的 File对象 file命名。
2、FileInputStream(String name):通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名 name命名。

一般方法:

1、文件的读取 (也必须为字节数组)
Public abstract int read()throws IOException:读取单个数据(读取的为数据,返回的是文件对应内容的int格式,有可能是某种编码),若再没有数据,则返回-1
Public int read(byte[] b)throws IOException:读取数据到字节数组中,返回的读取的长度(若读取的内容小于数组的内容,正常读取,返回的为内容的长度.若没有数据,返回-1)
Public int read(byte[] b,int off ,inr len)throws IOException:读取内容到部分字节数组中,只允许读取满限制的数组的字节数组,返回的为读取的长度
eg:

public static void main(String args[]) throws Exception{ 
		
		File f=new File("D:/hello1/hello2/hello.txt");
		if(!f.getParentFile().exists()) { //判断父目录是否存在,不存在则进行创建
			f.mkdirs();
			System.out.println("父目录被创建");
		}else {
			System.out.println("父目录已存在");
		}
		InputStream is=new FileInputStream(f);
		//方法一
		byte[] bytes=new byte[1024];  //可以进行循环
//		int len=is.read(bytes);
//		System.out.println("内容为"+new String(bytes,0,len));//以去除空格,byte[]不是java自带的类型,所以当未重写toString()时,返回的是地址码
		
		int foot=0;
		int temp;
		while((temp=is.read())!=-1) {
			bytes[foot++]=(byte)temp;
		}
		System.out.println("内容为"+new String(bytes,0,foot));//以去除空格,

Writer:

其最适合操作中文,进行字符串的直接输出。writer本身为抽象类,需要用子类FileWriter进行实例化。

Writer的构造方法:

FileWriter(File file):给一个File对象构造一个FileWriter对象。
FileWriter(File file, boolean append) :一个File对象构造一个FileWriter对象。
FileWriter(String fileName):构造一个给定文件名的FileWriter对象。
FileWriter(String fileName, boolean append) :造一个FileWriter对象,给出一个带有布尔值的文件名,表示是否附加写入的数据。

一般方法:

Public void write(String str,[int off, int len]):写一个字符串的一部分
public void write( char[] cbuf, int off, int len):写入字符数组的一部分。

Reader

其与Writer相似,但其只能输入char数组(字符数组)不能直接接受字符串形式

字节流与字符流的区别

任何终端读取或输入的一定为字节,所以字符流使用到了缓冲区(进行了字节与字符的转换),而字节流为用到缓冲区
字符流的原理:
字符输入/输出:字节(磁盘)》自动转换》字符(内存) /字符(内存)>自动转换》字节(磁盘)
利用字符流进行输出的时候,所有内容只输出到缓冲区中,使用close时才对缓冲区进行输出,若没有关闭,则无法进行输出,可以使用flush()进行强制刷新至磁盘中,

字节流与字符流的转换

利用InputStreamReader与OutputStreamWriter来进行转换。InputStreamReader可以接收InputStream类对象,进而向上转型为Reader类对象 (读取字节而使用是定的charset进行解析) ;OutputStreamWriter同理。
构造方法:
InputStreamReader(InputStream in) 创建一个使用默认字符集的InputStreamReader
InputStreamReader(InputStream in, String charsetName) 创建一个使用命名字符集的InputStreamReader。
一般方法:
public int read(char[] cbuf,int offset,int length)throws IOException:将字符读入数组的一部分。
OutputStreamWriter同理,利用OutputStreamWriter可以接收OutputStream类对象,进而想上转型为Writer类对象

其他操作流

内存操作流

程序 > inputStream >内存
内存 >OutputStream >程序
字符操作流:CharArrayReader,CharArrayWriter
字节操作流:ByteArrayInputStream,ByteArrayOutputStream
ByteArrayInputStream构造方法:
ByteArrayInputStream(byte[] buf) 创建一个 ByteArrayInputStream ,使其使用 buf作为其缓冲区数组。
ByteArrayInputStream(byte[] buf, int offset, int length) 创建 ByteArrayInputStream使用 buf作为其缓冲器阵列。
一般方法:
read()
ByteArrayOutputStream构造方法:
public ButeArrayOutputStream()
一般方法:write()方法(接收byte[]形式) 【可通过toByteArray()将字符串转化为byte[]数组】

打印流(最常用)

PrintStream(字节打印流).PrintWriter(字符打印流)
PrintStream可接受OutputStream
PrintWriter可接受OutputStream,Writer等

缓冲流

BufferedReader为字符流,是reader的子类

构造方法:

public BufferedReader(Reader in)

读取方法:

public String readLine()throws IOException;
可以实现大文本的读取

Scanner

构造方法:

Scanner(File source) 构造一个新的 Scanner ,产生从指定文件扫描的值。
Scanner(InputStream source) 构造一个新的 Scanner ,产生从指定输入流扫描的值。

一般方法:

hasNextxxx().nextxxx(),默认以空格或换行符作为结束的标志,
可以利用useDelimiter(xx)来修改换行符
eg:

public static void main(String args[]) throws FileNotFoundException{
		Scanner scanner=new Scanner(new FileInputStream(new File("C:\\Users\\15141\\Desktop\\dataset\\Char_INdex.txt")));//用scanner进行输入,其构造可以接收File,InputStream,FileWriter等
		scanner.useDelimiter("\n");  //必不可少,否则则默认以空格为换行符
		while(scanner.hasNext()) {
			System.out.print(scanner.next());//在不能进行println
		}
		scanner.close();
	}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值