JAVA-ios流与文件编写

IO流与文件读写

学习目标
掌握File类的常用方法
掌握文件读写操作
掌握字节流与字符流的区别
文件读写
Java中通过流来读写文件,流是指一连串流动的字符,是以先进先出方式发送信息的通道。

输入/输出流与数据源:

Java流的分类:

输入输出流是相对于计算机内存来说的。

字节流与字符流的区别
字符流的底层就是字节流。而字符流主要是读取文本文件内容的,可以一个字符一个字符的读取,也可以一行一行的读取文本文件内容,而字节流读取单位为byte。byte作为计算机存储最基本单位,可以用字节流来读取很多其他格式的文件,比如图片视频等等。基于B/S和C/S的文件传输都可以采用字节流的形式。在读写文件需要对内容按行处理,比如比较特定字符,处理某一行数据的时候一般会选择字符流。只是读写文件,和文件内容无关的,一般选择字节流。
字节流就是按照字节来进行传输,字符流是按照字符来传输.最基本的是字节流,字符流可以说是对字节流的一个包装流,比如你知道了一个字符是8个字节,那么你让字节流一次传输8个字节,那不就相当于一次传输一个字符,也就是字符流了。

字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢?
实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件,如图:

下面以两个写文件的操作为主进行比较,但是在操作时字节流和字符流的操作完成之后都不关闭输出流。
范例:使用字节流不关闭执行:
// 通过字节流 写文件
public static void ByteWrite() {
File file = new File(“d:\test\test.txt”);
try {
OutputStream outputStream = new FileOutputStream(file);
String textString = “Hello World!!!”;
byte[] data = textString.getBytes();
outputStream.write(data);
//outputStream.close();
} catch (IOException e) {
System.out.println(“字节流写入文件出错。”);
e.printStackTrace();
}
}

此时没有关闭字节流操作,但是文件中也依然存在了输出的内容,证明字节流是直接操作文件本身的。而下面继续使用字符流完成,再观察效果。
范例:使用字符流不关闭执行:
// 通过字符流 写文件
public static void StringWrite() {
File file = new File(“d:\test\test.txt”);
try {
FileWriter writer = new FileWriter(file);
String textString = “Hello World!!!”;
writer.write(textString);
// writer.flush();
// writer.close();
} catch (IOException e) {
System.out.println(“字符流写入文件出错.”);
e.printStackTrace();
}
}
程序运行结果:

程序运行后会发现文件中没有任何内容,这是因为字符流操作时使用了缓冲区,而 在关闭字符流时会强制性地将缓冲区中的内容进行输出,但是如果程序没有关闭,则缓冲区中的内容是无法输出的,所以得出结论:字符流使用了缓冲区,而字节流没有使用缓冲区。

在开发中是使用字节流好还是字符流好呢?
回答:使用字节流更好。所有的文件在硬盘或在传输时都是以字节的方式进行的,包括图片等都是按字节的方式存储的,而字符是只有在内存中才会形成,所以在开发中,字节流使用较为广泛。
如果要java程序实现一个拷贝功能,应该选用字节流进行操作(可能拷贝的是图片),并且采用边读边写的方式(节省内存)。
使用FileInputStream读取文本文件
示例代码:
/**

  • 文件读取
    /
    public static void readFile(){
    File file=new File(“D:/test/students.txt”);
    try {
    InputStreamReader read = new InputStreamReader(new FileInputStream(file), “utf8”);
    BufferedReader bufferedReader = new BufferedReader(read);
    String lineTxt = null;
    //循环输出每一行内容
    while ((lineTxt = bufferedReader.readLine()) != null) {
    System.out.println(lineTxt);
    }
    read.close();
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    或者:
    /
    • 读取文件
      */
      public static String read(String fileName) {
      File f = new File(fileName);
      if (!f.exists()) {
      return “File not found!”;
      }
      FileInputStream fs;
      String result = null;
      try {
      fs = new FileInputStream(f);
      byte[] b = new byte[fs.available()];
      fs.read(b);
      fs.close();
      result = new String(b);
      } catch (Exception e) {
      e.printStackTrace();
      }

      return result;
      }

InputStream类常用方法及解析:
public void close() throws IOException{}
关闭此文件输入流并释放与此流有关的所有系统资源。抛出IOException异常。
protected void finalize()throws IOException {}
这个方法清除与该文件的连接。确保在不再引用文件输入流时调用其 close 方法。抛出IOException异常。
public int read(int r)throws IOException{}
这个方法从 InputStream 对象读取指定字节的数据。返回为整数值。返回下一字节数据,如果已经到结尾则返回-1。
public int read(byte[] r) throws IOException{}
这个方法从输入流读取r.length长度的字节。返回读取的字节数。如果是文件结尾则返回-1。
public int available() throws IOException{}
返回下一次对此输入流调用的方法可以不受阻塞地从此输入流读取的字节数。返回一个整数值。
使用FileOutputStream 写文本文件
示例代码:
import java.io.FileOutputStream;
import java.io.IOException;

public class FileOutputStreamTest {

public static void main(String[] args) {
	FileOutputStream fos=null;
	 try {
		 String str ="好好学习Java";
         byte[] words  = str.getBytes();
         fos = new FileOutputStream("D:\\myDoc\\hello.txt");
         fos.write(words, 0, words.length);
         System.out.println("hello文件已更新!");
      }catch (IOException obj) {
    	  System.out.println("创建文件时出错!");
      }finally{
    	  try{
    		  if(fos!=null)
    			  fos.close();
    	  }catch (IOException e) {
	    	 e.printStackTrace();
    	  }
      }
}

}
OutputStream类常用方法及解析:
public void close() throws IOException{}
关闭此文件输入流并释放与此流有关的所有系统资源。抛出IOException异常。
protected void finalize()throws IOException {}
这个方法清除与该文件的连接。确保在不再引用文件输入流时调用其 close 方法。抛出IOException异常。
public void write(int w)throws IOException{}
这个方法把指定的字节写到输出流中。
public void write(byte[] w)
把指定数组中w.length长度的字节写到OutputStream中。

File类
Java程序通过java.io.File 类对文件进行访问。File 类的常用方法如下:
方法名称
说 明

boolean exists( )
判断文件或目录是否存在

boolean isFile( )
判断是否是文件

boolean isDirectory( )
判断是否是目录

String getPath( )
返回此对象表示的文件的相对路径名

String getAbsolutePath( )
返回此对象表示的文件的绝对路径名

String getName( )
返回此对象表示的文件或目录的名称

boolean delete( )
删除此对象指定的文件或目录

boolean createNewFile( )
创建名称的空文件,不创建文件夹

long length()
返回文件的长度,单位为字节, 如果文件不存在,则返回 0L

File类的操作示例如下:
import java.io.*;
public class FileMethods {
public static void main(String[] args) {
FileMethods fm=new FileMethods();
File file=null;
file=new File(“D:\myDoc\test.txt”);
//fm.create(file);
fm.showFileInfo(file);
//fm.delete(file);
}
/**
* 创建文件的方法
* @param file 文件对象
/
public void create(File file){
if(!file.exists()){
try {
file.createNewFile();
System.out.println(“文件已创建!”);
} catch (IOException e) {
e.printStackTrace();
}
}
}
/
*
* 删除文件
* @param file 文件对象
*/
public void delete(File file){
if(file.exists()){
file.delete();
System.out.println(“文件已删除!”);
}
}

/**
* 显示文件信息
* @param file 文件对象
*/
public void showFileInfo(File file){
if(file.exists()){ //判断文件是否存在
if(file.isFile()){ //如果是文件
System.out.println(“名称:” + file .getName());
System.out.println("相对路径: " + file.getPath());
System.out.println(“绝对路径: " + file.getAbsolutePath());
System.out.println(“文件大小:” + file.length()+ " 字节”);
}
if(file.isDirectory()){
System.out.println(“此文件是目录”);
}
}else
System.out.println(“文件不存在”);
}
}

创建目录
File类中有两个方法可以用来创建文件夹:
mkdir( )方法创建一个文件夹,成功则返回true,失败则返回false。失败表明File对象指定的路径已经存在,或者由于整个路径还不存在,该文件夹不能被创建。
mkdirs()方法创建一个文件夹和它的所有父文件夹。

下面的例子创建 “/tmp/user/java/bin"文件夹:
import java.io.File;
public class CreateDir {
public static void main(String args[]) {
String dirname = “/tmp/user/java/bin”;
File d = new File(dirname);
// 现在创建目录
d.mkdirs();
}
}
编译并执行上面代码来创建目录 “/tmp/user/java/bin”。
注意:Java 在 UNIX 和 Windows 自动按约定分辨文件路径分隔符。如果你在 Windows 版本的 Java 中使用分隔符 (/) ,路径依然能够被正确解析。
读取目录
一个目录其实就是一个 File 对象,它包含其他文件和文件夹。
如果创建一个 File 对象并且它是一个目录,那么调用 isDirectory() 方法会返回 true。可以通过调用该对象上的 list() 方法,来提取它包含的文件和文件夹的列表。下面展示的例子说明如何使用 list() 方法来检查一个文件夹中包含的内容:
import java.io.File;
public class DirList {
public static void main(String args[]) {
String dirname = “/tmp”;
File f1 = new File(dirname);
if (f1.isDirectory()) {
System.out.println(“目录 " + dirname);
String s[] = f1.list();
for (int i = 0; i < s.length; i++) {
File f = new File(dirname + “/” + s[i]);
if (f.isDirectory()) {
System.out.println(s[i] + " 是一个目录”);
} else {
System.out.println(s[i] + " 是一个文件”);
}
}
} else {
System.out.println(dirname + " 不是一个目录");
}
}
}

删除目录或文件
删除文件可以使用 java.io.File.delete() 方法。
以下代码会删除目录 /tmp/java/,需要注意的是当删除某一目录时,必须保证该目录下没有其他文件才能正确删除,否则将删除失败。
import java.io.File;

public class DeleteFileDemo {
public static void main(String args[]) {
// 这里修改为自己的测试目录
File folder = new File("/tmp/java/");
deleteFolder(folder);
}

// 删除文件及目录
public static void deleteFolder(File folder) {
    File[] files = folder.listFiles();
    if (files != null) {
        for (File f : files) {
            if (f.isDirectory()) {
                deleteFolder(f);
            } else {
                f.delete();
            }
        }
    }
    folder.delete();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值