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异常的原因及解决办法的相关资料,需要的朋友可以参考下
第三个部分是一个文件路径,检查文件(D:\photo.jpg)是否存在,如果存在将文件内容写入D:\test.bin,如果不存在抛出用户自定义异常FNEException对象(此异常类需要你自己定义)。 2.写一段程序读入题1生成的文件D:\test...
操作系统 约定,文件或目录的路径名由斜线(/)或反斜线()分割,此外,相对路径中可以采用'.'表示当前路径,'..'表示当前路径的父路径,即上... import java.io.*; File file=newFile("c:\");
依赖: [me.moocar/java.io " 0.1.0 " ]用法是 JDK7 中引入的文件路径的抽象。 这个库提供了和 Paths 之间的兼容性。 下面的示例用法( require 'me.moocar.java.io)( require '[clojure.java.io :as jio])( import ...
Java IO流学习总结 Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据...
尽管java.io定义的大多数类是实行流式操作的,File类不是。它直接处理文件和文件系统。也就是说,File类没有指定信息怎样从文件读取或向文件存储;它描述了文件本身的属性。File对象用来获取或处理与磁盘文件相关的...
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控制指定路径下的文件夹压缩成zip格式。 java将zip压缩包解压成为文件夹。直接使用io流进行操作,不需借助其他jar包
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 { ...
可以利用系统命令ipconfig/all,读取mac地址,然后通过解析行得到mac地址。
**java.io** 将字符串形式的路径,封装成File类,File类提供了大量的直接操作文件和文件夹的方法。 二.File的静态常量 static String pathseparator 与系统有关的路径分隔符 返回“;”——–路径和路径用“;...
java.security.cert 提供用于解析和管理证书、证书撤消列表 (CRL) 和证书路径的类和接口。 java.security.interfaces 提供的接口用于生成 RSA Laboratory Technical Note PKCS#1 中定义的 RSA(Rivest、Shamir 和 ...
NULL 博文链接:https://citywu123.iteye.com/blog/731180
util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...
Java Stream Java Stream 是 Java 8 中引入的一种...Java File 类是用于表示文件或目录的抽象路径名的类。它可以用于创建、删除、重命名和移动文件或目录。 以下是一些常用的 File 方法: ● exists():检查文件或目录
1.当Java.io中,如果文件的操作的时候,判断是否隐藏用File.ishiden() 判断是否只读,可用File.canWrite(). 2. 当要设置是否是可读或者是隐藏时,在java中除了提供File.setReadOnly()外,就无其他方法了。 所以我们...
Java 将大文件分割为小文件 Java 将大文件分割为小...在 Java 中,可以使用 Java.IO 包中的 FileWriter 和 BufferedWriter 类来实现文件写入路径。 在上面的代码中,使用了 sqlitFilePath 变量来存储文件写入路径。
util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...