`

Java的IO及路径

 
阅读更多

                                                                 Java的IO及路径问题

 

 1.流的类型
根据流动方向的不同,流分为输入流和输出流;
对于输入和输出流,由于传输格式的不同,又分为字节流和字符流:
         字节流是指8位的通用字节流,以字节为基本单位,在java.io包中,对于字节流进行操作的类大部分继承于InputStream(输入字节流)类和OutputStream(输出字节流)类;常用于读二进制文件,如图片、声音、影像等文件。
         字符流是指16位的Unicode字符流,以字符(两个字节)为基本单位,非常适合处理字符串和文本,对于字符流进行操作的类大部分继承于Reader(读取流)类和Writer(写入流)类;以字符为单位读取文件,常用于读文本,数字等类型的文件

常用流的结构:

读:

InputStream: FileInputStream    : BufferedInputStream

                       ObjectInputStream

Reader:InputStreamReader  :FileReader

              BufferedReader       :LineNumerReader

写:input-->output,Reader-->Writer

 

2.学习I/O明白java里的路径很重要:

默认路径:Myeclipse里的默认路径为工程的根目录(即src的上一层目录,与src文件夹在同一目录下)

绝对路径:使用/  或 \\开头的从根目录出发路径。因为/代表根目录在java中\\与/起同样作用。

相对路径:

1.基于默认路径(即工程)的相对路径   "src/com/lavasoft/res/a.txt"

2.基于该类的相对路径

URL uri = className.class.getResource("/com/lavasoft/res/a.txt"); 这里的 / 表示src根目录
如果用来读取文件,我们还可以使用FileInputStream和FielReader在讲文件的读写前,我们先要了解File类:

   File的创建:

 

public class FileTest {
	  public static void main(String[] args) {
		   File file = new File("text.txt");  //创建文件对象
		   if(file.exists()){
			   file.delete();                //如果文件存在则删除
		   }else{
			   try {
				file.createNewFile();		//如果不存在则创建
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		   }
		   
		  }
}

 

 对文件的读取:

过程:将file变成Stream再将Stream变成String

 

FileInputStream类:
FileInputStream类称为文件输入流,继承于InputStream类,是进行文件读操作的最基本类;
它的作用是将文件中的数据输入到内存中,我们可以利用它来读文件;
由于它属于字节流,因此在读取Unicode字符(如中文)的文件时可能会出现问题。

public class FileInputStreamDemo1 {
  public static void main(String[] args) {
    try {
      File file = new File("test.txt");  //创建文件对象
      //使用文件对象创建文件输入流对象,相当于打开文件
      FileInputStream fis = new FileInputStream(file);
      for (int i = 0; i < file.length(); i++) {
        char ch = (char)(fis.read());  //循环读取字符
        System.out.print(ch);
      }
      System.out.println();
      fis.close();     //关闭流
    } catch (FileNotFoundException fnfe) {
      System.out.println("文件打开失败。");
    } catch (IOException ioe) {
      ioe.printStackTrace();
    }
  }
}

 
//与上面不同这个确定了一次性读取多少个字节存入字节数组中,在从数组中循环取出,数组相当于一个缓冲,提高了效率。

 

public class FileInputStreamDemo2 {
  public static void main(String[] args) {
    try {
      File file = new File("test.txt");  //创建文件对象
      FileInputStream fis = new FileInputStream(file);
      //根据文件的字节长度创建字节数组,一次性读完
      byte[] buf = new byte[(int)(file.length())];
      fis.read(buf);  //读取文件中的数据存放到字节数组中
      String str = new String(buf);  //利用字节数组创建字符串
      System.out.println(str);   //打印字符串
      fis.close();     //关闭流
    } catch (FileNotFoundException fnfe) {
      System.out.println("文件打开失败。");
    } catch (IOException ioe) {
      ioe.printStackTrace();
    }
  }
}

 

//同理,文件输出流
FileOutputStream类:
FileOutputStream类称为文件输出流,继承于OutputStream类,是进行文件写操作的最基本类;
它的作用是将内存中的数据输出到文件中,我们可以利用它来写文件。

public class FileOutputStreamDemo1
{
  //在函数内部不进行异常处理,将异常抛出函数外部
  public static void main(String[] args) throws IOException
  {
    String str = "Hello world!";
    File file = new File("test.txt");  //创建文件对象
    //通过文件对象创建文件输出流对象
    //附加第二个参数true,指定进行文件追加,默认为不追加。也可使用RandomAccessFile来进行追加,该类可一调用seek找到最后一个字符位置,再进行写入,所以该类还可以用来做随机读取(读取位置可设定)。
    FileOutputStream fos = new FileOutputStream(file, true);
    
    //逐个将字节逐个写入到文件中
    for (int i = 0; i < str.length(); i++)
    {
      fos.write(str.charAt(i));
    }
    fos.close();    //关闭流
  }
}

 

public class FileOutputStreamDemo2
{
  //在函数内部不进行异常处理,将异常抛出函数外部
  public static void main(String[] args) throws Exception
  {
    String str = "I Love Java";
    //通过文件名创建文件输出流对象
    FileOutputStream fos = new FileOutputStream("test.txt");
    
    //将字符串转化为字节数组
    byte[] buffer = str.getBytes();
    //将字节数组中包含的数据一次性写入到文件中
    fos.write(buffer);
    //关闭流
    fos.close();
  }
}

 


FileInputStream/FileOutputStream小结:
FileInputStream类和FileOutputStream类是成对出现的,一个进行输入(读文件)操作,一个进行输出(写文件)操作;
由于采用字节方式进行数据传输,不必考虑数据的格式问题,这两个类对文件操作的效率较高;
可以使用这两个类完成复制文件的操作。

public class CopyFileDemo {
  public static void main(String[] args) throws IOException {
    File srcFile = new File("src.dat");    //源文件对象
    File destFile = new File("dest.dat");  //目标文件对象
    if (!(destFile.exists())) {  //判断目标文件是否存在
      destFile.createNewFile();  //如果不存在则创建新文件
    }
    //使用源文件对象创建文件输入流对象
    FileInputStream fis = new FileInputStream(srcFile);
    //使用目标文件对象创建文件输出流对象
    FileOutputStream fos = new FileOutputStream(destFile);
    byte[] buf = new byte[1024];  //创建字节数组,作为临时缓冲
    System.out.println("开始复制文件...");
    while (fis.read(buf) != -1) {  //循环从文件输入流中读取数据到数组
      fos.write(buf);    //从数组中写入到文件输出流中
    }
    System.out.println("文件复制成功!");
    fis.close();    //关闭流
    fos.close();
  }
}

 
字符流:
FileInputStram类和FileOutputStream类虽然可以高效率地读/写文件,但对于Unicode编码的文件,使用它们有可能出现乱码;
考虑到Java是跨平台的语言,要经常操作Unicode编码的文件,使用字符流操作文件是有必要的,且字符类型可以用new inputStreamReader(InputStream in,String charset )将字节流转换为GBK等字符格式;
使用字符流将涉及到以下4个类:(Reder和Writer的子类)
FileReader类和FileWriter类;
BufferedReader类和BufferedWriter类。

FileReader类:
FileReader类称为文件读取流,允许以字符流的形式对文件进行读操作,其构造方法有3种重载方式,以下是常用的几种:
该类将从文件中逐个地读取字符,效率比较低下可以一次读取多个字符,采用char数组做缓冲(类似于上面一次读取多个字节的代码)。



FileReader配合BufferedReader读文件示例:将FileReader包装到BufferedReader可以一次读一行,常用于读面向行的格式化文件

 

 

public class RraderDemo
{
  public static void main(String[] args) throws IOException
  {
    File file = new File("test.txt");
    //通过文件对象创建文件读取流对象
    FileReader fr = new FileReader(file);
    //将文件读取流包装成缓冲读取流
    BufferedReader br = new BufferedReader(fr);
    
    String str;
    while ((str = br.readLine()) != null)  //逐行读取数据
    {
      System.out.println(str);
    }
    br.close();   //关闭流
    fr.close();   //关闭流
  }
}
 

//同理利用FileWriter和BufferedWriter可以写如数据

 

  

分享到:
评论

相关推荐

    文件路径正确,报java.io.FileNotFoundException异常的原因及解决办法

    主要介绍了文件路径正确,报java.io.FileNotFoundException异常的原因及解决办法的相关资料,需要的朋友可以参考下

    java大作业IO 和异常

    第三个部分是一个文件路径,检查文件(D:\photo.jpg)是否存在,如果存在将文件内容写入D:\test.bin,如果不存在抛出用户自定义异常FNEException对象(此异常类需要你自己定义)。 2.写一段程序读入题1生成的文件D:\test...

    Java中路径和相对路径的总结

    操作系统  约定,文件或目录的路径名由斜线(/)或反斜线()分割,此外,相对路径中可以采用'.'表示当前路径,'..'表示当前路径的父路径,即上... import java.io.*; File file=newFile&#40;"c:\"&#41;;

    java.io:clojure.java.io 的 JK7 java.nio.file.Path 兼容性

    依赖: [me.moocar/java.io " 0.1.0 " ]用法是 JDK7 中引入的文件路径的抽象。 这个库提供了和 Paths 之间的兼容性。 下面的示例用法( require 'me.moocar.java.io)( require '[clojure.java.io :as jio])( import ...

    Java之IO流学习总结

    Java IO流学习总结 Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据...

    java-io-file类笔记

    尽管java.io定义的大多数类是实行流式操作的,File类不是。它直接处理文件和文件系统。也就是说,File类没有指定信息怎样从文件读取或向文件存储;它描述了文件本身的属性。File对象用来获取或处理与磁盘文件相关的...

    java 读写EXEcel文档范例

    import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.HashMap; import java.util.Map; import ...

    java根据路径对文件进行的操作

    java中对文件的一些操作(删除,复制,计算大小..)和一些数学问题代码详解

    java将文件夹压缩成zip,解压zip压缩包

    java控制指定路径下的文件夹压缩成zip格式。 java将zip压缩包解压成为文件夹。直接使用io流进行操作,不需借助其他jar包

    java 读取本机MAC地址

    可以利用系统命令ipconfig/all,读取mac地址,然后通过解析行得到mac地址。

    相对路径转换工具.rar

    绝对路径转相对路径工具,绝对路径转相对路径工具,绝对路径转相对路径工具,绝对路径转相对路径工具,绝对路径转相对路径工具

    JAVA获取同一路径下所有子类或接口实现类

    import java.io.File; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.List; import find.test.Intf; import find.test.Man; public class ClassUtil { ...

    Java IO学习总结

    **java.io**  将字符串形式的路径,封装成File类,File类提供了大量的直接操作文件和文件夹的方法。 二.File的静态常量 static String pathseparator  与系统有关的路径分隔符  返回“;”——–路径和路径用“;...

    JAVA_API1.6文档(中文)

    java.security.cert 提供用于解析和管理证书、证书撤消列表 (CRL) 和证书路径的类和接口。 java.security.interfaces 提供的接口用于生成 RSA Laboratory Technical Note PKCS#1 中定义的 RSA(Rivest、Shamir 和 ...

    java读取项目中的文件(src目录下)

    NULL 博文链接:https://citywu123.iteye.com/blog/731180

    java源码包---java 源码 大量 实例

     util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...

    Java Stream、File、IO.pdf

    Java Stream Java Stream 是 Java 8 中引入的一种...Java File 类是用于表示文件或目录的抽象路径名的类。它可以用于创建、删除、重命名和移动文件或目录。 以下是一些常用的 File 方法: ● exists():检查文件或目录

    java修改文件属性

    1.当Java.io中,如果文件的操作的时候,判断是否隐藏用File.ishiden() 判断是否只读,可用File.canWrite(). 2. 当要设置是否是可读或者是隐藏时,在java中除了提供File.setReadOnly()外,就无其他方法了。 所以我们...

    JAVA上百实例源码以及开源项目

     util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...

    JAVA上百实例源码以及开源项目源代码

     util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...

Global site tag (gtag.js) - Google Analytics