java基础12-java流(输入输出流、字节字符流)、文件(file)和IO

    科技2022-08-01  84

    Java流

    一、字节流的读写文件(~~Stream)1、FileInputStream2、FileOutputStream 二、字符流的读写文件(--Reader/--Writer)文件和I/O1、Java中的目录-File类2、字符流-FileReader类3、字符流-FileWriter类第一种字符流读写:FileWriter 、FileReader 的使用第二种字符流读写:OutputStreamWriter 、InputStreamReader 的使用 4、字符流 缓冲区-BufferedReader BufferedWriter

    Java.io 包几乎包含了所有操作输入、输出需要的类。所有这些流类代表了输入源和输出目标。 Java.io 包中的流支持很多种格式,比如:基本类型、对象、本地化字符集等等。 一个流可以理解为一个数据的序列。输入流表示从一个源读取数据,输出流表示向一个目标写数据。 Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。

    一、字节流的读写文件(~~Stream)

    一个流被定义为一个数据序列。输入流用于从源读取数据,输出流用于向目标写数据。 下图是一个描述输入流和输出流的类层次图。

    1、FileInputStream

    该流用于从文件读取数据,它的对象可以用关键字 new 来创建。 有多种构造方法可用来创建对象。 可以使用字符串类型的文件名来创建一个输入流对象来读取文件:

    InputStream f = new FileInputStream("C:/java/hello");

    也可以使用一个文件对象来创建一个输入流对象来读取文件。我们首先得使用 File() 方法来创建一个文件对象:

    File f = new File("C:/java/hello"); InputStream out = new FileInputStream(f);

    创建了InputStream对象,就可以使用下面的方法来读取流或者进行其他的流操作。

    2、FileOutputStream

    该类用来创建一个文件并向文件中写数据。 如果该流在打开文件进行输出前,目标文件不存在,那么该流会创建该文件。 有两个构造方法可以用来创建 FileOutputStream 对象。 使用字符串类型的文件名来创建一个输出流对象:

    OutputStream f = new FileOutputStream("C:/java/hello")

    也可以使用一个文件对象来创建一个输出流来写文件。我们首先得使用File()方法来创建一个文件对象:

    File f = new File("C:/java/hello"); OutputStream f = new FileOutputStream(f);

    1、第一种字节流读写方式:通过二进制写入byte类型,可能存在乱码,读出的数字正常

    // 第一种写入方式 int arr[] = { 10, 9, 8, 7, 6 }; OutputStream os = new FileOutputStream("E:\\Test.txt");// 写文件 for (int i = 0; i < arr.length; i++) {// 由于是二进制写入,可能存在乱码 os.write(arr[i]);// 写入int数组 } os.close(); // 第一种读出方式 InputStream is = new FileInputStream("E:\\Test.txt");// 创建队形读取文件 out.read(); int issize = is.available();//文件可读长度 for (int i = 0; i < issize; i++) { System.out.println(is.read() + " "); } is.close();

    2、加入异常处理后的正确处理(推荐):读取写入字节时需要强转,不然输出的是ASCII码

    读出文件:

    public class Test10_6 { public static void main(String[] args) { // TODO Auto-generated method stub File f = new File("b.txt"); InputStream in = null; try { in = new FileInputStream(f); //1、读多个字节 int issize = in.available();//读取长度 for (int i = 0; i < issize; i++) { System.out.print((char)in.read() + " ");//直接输出ASCII码 加上(char)强转 } //2、读一个字节 int t = 0; while ((t = in.read()) != -1) {// read只能一次读一个字节,不能显示中文两个字节 System.out.print((char)t);//直接输出ASCII码 } // in.close();放这里不保险,出错时不会执行关闭 } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { in.close();//放这里需要抛出异常 } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }

    写入文件:

    public class Test10_6_2 { public static void main(String[] args) { File f = new File("b.txt"); try { OutputStream out = new FileOutputStream(f); // 1、存单字节 写入abcyes out.write(97);//如果文件已经存在,则覆盖文件中的内容,如果不存在文件,则新建文件 out.write(98);//写入的ascii码对应的b out.write(99); out.write('y'); out.write('e'); out.write('s'); // 2、存汉字数组 写入hello 中国 字符串 String info = "hello 中国"; byte s[] = info.getBytes();//转成byte数组写入 out.write(s);//不能写中文,write只能写单字节 out.write('中'); out.write('国'); //3、换行 String info2 = "张三\r\n李四"; // 在windows中使用\r\n即可换行 byte s2[] = info.getBytes(); out.write(s2);//不能写中文,write只能写单字节 out.write('中'); out.write('国'); out.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }

    二、字符流的读写文件(–Reader/–Writer)

    文件和I/O

    还有一些关于文件和I/O的类,我们也需要知道: File Class(类) FileReader Class(类) FileWriter Class(类)

    1、Java中的目录-File类

    创建目录:

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

    读取目录:

    一个目录其实就是一个 File 对象,它包含其他文件和文件夹。 如果创建一个 File 对象并且它是一个目录,那么调用isDirectory() 方法会返回 true。 可以通过调用该对象上的 list() 方法,来提取它包含的文件和文件夹的列表。

    删除目录:

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

    public class Test10_6_3 { public static void main(String[] args) { //创建目录 String dirname = "/目录测试/aimee";// 创建在项目所在的根盘下 File d = new File(dirname);// 创建目录对象 // 创建目录 d.mkdirs(); //读取目录列表 String dirname2 = "/eclipseIDA"; File d2 = new File(dirname2); if (d2.isDirectory()) {// 判断file对象是不是为一个目录 System.out.println("目录: " + dirname2); String s[] = d2.list();// 提取它包含的文件和文件夹的列表 for (int i = 0; i < s.length; i++) { File f = new File(dirname2 + "/" + s[i]); if (f.isDirectory()) { System.out.println(s[i] + "是一个目录"); } else { System.out.println(s[i] + "不是一个目录"); } } }else { System.out.println(dirname2 + "不是一个目录"); } //删除目录或文件 File delf=new File("/目录测试"); delf.delete();//删除目录测试文件及其子目录 } 目录: /eclipseIDA .metadata是一个目录 Gson-Test是一个目录 HelloJavaWeb是一个目录 Java-Contacts是一个目录 Java-Demo是一个目录 Java-Homework01是一个目录 Java-Homework02是一个目录 Java-Homework03是一个目录 Java-Homework04是一个目录 Java-Kaoqin是一个目录 Java-TestJDBC是一个目录 Maven_exam_parent是一个目录 Maven_Java是一个目录 Maven_Test是一个目录 Maven_test_parent是一个目录 Maven_web是一个目录 OnlineExam是一个目录 RemoteSystemsTempFiles是一个目录 Servers是一个目录 YUNBOLE是一个目录

    File对象:

    Java文件类以抽象的方式代表文件名和目录路径名。该类主要用于文件和目录的创建、文件的查找和文件的删除等。 1、File对象代表磁盘中实际存在的文件和目录。 通过以下构造方法创建一个File对象。 2、通过给定的父抽象路径名和子路径名字符串创建一个新的File实例。 File(File parent, String child); 3、通过将给定路径名字符串转换成抽象路径名来创建一个新 File 实例。 File(String pathname) 4、根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。 File(String parent, String child) 5、通过将给定的 file: URI 转换成一个抽象路径名来创建一个新的 File 实例。 File(URI uri)

    创建File对象成功后,可以使用以下列表中的方法操作文件。 file对象的其他方法:获取名字、长度、上一级目录、上次修改时间等

    package Test; import java.io.File; import java.sql.Date; import java.text.SimpleDateFormat; public class Test10_6_4 { public static void main(String[] args) { File f3 = new File("/dunny"); File[] f = f3.listFiles();// 查看某文件夹下所有的文件 for (File file : f) { System.out.println(file.getName()); String newname = file.getParent() + "11" + file.getName(); file.renameTo(new File(newname));// 改名称 } File f1 = new File("b.txt");// 也可以把\\改为/,怕与转移字符冲突 File f2 = new File("/dunny"); f1.delete();// 删除文件夹,只能删除空文件夹 f2.mkdir();// 创建文件夹 创建文件为createNewFile()方法 System.out.println("f2目录是否存在:"+f2.exists());//f2目录是否存在 true System.out.println("f2的名字:"+f2.getName());//f2的名字 dunny System.out.println("f2的路径:"+f2.getPath());//f2的路径 \dunny System.out.println("f2的上一级:"+f2.getParent());//f2的上一级 \ System.out.println("f2是否为文件:" + f2.isFile());// f2是否为文件 false System.out.println("f2是否为目录:" + f2.isDirectory());// 是否为目录 true System.out.println("大小" + f1.length());// 测文件的长度,如果是文件夹则测不出来 大小30 long time = f1.lastModified(); // f1最后的修改时间 Date t = new Date(time); SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd HH:mm:ss"); String tt = sdf.format(t.getTime()); System.out.println("f1最后的修改时间:"+tt);//f1最后的修改时间:2020年10月06 18:01:15 } }

    2、字符流-FileReader类

    FileReader类从InputStreamReader类继承而来。该类按字符读取流中数据。可以通过以下几种构造方法创建需要的对象。

    1、在给定从中读取数据的 File 的情况下创建一个新 FileReader。 FileReader(File file) 2、在给定从中读取数据的 FileDescriptor 的情况下创建一个新 FileReader。 FileReader(FileDescriptor fd) 3、在给定从中读取数据的文件名的情况下创建一个新 FileReader。 FileReader(String fileName)

    创建FIleReader对象成功后,可以参照以下方法操作文件。

    public int read() throws IOException 读取单个字符,返回一个int型变量代表读取到的字符 public int read(char [] c, int offset, int len) 读取字符到c数组,返回读取到字符的个数

    3、字符流-FileWriter类

    FileWriter 类从 OutputStreamWriter 类继承而来。该类按字符向流中写入数据。可以通过以下几种构造方法创建需要的对象。

    1、在给出 File 对象的情况下构造一个 FileWriter 对象。 FileWriter(File file) 2、在给出 File对象的情况下构造一个 FileWriter 对象。 FileWriter(File file, boolean append) 参数:file:要写入数据的 File 对象。 append:如果 append 参数为 true,则将字节写入文件末尾处,相当于追加信息。如果append 参数为 false, 则写入文件开始处。 3、构造与某个文件描述符相关联的 FileWriter 对象。 FileWriter(FileDescriptor fd) 4、在给出文件名的情况下构造 FileWriter 对象,它具有指示是否挂起写入数据的 boolean 值。 FileWriter(String fileName, booleanappend)

    创建FileWriter对象成功后,可以参照以下方法操作文件。

    public void write(int c) throws IOException 写入单个字符c。 public void write(char [] c, int offset, int len) 写入字符数组中开始为offset长度为len的某一部分。 public void write(String s, int offset, int len) 写入字符串中开始为offset长度为len的某一部分。

    第一种字符流读写:FileWriter 、FileReader 的使用
    package Test; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; public class Test10_6_5 { public static void main(String[] args) throws IOException { File file = new File("a.txt"); file.createNewFile();// 创建文件 如何创建文件夹? // 写文件 FileWriter writer = new FileWriter(file); // 创建一个FileWriter对象 // 向文件中写内容 writer.write("这是一个字符流案例"); writer.flush(); writer.close(); // 读文件 FileReader reader = new FileReader(file); System.out.println(reader.read());//直接输出数字 36825 char[] a = new char[50]; reader.read(a); for (char c : a) { System.out.print(c);// 一个一个打印字符 :是一个字符流案例 } reader.close(); } }
    第二种字符流读写:OutputStreamWriter 、InputStreamReader 的使用
    // 第二种写入方式 File f = new File("a.txt"); // 构建FileOutputStream对象,文件不存在会自动新建,不指定路径文件创建在项目下 FileOutputStream fop = new FileOutputStream(f); // 构建OutputStreamWriter对象,参数可以指定编码,默认为操作系统默认编码,windows上是gbk OutputStreamWriter writer = new OutputStreamWriter(fop, "UTF-8"); String arr2[] = { "倒", "霉", "的", "一", "天" }; writer.append("中文输入"); writer.append("\r\n"); // 换行 for (int i = 0; i < arr2.length; i++) { writer.append(arr2[i]); } writer.close();// 关闭写入流,同时会把缓冲区内容写入文件,所以上面的注释掉 fop.close(); // 第二种读出方式 FileInputStream fis = new FileInputStream(f);// 构建FileInputStream对象 InputStreamReader reader = new InputStreamReader(fis, "UTF-8");// 构建InputStreamReader对象,编码与写入相同 StringBuffer sb = new StringBuffer(); while (reader.ready()) { sb.append((char) reader.read()); // 转成char加到StringBuffer对象中 } System.out.println(sb.toString()); reader.close(); // 关闭读取流 fis.close(); // 关闭输入流,释放系统资源

    4、字符流 缓冲区-BufferedReader BufferedWriter

    为什么要引入这两个带缓冲的输入输出流? 为了提高字符流读写的效率,引入了缓冲机制,进行字符批量的读写,提高了单个字符读写的效率。BufferedReader用于加快读取字符的速度,BufferedWriter用于加快写入的速度 BufferedReader和BufferedWriter类各拥有8192个字符的缓冲区。当BufferedReader在读取文本文件时,会先尽量从文件中读入字符数据并放满缓冲区,而之后若使用 read()

    方法,会先从缓冲区中进行读取。如果缓冲区数据不足,才会再从文件中读取,使用BufferedWriter时,写入的数据并不会先输出到目的地,而是先存储至缓冲区中。如果缓冲区中的数据满了,才会一次对目的地进行写出。

    创建 BufferedReader 的基本语法: BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedReader 对象创建后,我们便可以使用 read() 方法从控制台读取一个字符,或者用 readLine() 方法读取一个字符串。

    从 BufferedReader 对象读取一个字符要使用 read() 方法,它的语法如下: int read( ) throws IOException 每次调用 read() 方法,它从输入流读取一个字符并把该字符作为整数值返回。 当流结束的时候返回 -1。该方法抛出 IOException。

    从标准输入读取一个字符串需要使用 BufferedReader 的 readLine() 方法。 它的一般格式是: String readLine( ) throws IOException

    package Test; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; public class Test10_6_6 { public static void main(String[] args) { // 读 File f = new File("E:/Test/hello.txt"); try { FileReader r = new FileReader(f); BufferedReader b = new BufferedReader(r); String line = null; while ((line = b.readLine()) != null) { System.out.println(line); } b.close(); r.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } // 写 try { FileWriter f2 = new FileWriter("E:/Test/h.txt"); BufferedWriter b2 = new BufferedWriter(f2); b2.write("中国"); b2.newLine(); b2.write("湖南"); b2.close(); f2.close();// 关的顺序不能变 } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
    Processed: 0.010, SQL: 8