乐东黎族自治县网站建设_网站建设公司_HTML_seo优化
2025/12/17 9:45:40 网站建设 项目流程

javaIO流学习笔记

BuffedReader

import com.lfm.BufferedReader_;import java.io.BufferedReader;
import java.io.FileReader;public class BufferdReader_ {public static void main(String[] args) throws Exception{String path = "/home/lfm/java_study/Test/src/Solution.java";//创建BufferedReader br = new BufferedReader(new FileReader(path));//读取String line;//按行读取while((line = br.readLine()) != null) {System.out.println(line);}//这里只需要关闭BufferedReader,因为底层会自动去关节点流br.close();/*public void close() throws IOException {synchronized (lock) {if (in == null)return;try {in.close();//in 就是我们传入的new FileReader(path)} finally {in = null;cb = null;}}}*/}
}
  • 关闭(close) 的源码
public void close() throws IOException {synchronized (lock) {if (in == null)return;try {in.close();//in 就是我们传入的new FileReader(path)} finally {in = null;cb = null;}}}

BufferedWriter

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;public class BufferedWriter_ {public static void main(String[] args) throws IOException {String filePath = "/home/lfm/test_io/ok.txt";//创建一个BufferedWriter bw = new BufferedWriter(new FileWriter(filePath, true));bw.write("hello , lfm");bw.newLine();bw.write("hello2 , lfm");bw.newLine();bw.write("hello3 , lfm");bw.newLine();//插入一个换行符//FileWriter会自动关闭bw.close();}
}

复制文件

import java.io.*;public class BufferedCopy_ {public static void main(String[] args) {String srcFilepath = "/home/lfm/java_study/Test/src/Main.java";String destFilepath = "/home/lfm/test_io/note.txt";//1.  BufferedWriter BufferedReader 是字符操作,不要操作二进制文件BufferedReader br = null;BufferedWriter bw = null;String line = null;try {br = new BufferedReader(new FileReader(srcFilepath));bw = new BufferedWriter(new FileWriter(destFilepath));while ((line = br.readLine()) != null) {bw.write(line);bw.newLine();}} catch (IOException e) {try {throw new IOException(e);} catch (IOException ex) {throw new RuntimeException(ex);}} finally {//关闭try {if (br != null)br.close();if (bw != null)bw.close();} catch (IOException e) {throw new RuntimeException(e);}}}
}

拷贝二进制文件

import com.lfm.BufferedReader_;import java.io.*;/*** 演示使用BufferedOutputStream 和 BufferedInputStream使用* 使用他们可以完成二进制文件拷贝* 思考:字节流可以操作二进制文件,可以操作文本文件吗?*/
public class BufferedCopy02 {public static void main(String[] args) {String srcFilePath = "/home/lfm/test_io/note.txt";String destFilePath = "/home/lfm/test_io/ok.txt";BufferedInputStream bis = null;BufferedOutputStream bos = null;try {bis = new BufferedInputStream(new FileInputStream(srcFilePath));bos = new BufferedOutputStream(new FileOutputStream(destFilePath));//循环读取文件byte[] buff = new byte[1024];int readLine = 0;while ((readLine = bis.read(buff)) != -1) {}} catch (IOException e) {throw new RuntimeException(e);} finally {//关闭外层处理流try {if (bis != null) {bis.close();}if (bos != null) {bos.close();}} catch (IOException e) {throw new RuntimeException(e);}}}
}

节点流和处理流

/home/lfm/.jdks/corretto-1.8.0_462/bin/java -javaagent:/home/lfm/.local/share/JetBrains/Toolbox/apps/intellij-idea-ultimate/lib/idea_rt.jar=43533 -Dfile.encoding=UTF-8 -classpath /home/lfm/.jdks/corretto-1.8.0_462/jre/lib/charsets.jar:/home/lfm/.jdks/corretto-1.8.0_462/jre/lib/ext/cldrdata.jar:/home/lfm/.jdks/corretto-1.8.0_462/jre/lib/ext/dnsns.jar:/home/lfm/.jdks/corretto-1.8.0_462/jre/lib/ext/jaccess.jar:/home/lfm/.jdks/corretto-1.8.0_462/jre/lib/ext/jfxrt.jar:/home/lfm/.jdks/corretto-1.8.0_462/jre/lib/ext/localedata.jar:/home/lfm/.jdks/corretto-1.8.0_462/jre/lib/ext/nashorn.jar:/home/lfm/.jdks/corretto-1.8.0_462/jre/lib/ext/sunec.jar:/home/lfm/.jdks/corretto-1.8.0_462/jre/lib/ext/sunjce_provider.jar:/home/lfm/.jdks/corretto-1.8.0_462/jre/lib/ext/sunpkcs11.jar:/home/lfm/.jdks/corretto-1.8.0_462/jre/lib/ext/zipfs.jar:/home/lfm/.jdks/corretto-1.8.0_462/jre/lib/jce.jar:/home/lfm/.jdks/corretto-1.8.0_462/jre/lib/jfr.jar:/home/lfm/.jdks/corretto-1.8.0_462/jre/lib/jfxswt.jar:/home/lfm/.jdks/corretto-1.8.0_462/jre/lib/jsse.jar:/home/lfm/.jdks/corretto-1.8.0_462/jre/lib/management-agent.jar:/home/lfm/.jdks/corretto-1.8.0_462/jre/lib/resources.jar:/home/lfm/.jdks/corretto-1.8.0_462/jre/lib/rt.jar:/home/lfm/java_study/chapter19/out/production/chapter19:/home/lfm/.m2/repository/org/junit/jupiter/junit-jupiter/5.8.1/junit-jupiter-5.8.1.jar:/home/lfm/.m2/repository/org/junit/jupiter/junit-jupiter-api/5.8.1/junit-jupiter-api-5.8.1.jar:/home/lfm/.m2/repository/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0.jar:/home/lfm/.m2/repository/org/junit/platform/junit-platform-commons/1.8.1/junit-platform-commons-1.8.1.jar:/home/lfm/.m2/repository/org/apiguardian/apiguardian-api/1.1.2/apiguardian-api-1.1.2.jar:/home/lfm/.m2/repository/org/junit/jupiter/junit-jupiter-params/5.8.1/junit-jupiter-params-5.8.1.jar:/home/lfm/.m2/repository/org/junit/jupiter/junit-jupiter-engine/5.8.1/junit-jupiter-engine-5.8.1.jar:/home/lfm/.m2/repository/org/junit/platform/junit-platform-engine/1.8.1/junit-platform-engine-1.8.1.jar com.lfm.outputstream_.ObjecttOutStream_
Exception in thread "main" java.io.NotSerializableException: com.lfm.outputstream_.Dogat java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)at com.lfm.outputstream_.ObjecttOutStream_.main(ObjecttOutStream_.java:22)进程已结束,退出代码为 1

报错是因为没有实现序列化接口,Dog类没有实现Serializable接口,所以无法序列化。

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;public class ObjecttOutStream_ {public static void main(String[] args) throws IOException {//序列化后保存的文件格式不是纯文本的,而是按照String filePath = "/home/lfm/test_io/data.dat";ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath));//序列化数据到 /home/lfm/test_io/data.datoos.write(100);// ->Integeroos.writeBoolean(true);//->Booleanoos.writeChar('a');//-> Characteroos.writeDouble(3.14);//double -> Doubleoos.writeUTF("lfm");//String//保存一个dog对象oos.writeObject(new Dog("旺财", 10));oos.close();System.out.println("数据保存完成");}
}class Dog {private String name;private int age;public Dog(String name, int age) {this.name = name;this.age = age;}
}

节点流和处理流

介绍:

  1. InputstreamReader:Reader的子类, 可以将InputStream(字节流) 包装(转换) Reader(字符流)

  2. OutputStreamWriter:Writer的子类, 可以将OutputStream(字节流) 包装(转换) Writer(字符流)

  3. 当处理纯文本数据时, 如果使用字符流效率更高,并且可以有效解决中文问题,所以建议将字节流转换成字符流

  4. 可以在使用时指定编码格式比如UTF-8,GBK等, 否则默认使用平台默认编码格式

public class InputStreamReader_ {public static void main(String[] args) throws Exception {String filePath = "/home/lfm/test_io/note.txt";//1. new FileInputStream 转成InputStreamReader//2. 指定编码utf8//InputStreamReader isr = new InputStreamReader(new FileInputStream(filePath), "utf8");////3. 把InputStreamReader 传入 BufferedReader//BufferedReader br = new BufferedReader(isr);//合在一起BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), "utf8"));//4. 读取String s = br.readLine();System.out.println("读取内容 = " + s);//5.关闭外层br.close();}
}
  • note.txt内容是gbk编码的要想在我的arch系统打印出来,没有乱码

引入InputStreamReader 包装InputStream, 然后指定编码格式为utf8, 这样就可以正确打印出中文了。

输出流

PrintStream

import java.io.IOException;
import java.io.PrintStream;
import java.io.PrintWriter;/*** 演示PrintStream (字节打印流/输出流)**/
public class PrintStream_ {public static void main(String[] args) throws IOException {PrintStream out = System.out;//在默认情况下, PrintStream输出位置是 标准输出 即显示器/*public void print(String s) {if (s == null) {s = "null";}write(s);}*/out.print("你好");//因为print底层使用的是write,所以我们可以直接调用write进行打印/输出out.write("lfm".getBytes());out.close();//1. 输出修改到 "/home/lfm/test_io/note.txt"//2. "hello,lfm" 就会输出到"/home/lfm/test_io/note.txt"//3.//public static void setOut(PrintStream out) {//    checkIO();//    setOut0(out);//native 方法 修改了out//}System.setOut(new PrintStream("/home/lfm/test_io/note.txt"));System.out.println("hello,lfm");}
}

PrintWriter

import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;public class PrintWriter_ {public static void main(String[] args) throws IOException {//PrintWriter out = new PrintWriter(System.out);PrintWriter out = new PrintWriter(new FileWriter("/home/lfm/test_io/note.txt"));out.println("你好李富民");out.flush();out.close();}
}
  • 注意

要关闭流或者刷新流才能写进去

Properties

  1. 专门用于读写配置文件的集合类
    配置文件的格式:
    键=值
    键值对之间用=号分隔,每行一个键值对
  • 看一个需求
    如下一个配置文件
id = 192.168.0.13
user = root
password = 123456

读取配置文件

import java.io.FileReader;
import java.util.Properties;public class Properties02 {public static void main(String[] args) throws Exception {//使用Properties  类来读取mysql.properties文件//1. 创建Properties 对象Properties properties = new Properties();properties.load(new FileReader("src/mysql.properties"));//2. 加载指定配置文件properties.load(new FileReader("src/mysql.properties"));//3. 把k-v显示控制台properties.list(System.out);//4. 根据key 获取对应的值String user = properties.getProperty("user");System.out.println(user);String password = properties.getProperty("password");System.out.println(password);}
}

对配置文件进行修改

import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;public class Properties03 {public static void main(String[] args) throws IOException {//使用Properties类来创建配置文件, 修改配置内容Properties properties = new Properties();//创建//如果没用键就是创建//有的话就是修改/*Properties 的父类就是HashTablepublic synchronized Object setProperty(String key, String value) {return put(key, value);}public synchronized V put(K key, V value) {// Make sure the value is not nullif (value == null) {throw new NullPointerException();}// Makes sure the key is not already in the hashtable.Entry<?,?> tab[] = table;int hash = key.hashCode();int index = (hash & 0x7FFFFFFF) % tab.length;@SuppressWarnings("unchecked")Entry<K,V> entry = (Entry<K,V>)tab[index];for(; entry != null ; entry = entry.next) {if ((entry.hash == hash) && entry.key.equals(key)) {V old = entry.value;entry.value = value;return old;}}addEntry(hash, key, value, index);return null;}*/properties.setProperty("charset", "utf8");properties.setProperty("user", "汤姆");properties.setProperty("pwd", "888888888");//将k-v存储到文件中properties.store(new FileOutputStream("src/mysql2.properties"), "hello world");System.out.println("保存配置文件成功");}
}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询